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


Gポイントポイ活 Amazon Yahoo 楽天

無料ホームページ 楽天モバイル[UNLIMITが今なら1円] 海外格安航空券 海外旅行保険が無料!