/* poker2.c Function: コンピュータと対戦ポーカー Author: Ken Date: 03/09/05 URL: http://blue.ribbon.to/~kenweb/ mail: kenweb@s8.xrea.com */ #include <stdio.h> #include<time.h> #include<stdlib.h> int yama_card[52]; /*カードの山札とする配列*/ char *card_mark[]={"スペード","ハート","クローバー","ダイヤ"}; /*カードマーク一覧リスト*/ char *pare_list[]={NULL,"ノーペア","ワンペア","ツーペア","スリーカード","ストレート","フラッシュ","フルハウス","フォーカード","ストレートフラッシュ","ロイヤルストレートフラッシュ"}; /*役のリスト*/ typedef struct member { /*各プレイヤーの情報を格納する構造体*/ int card[5]; int win; char *name; int stock[5]; }DATA; void shuffl(void); /*山札にランダムにカードを挿入する関数*/ DATA put(int a,DATA arry); /*手札のカードを山札から取り出す関数*/ void show_card(DATA arry); /*手札のカードを表示する関数*/ DATA cpu_change(DATA arry,int p); /*コンピュータの手札から交換するカードを選ぶ関数*/ DATA sort_card(DATA arry); /*手札のカードを並べ替える関数*/ int pare(DATA arry); /*手札から役を決定する関数*/ int winner(DATA arry1,DATA arry2); /*勝者を決定する関数*/ int main() { int k,n,change,turn=1,point,p,s,x; /*初期設定*/ DATA player[2]; player[0].name="あなた"; player[1].name="CPU"; for(k=0;k<5;k++){ player[0].card[k]=0; player[1].card[k]=0; } system("cls"); printf("**************\n"); printf("ポーカーゲーム\n"); printf("**************\n\n"); shuffl(); for(p=0;p<2;p++){ /*カード配布処理*/ for(k=0;k<5;k++) player[p]=put(k,player[p]); player[p]=sort_card(player[p]); x=pare(player[p]); if (p==0) { show_card(player[0]); printf("役: %s\n",pare_list[x]); } else if (p==1) player[1]=cpu_change(player[1],x); } do { /*カード交換処理*/ printf("\nカードを何枚交換しますか?(0-5)\n"); scanf("%d",&change); } while((change<0)||(change>5)); if(change==5) for(k=0;k<change;k++) (player[0].stock[k])=k+1; else{ printf("\n何番目を交換しますか?(交換したいカードNoをカンマ(,)で区切って指定)\n"); printf("例)No1とNo3とNo5のカードを交換したい場合は 1,3,5 と入力\n"); for(k=0;k<change;k++) scanf("%d,",&(player[0].stock[k])); } for(k=0;k<change;k++) player[0]=put((player[0].stock[k])-1,player[0]); system("cls"); for(k=0;k<2;k++){ /*最終結果表示処理*/ player[k]=sort_card(player[k]); show_card(player[k]); x=pare(player[k]); printf("役: %s\n",pare_list[x]); } winner(player[0],player[1]); printf("\nリターンキーで終了\n"); /*終了処理*/ 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; } } DATA put(int a,DATA arry) /*手札のカードを山札から取り出す関数*/ { int p,tmp,b; tmp=arry.card[a]; arry.card[a]=yama_card[0]; for(b=0;b<52;b++){ yama_card[b]=yama_card[b+1]; if (yama_card[b]==0) {yama_card[b]=tmp; break;} } return arry; } DATA sort_card(DATA arry) /*手札のカードを並べ替える関数*/ { int a,b,w; for(a=0;a<5;a++){ for(b=0;b<4-a;b++){ if((arry.card[b]%13)>(arry.card[b+1]%13)){ w=arry.card[b]; arry.card[b]=arry.card[b+1]; arry.card[b+1]=w; } } } return arry; } void show_card(DATA arry) /*手札のカードを表示する関数*/ { int a,s,t; printf("\n%sの",arry.name); printf("手札\n"); printf("No 数字 マーク\n"); for(a=0;a<5;a++){ s=(arry.card[a])%13+1; t=(arry.card[a])%4; printf("(%d) %d %s\n",a+1,s,card_mark[t]); } } int pare(DATA arry) /*手札から役を決定する関数*/ { int a,b,flash=0,pare=0,straight=0,royal=0; for(a=0;a<5;a++){ if ((arry.card[a]%13+1)==arry.card[a+1]%13) straight++; for(b=a+1;b<5;b++){ if(arry.card[a]%4==arry.card[b]%4) flash++; if((arry.card[a]%13+1)==(arry.card[b]%13+1)) pare++; } } if(((arry.card[4]%13+1==13)&&(arry.card[0]%13+1==1))&&((arry.card[1]%13+1!=2))) { straight++; royal++; } if (((flash==10)&&(straight==4))&&(royal==1)) return(10); if ((flash==10)&&(straight==4)) return(9); if (pare==6) return(8); if (pare==4) return(7); if (flash==10) return(6); if (straight==4) return(5); if (pare==3) return(4); if (pare==2) return(3); if (pare==1) return(2); if (pare==0) return(1); } int winner(DATA arry1,DATA arry2) /*勝者を決定する関数*/ { printf("\n"); if(pare(arry1)>pare(arry2)){ printf("あなたの勝ちです\n"); return 1; } else if (pare(arry1)<pare(arry2)){ printf("あなたの負けです\n"); return 2; } else { printf("引き分けです\n"); return 0; } } DATA cpu_change(DATA arry,int p) /*コンピュータの手札から交換するカードを選ぶ関数*/ { int t; printf("\n%sは",arry.name); if(p>=5){ printf("交換しませんでした。\n"); return arry; } else if(p==4){ printf("2枚交換しました。\n"); if (((arry.card[3]%13)==(arry.card[2]%13))&&((arry.card[4]%13)==(arry.card[2]%13))){ arry=put(0,arry); arry=put(1,arry); } else if (((arry.card[0]%13)==(arry.card[2]%13))&&((arry.card[1]%13)==(arry.card[2]%13))){ arry=put(3,arry); arry=put(4,arry); } else { arry=put(0,arry); arry=put(4,arry); } return arry; } else if(p==3){ printf("1枚交換しました。\n"); if (((arry.card[0]%13)==(arry.card[1]%13))&&((arry.card[4]%13)==(arry.card[3]%13))) arry=put(2,arry); else if (((arry.card[0]%13)!=(arry.card[1]%13))&&((arry.card[4]%13)==(arry.card[3]%13))) arry=put(0,arry); else arry=put(4,arry); return arry; } else if(p==2){ printf("3枚交換しました。\n"); for(t=0;t<4;t++){ if((arry.card[t]%13)==(arry.card[t+1]%13)){ if(t==0){ arry=put(2,arry); arry=put(3,arry); arry=put(4,arry); } else if(t==1){ arry=put(0,arry); arry=put(3,arry); arry=put(4,arry); } else if(t==2){ arry=put(0,arry); arry=put(1,arry); arry=put(4,arry); } else { arry=put(0,arry); arry=put(1,arry); arry=put(2,arry); } } } return arry; } else if(p==1){ printf("全て交換しました。\n"); for(t=0;t<5;t++) arry=put(t,arry); return arry; } }