C 扑克游戏,双人、三人和扑克的坏信号
我试着做一个Ditels的问题,C如何编程-第七版“书。书上说我应该处理两张五张牌的牌,看看哪一张更好。我甚至没有做到牌的比较,我有一个很大的问题。 在我给你们的这段代码中,一对、三对、扑克牌、同花顺和直牌的信号都不好。如果有两对牌,它们应该变成2,这只是信号“对”,和1,如果程序找到一对,三类,四类,直的或齐平的。相反,它总是给我一个大于1的数字,即使我将变量设置为等于0、1或2。(请参阅我的代码中的第一个开关函数。) 输出是好的,它正确地告诉我我手里有什么,但增量和等式语句不是,它给了我垃圾。 你能告诉我我做错了什么吗?它是我函数的if{do while}部分还是C 扑克游戏,双人、三人和扑克的坏信号,c,C,我试着做一个Ditels的问题,C如何编程-第七版“书。书上说我应该处理两张五张牌的牌,看看哪一张更好。我甚至没有做到牌的比较,我有一个很大的问题。 在我给你们的这段代码中,一对、三对、扑克牌、同花顺和直牌的信号都不好。如果有两对牌,它们应该变成2,这只是信号“对”,和1,如果程序找到一对,三类,四类,直的或齐平的。相反,它总是给我一个大于1的数字,即使我将变量设置为等于0、1或2。(请参阅我的代码中的第一个开关函数。) 输出是好的,它正确地告诉我我手里有什么,但增量和等式语句不是,它给了我垃圾
#ifndef FUNCTIONS_H
#define FUNCTIONS_H
#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#define SUITS 4
#define FACES 13
#define CARDS 52
void deal( unsigned int wDeck[][ FACES ], const char *wFace[],const char *wSuit[], char hand[6][150] ){
size_t row;
size_t column;
size_t card;
for ( card = 0; card <= 5; ++card ) {
for ( row = 0; row < SUITS; ++row ) {
for ( column = 0; column < FACES; ++column ) {
if ( wDeck[ row ][ column ] == card ) {
strcat(hand[card],wFace[column]);
strcat(hand[card]," ");
strcat(hand[card],wSuit[row]);
}
}
}
}
}
void shuffle( unsigned int wDeck[][ FACES ] ) {
size_t row;
size_t column;
size_t card;
for ( card = 1; card <= CARDS; ++card ) {
do {
row = rand() % SUITS;
column = rand() % FACES;
} while( wDeck[ row ][ column ] != 0 );
wDeck[ row ][ column ] = card;
}
}
int fixNshow (char hand[6][150], char handFIXED[5][150]){
char faces[5][20];
char suits[5][20];
char *token;
for(int i=0; i<5; i++){
strcpy(handFIXED[i],hand[i+1]);
}
for(int i=0; i<5; i++){
printf("%s\n",handFIXED[i]);
}
for(int i=0; i<5; i++){
token=strtok(handFIXED[i]," ");
if(token!=NULL){
strcpy(faces[i],token);
token=strtok(NULL," ");
if(token!=NULL){
strcpy(suits[i],token);
}
}
}
printf("\n");
//Evaluating the hand.
int pair=0;
int three=0;
int poker=0;
int flush=0;
int straight=0;
int no=0;
int tokentwo=0;
int pass=2;
int j=1;
int g=1;
char faceatm[5][20],suitatm[20];
int hardness[4];
int swap=0;
int temp=0;
int totalpoints=0;
int highcard=0;
//Pairs, tripples, pokers, two pairs
for(int i=0; i<5; i++){
j=i+1;
g=i;
no=0;
strcpy(faceatm[i],faces[i]);
if(i>0){ //THIS
do{ //WHOLE
pass=strcmp(faceatm[i],faceatm[g-1]);//PART RESOLVES
g--; //DUPLICATE
if (pass==0){ //APPEARANCE
break; //OF
} //MATCHES
}while(g>0); //EXAMPLE
} //JACK
if (pass==0){ //JACK JACK
continue; //TEN, QUEEN
} //SIGNALS THAT ARE EQUAL TO 1 ARE: TRIPPLE,PAIR. THIS PREVENTS IT.
if(j<5){
do{
tokentwo=strcmp(faceatm[i],faces[j]);
if(tokentwo==0){
no++;
printf("ITERATION NUMBER %d, NO=%d\n",i,no);
}
j++;
}while(j<5);
}
switch(no){
case 1: printf("Pair of %ss\n",faceatm[i]); pair++; break;
case 2: printf("Three of %ss\n",faceatm[i]); three++; break;
case 3: printf("Poker of %ss\n",faceatm[i]); poker++; break;
}
}
//Flush catcher
strcpy(suitatm,suits[0]);
do{
tokentwo=strcmp(suitatm,suits[j]);
if(tokentwo==0){
no++;
}
j++;
}while(j<5);
if(no==4){
printf("FLUSH OF %s",suitatm);
flush++;
}
//Straight catcher
for(int i=0; i<5; i++){
if(strcmp("Ace",faces[i])==0){
hardness[i]=1;
}
else if(strcmp("Deuce",faces[i])==0){
hardness[i]=2;
}
else if(strcmp("Three",faces[i])==0){
hardness[i]=3;
}
else if(strcmp("Four",faces[i])==0){
hardness[i]=4;
}
else if(strcmp("Five",faces[i])==0){
hardness[i]=5;
}
else if(strcmp("Six",faces[i])==0){
hardness[i]=6;
}
else if(strcmp("Seven",faces[i])==0){
hardness[i]=7;
}
else if(strcmp("Eight",faces[i])==0){
hardness[i]=8;
}
else if(strcmp("Nine",faces[i])==0){
hardness[i]=9;
}
else if(strcmp("Ten",faces[i])==0){
hardness[i]=10;
}
else if(strcmp("Jack",faces[i])==0){
hardness[i]=11;
}
else if(strcmp("Queen",faces[i])==0){
hardness[i]=12;
}
else if(strcmp("King",faces[i])==0){
hardness[i]=13;
}
}
for(int i=0; i<5; i++){
for(int j=0; j<5; j++){
if(hardness[i]>hardness[i+1]){
swap=hardness[i];
hardness[i]=hardness[i+1];
hardness[i+1]=swap;
}
}
}
if(hardness[0]==hardness[1]-1==hardness[2]-2==hardness[3]-3==hardness[4]-4){
straight++;
}
//End of hand evaluation
//Points
highcard=hardness[4];
if(pair==0 && three==0 && poker==0 && straight==0 && flush==0){totalpoints=highcard;}
else if(pair==1 && three==0 && poker==0 && straight==0 && flush==0){totalpoints=14;}
else if(pair==2 && three==0 && poker==0 && straight==0 && flush==0){totalpoints=15;}
else if(pair==0 && three==1 && poker==0 && straight==0 && flush==0){totalpoints=16;}
else if(pair==0 && three==0 && poker==0 && straight==1 && flush==0){totalpoints=17;}
else if(pair==0 && three==0 && poker==0 && straight==0 && flush==1){totalpoints=18;}
else if(pair==1 && three==1 && poker==0 && straight==0 && flush==0){totalpoints=19;}
else if(pair==0 && three==0 && poker==1 && straight==0 && flush==0){totalpoints=20;}
else if(pair==0 && three==0 && poker==0 && straight==1 && flush==1){
if(hardness[0]==1 && hardness[1]==10 && hardness[2]==11 && hardness[3]==12 && hardness[4]==13){
totalpoints=22;
}
else {
totalpoints=21;
}
}
return totalpoints;
}
#endif
所以,当我运行游戏时,我的输出是:
Ace Diamonds
Five Clubs
Five Spades
Jack Spades
Five Hearts
ITERATION NUMBER 1, NO=1
ITERATION NUMBER 1, NO=2
Three of Fives
HAND STRONGNESS: 19
RUN SUCCESSFUL (total time: 347ms)
它给了我一个很好的关于我手上有什么的信息,但是这只手的力量绝对不是好的。这意味着我的配对信号是1,它不应该是
我做错了什么 乍一看,可能与您的问题无关:看起来好像您实现了标题
functions.h
中的扑克功能。在这个简单的程序中,这并不重要,但是头应该只将接口(即函数原型、类型和结构定义)导出到function.c
中的实现中。此外,如果(a==b==c==d)
没有按照您的想法执行。您必须将这种比较与逻辑运算符&&
和|
链接起来:如果(a==b&&a==c&&a==d).
(打开警告时很容易发现这种错误。)一对、三对、扑克牌的信号,flush和straight不好不是一个特别的描述性诊断,它不能告诉我们您已经尝试了什么,以便自己调试。(此外,没有像“扑克牌”这样的牌手等级……也许你这里指的是四种牌手?)奇怪的强项可能来自fixNshow
中未初始化的totalpoints
。您的案例都不匹配,因此它不会被合理的值覆盖,您会得到垃圾。将卡片套装和等级表示为字符串也不是一个好主意。更好的方法是将卡片表示为两个枚举的结构(一个用于排名,一个用于套装),然后创建打印卡片的打印函数。等级的枚举将直接映射到一个值(除了ace可能是最低或最高的,但无论如何都必须在上下文中确定)。乍一看,这可能与您的问题无关:看起来好像您在标题functions.h
中实现了扑克功能。在这个简单的程序中,这并不重要,但是头应该只将接口(即函数原型、类型和结构定义)导出到function.c
中的实现中。此外,如果(a==b==c==d)
没有按照您的想法执行。您必须将这种比较与逻辑运算符&&
和|
链接起来:如果(a==b&&a==c&&a==d).
(打开警告时很容易发现这种错误。)一对、三对、扑克牌的信号,flush和straight不好不是一个特别的描述性诊断,它不能告诉我们您已经尝试了什么,以便自己调试。(此外,没有像“扑克牌”这样的牌手等级……也许你这里指的是四种牌手?)奇怪的强项可能来自fixNshow
中未初始化的totalpoints
。您的案例都不匹配,因此它不会被合理的值覆盖,您会得到垃圾。将卡片套装和等级表示为字符串也不是一个好主意。更好的方法是将卡片表示为两个枚举的结构(一个用于排名,一个用于套装),然后创建打印卡片的打印函数。列组的枚举将直接映射到一个值(ace可能是最低或最高的,但无论如何必须在上下文中确定除外)
Ace Diamonds
Five Clubs
Five Spades
Jack Spades
Five Hearts
ITERATION NUMBER 1, NO=1
ITERATION NUMBER 1, NO=2
Three of Fives
HAND STRONGNESS: 19
RUN SUCCESSFUL (total time: 347ms)