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

テレワークならECナビ Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!
無料ホームページ 無料のクレジットカード 海外格安航空券 海外旅行保険が無料! 海外ホテル