/* poker.c Function: ポーカーゲーム ver0.2 Author: Ken Date: 03/08/22 URL: http://blue.ribbon.to/~kenweb/ mail: kenweb@s8.xrea.com */ #include <stdio.h> #include <time.h> #include <stdlib.h> int yama_card[52]; /*山札を格納する配列*/ int coin=100,bed; int my_card[5]; /*手札を格納する配列*/ char *card_mark[]={"スペード","ハート","クローバー","ダイヤ"}; /*カードマーク一覧リスト*/ void shuffl(void); /*山札にランダムにカードを挿入する関数*/ void put(int a,int *arry); /*手札のカードを山札から取り出す関数*/ void show_card(int *arry); /*手札のカードを表示する関数*/ int pare(int *arry); /*手札から役を決定する関数*/ int score(int a,int b); /*手札の役から得点を計算する関数*/ int file_load(void); /*ファイルからコインの枚数を読み込む関数*/ int file_save(int a); /*ファイルにコインの枚数を保存する関数*/ int main() { int k,n,change,s[5]={0,0,0,0,0},turn=1,point,p; coin=file_load(); while(turn!=2){ shuffl(); system("cls"); printf("**************\n"); printf("ポーカーゲーム\n"); printf("**************\n\n"); printf("コイン数: %d枚\n\n",coin); do { /*賭け金設定処理*/ p=coin; printf("コインを何枚掛けますか?(1-%d)\n",coin); scanf("%d",&bed); p=p-bed; if(p<0) printf("残りコイン数が赤字です\n"); if(bed==0) printf("賭けになりません\n"); } while(p<0||bed==0); coin=p; system("cls"); for(k=0;k<5;k++) put(k,my_card); /*カード配布処理*/ show_card(my_card); pare(my_card); do { /*カード交換処理*/ printf("\nカードを何枚交換しますか?(0-5)\n"); scanf("%d",&change); } while((change<0)||(change>5)); if(change==5) for(k=0;k<change;k++) s[k]=k+1; else{ printf("\n何番目を交換しますか?(交換したいカードNoをカンマ(,)で区切って指定)\n"); printf("例)No1とNo3とNo5のカードを交換したい場合は 1,3,5 と入力\n"); for(k=0;k<change;k++) scanf("%d,",&s[k]); } for(k=0;k<change;k++) put(s[k]-1,my_card); system("cls"); show_card(my_card); point=pare(my_card); /*カードから役を決定し、得点を計算する処理*/ coin = coin + score(point,bed); printf("\n結果: 残り%d枚\n",coin); if(coin>0) { /*終了処理*/ printf("もう一度やりますか?(yes:1/No:2)\n"); scanf("%d",&turn); } else if (coin<=0) {printf("ゲームオーバーです。さようなら\n"); break;} } printf("リターンキーで終了\n"); file_save(coin); getchar(); getchar(); } void shuffl(void) /*山札にランダムにカードを挿入する関数*/ { int n,a,p,flg=0; srand((unsigned)time(NULL)); for(n=0;n<52;n++){ while(flg==0){ a=rand()%52+1; for(p=0;p<=n;p++){ if(yama_card[p]!=a) flg=1; else {flg=0; break;} } } flg=0; yama_card[n]=a; } } void put(int a,int *arry) /*手札のカードを山札から取り出す関数*/ { int p,tmp; tmp=arry[a]; arry[a]=yama_card[0]; for(a=0;a<52;a++){ yama_card[a]=yama_card[a+1]; if (yama_card[a]==0) {yama_card[a]=tmp; break;} } } void show_card(int *arry) /*手札のカードを表示する関数*/ { int a,s,t,b,w; for(a=0;a<5;a++){ for(b=0;b<4-a;b++){ if(arry[b]%13>arry[b+1]%13){ w=arry[b]; arry[b]=arry[b+1]; arry[b+1]=w; } } } printf("コイン数: %d枚\n",coin); printf("賭け枚数: %d枚\n",bed); printf("\n手札\n"); printf("No 数字 マーク\n"); for(a=0;a<5;a++){ s=arry[a]%13+1; t=arry[a]%4; printf("(%d) %d %s\n",a+1,s,card_mark[t]); } } int pare(int *arry) /*手札から役を決定する関数*/ { int a,b,flash=0,pare=0,straight=0,royal=0; for(a=0;a<5;a++){ if ((arry[a]%13+1)==arry[a+1]%13) straight++; for(b=a+1;b<5;b++){ if(arry[a]%4==arry[b]%4) flash++; if((arry[a]%13+1)==(arry[b]%13+1)) pare++; } } if(((arry[4]%13+1==13)&&(arry[0]%13+1==1))&&((arry[1]%13+1!=2))) { straight++; royal++; } printf("\n役: "); if (((flash==10)&&(straight==4))&&(royal==1)) {printf("ロイヤルストレートフラッシュ\n"); return(10);} if ((flash==10)&&(straight==4)) {printf("ストレートフラッシュ\n"); return(9);} if (pare==6) {printf("フォーカード\n"); return(8);} if (pare==4) {printf("フルハウス\n"); return(7);} if (flash==10) {printf("フラッシュ\n"); return(6);} if (straight==4) {printf("ストレート\n"); return(5);} if (pare==3) {printf("スリーカード\n"); return(4);} if (pare==2) {printf("ツーペア\n"); return(3);} if (pare==1) {printf("ワンペア\n"); return(2);} if (pare==0) {printf("ノーペア\n"); return(1);} } int score (int a,int b) /*手札の役から得点を計算する関数*/ { int point; if (a==1) return(0); else if (a==2) { printf("+%d枚\n",b); return(b); } else{ point=a*b; printf("+%d枚\n",point); return (point); } } int file_load(void) /*ファイルからコインの枚数を読み込む関数*/ { FILE *fp; int key; if((fp=fopen("data.txt","r"))==NULL) return(100); else { fscanf(fp,"%d",&key); if(key<=0) return(100); fclose(fp); return(key); } } int file_save(int a) /*ファイルにコインの枚数を保存する関数*/ { FILE *fp; if((fp=fopen("data.txt","w+"))==NULL) { fprintf(stderr,"保存できませんでした\n"); return(0); } else if(a<=0) fprintf(fp,"%d\n",100); else fprintf(fp,"%d\n",a); fclose(fp); return(1); }