/*コンピュータとポーカーゲームするプログラム*/
/*ジョーカーはなし*/
#include
#include
#include
/*数値からカードにする関数(定義)*/
void changeCard(int number){
if(number<=12){ //0~12:スペード
printf("スペードの%d,",number+1);
}
else if((13<=number)&&(number<=25)){ //13~25:ダイヤ
printf("ダイヤの%d,",number-12);
}
else if((26<=number)&&(number<=38)){ //26~38:クローバー
printf("クローバーの%d,",number-25);
}
else if((39<=number)&&(number<=51)){ //39~51:ハート
printf("ハートの%d,",number-38);
}
}
/*役かどうかを判断する関数*/
int checkCard(int hand[]){
int a,b,c,d,n; //カウント用変数
int memo,max; //メモ用変数
int pos[5]; //メモ用配列
int num1[5]; //メモ用配列
int x=0; //係数
int i=0; //カウント変数・pit[]専属
int pit[20]; //役を判断するための配列
int point=0; //最終的な役を入力するための変数
/*配列の初期化*/
for(n=0;n<=10;n++){
pit[n]='\0';
}
/*
フラッシュ
aを走査させ、手札の最後まで条件が真ならば得点50を配列に入力
*/
for(a=1;a<=4;a++){
if(hand[0]/13==hand[a]/13){
if(a==4){
pit[i]=50;
i++;
}
}
else{
break;
}
}
/* ストレート
*/
/*初期化作業*/
memo=0;
b=0;
for(n=0;n<=4;n++){
pos[n]='\0';
}
/*手札の中で最も大きいナンバーの添え字を探す*/
for(a=0;a<5;a++){
if((hand[memo]%13)<(hand[a]%13)){
max=a;
}
}
memo=max;
pos[memo]=hand[memo];
/*走査作業を5回繰り返す*/
for(c=0;c<5;c++){
for(a=0;a<=4;a++){
/*hand[memo]から一つ小さい数があれば、その添え字をmemoに入力
*/
if(hand[a]%13==(hand[memo]%13)-1){
memo=a;
pos[a]=hand[a]; //この作業はK~Aのストレートの場合使用
b++; //値を変えた回数を数えておく
break;
}
}
}
/*↑のif文が3回しか繰り返されなかった場合(10~KとAである可能性有)*/
if(3==b){
for(c=0;c<5;c++){
if(('\0'==pos[c])){
if((0==hand[c]%13)&&(12==hand[max]%13)){
pit[i]=45; //k~A
i++;
}else{
break;
}
}
}
}
if(4==b){
pit[i]=40;
i++;
}
/* スリーカード
*/
for(a=0;a<4;a++){
for(b=a+1;b<=4;b++){
for(c=b+1;c<=4;c++){
if((hand[a]%13==hand[b]%13)&&(hand[a]%13==hand[c]%13)){
pit[i]=30;
i++;
}
}
}
}
for(a=0;a<4;a++){
for(b=a+1;b<=4;b++){
if((hand[a]%13)==(hand[b]%13)){ //同じnumberのカードがあるなら
for(c=a+1;c<=4;c++){
for(d=c+1;d<=4;d++){
if((b!=c)&&(b!=d)&&((hand[c]%13)==(hand[d]%13))){
if((hand[a]%13)==(hand[c]%13)){
/*フォーカード*/
pit[i]=70;
i++;
}
else if((hand[a]%13)!=(hand[c]%13)){
/*ツーペア*/
pit[i]=20;
i++;
}
}
}
}
}
}
}
/*ワンペア*/
d=0; //初期化
for(a=0;a<4;a++){
for(b=a+1;b<=4;b++){
if((hand[a]%13)==(hand[b]%13)){
d=0;
for(c=0;c<=i;c++){
if((20!=pit[c])&&(30!=pit[c])&&(70!=pit[c])){
d++;
if(d-1==i){ //全部見たけど一つもなかったら
pit[i]=10;
i++;
}
}
}
}
}
}
/*フルハウス*/
memo=0;
c=0;
for(a=0;a<4;a++){
for(b=a+1;b<=4;b++){
if((hand[a]%13==hand[b]%13)){
c++;
}
}
}
if(c<4){
memo=-1;
}
c=0;
for(a=0;a<=i;a++){
if(70==pit[a]){
c++;
}
}
if(c>0){
memo=-1;
}
if(-1!=memo){
pit[i]=60;
i++;
}
/*ストレートフラッシュ*/
for(a=0;a for(b=a+1;b<=i;b++){
if(((50==pit[a])&&(40==pit[b]))||((40==pit[a])&&(50==pit[b]))){
pit[i]=80;
i++;
}
}
}
/*ロイヤルストレートフラッシュ*/
for(a=0;a for(b=a+1;b if(((45==pit[a])&&(50==pit[b]))||((50==pit[a])&&(45==pit[b]))){
pit[i]=90;
i++;
}
}
}
n=0;
while(n!=i){
if(point<=pit[n]){
point=pit[n];
}
n++;
}
return point;
}
int main(void){
int mount[52]; //最初のデッキ・札の並びはランダム
int user[5]; //プレイヤーの手札
int dealer[5]; //ディーラーの手札
int User,Dealer;
int input[5];
int i,n;
srand((unsigned)time(NULL));
for(i=0;i<=51;i++){
mount[i]=(rand())%52;
/*同じカードがほかにないか確認する*/
for(n=0;n<=i-1;n++){
if((i!=n)&&(mount[i]==mount[n])){
i=i-1;
break;
}
}
}
/*カードを5枚ずつ配る*/
n=0;
for(i=0;i<=4;i++){
user[i]=mount[n];
mount[n]='\0';
n++;
}
for(i=0;i<=4;i++){
dealer[i]=mount[n];
mount[n]='\0';
n++;
}
for(i=0;i<=4;i++){
if((user[i]<0)||(52
return -1;
}else{
changeCard(user[i]); //手札を表示(関数)
}
}
printf("\n入れ替え:1 入れ替えない:0\n");
printf("ex)0,1,0,1,1\n" );
scanf("%d,%d,%d,%d,%d",&input[0],&input[1],&input[2],&input[3],&input[4]); //捨てるカードを入力
/*入れ替え作業*/
for(i=0;i<=4;i++){
if((0!=input[i])&&(1!=input[i])){
printf("Error2\n");
return -1;
}
else {
if(1==input[i]){
user[i]=mount[n];
mount[n]='\0';
n++;
}
}
}
/*勝ち負け判定*/
User=checkCard(user);
Dealer=checkCard(dealer);//配列にアドレスを関数に読ませたい
printf("\n user:");
for(i=0;i<=4;i++){
changeCard(user[i]); //手札を表示(関数)
}
printf("\ndealer:");
for(i=0;i<=4;i++){
changeCard(dealer[i]); //手札を表示(関数)
}
printf("\nu点数%d",User);
printf("\nd点数%d\n",Dealer);
if(User>Dealer){
printf("\nYou win!\n");
}else if(User
}else{
printf("\nEven.\n");
}
return 0;
}
この記事にトラックバックする