/* 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;
}
}