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