我正在用 C 制作一个简单的井字游戏,它在第一次输入后结束



我有这个问题,不知道出了什么问题。该代码没有任何错误或警告,但它始终将checkVictory函数的第一个if语句视为正确的。

我试着将我的代码与另一个实际工作的代码进行比较,它看起来与我完全相同。我很确定错误是在checkVictory函数中,因为我使用了一个名为flag的变量来检查函数的每个if语句,而我的returnValue(用作我游戏状态的指标(总是由第一个if触发。

这是我的代码。。。(很抱歉出现缩进,这是我第一次使用网站(

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
void board();
void markBoard(char mark);
int checkVictory();
int player, choice, flag;
char list[10] = {'-', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
void main() {
int gameStatus;
char mark;
player = 1;
do{
board();
// change turns
player = (player % 2) ? 1 : 2;
//input
printf("Player %d, enter a number: ", player);
scanf("%i", &choice);
// set the correct character based on player turn
mark = (player == 1) ? 'X' : 'O';
markBoard(mark);

gameStatus = checkVictory();

player++; 
} while (gameStatus == -1);
if (gameStatus == 1) {
printf("Player %d WIN", --player);
printf("nflag: %i", flag);
}
else{
printf("Draw");
}
}
void board() {
system("cls"); 
printf("nnt   tic tac toenn");
printf("Player 1 (X)    -    Player 2 (O)nn");
printf("     |     |     n");
printf("  %c  |  %c  |  %c  n", list[1], list[2], list[3]);
printf("_____|_____|_____n");
printf("     |     |     n");
printf("  %c  |  %c  |  %c  n", list[4], list[5], list[6]);
printf("_____|_____|_____n");
printf("     |     |     n");
printf("  %c  |  %c  |  %c  n", list[7], list[8], list[9]);
printf("     |     |     n");
printf("n");
}
void markBoard(char mark) {
if (choice == 1 && list[1] == '1')
list[1] = mark;
else if (choice == 2 && list[2] == '2')
list[2] = mark;
else if (choice == 3 && list[3] == '3')
list[3] = mark;
else if (choice == 4 && list[4] == '4')
list[4] = mark;
else if (choice == 5 && list[5] == '5')
list[5] = mark;
else if (choice == 6 && list[6] == '6')
list[6] = mark;
else if (choice == 7 && list[7] == '7')
list[7] = mark;
else if (choice == 8 && list[8] == '8')
list[8] = mark;
else if (choice == 9 && list[9] == '9')
list[9] = mark;
else {
printf("Invalid moven");
player--;
getch();
}
}
/*********************************************FUNCTION TO RETURN GAME STATUS1 FOR GAME IS OVER WITH RESULT-1 FOR GAME IS IN PROGRESSO GAME IS OVER AND NO RESULT**********************************************/
int checkVictory() {
int returnValue = 0;
if (list[1] && list[2] == list[2] && list[3]) {
returnValue = 1;
flag = 1;
}
else if (list[4] && list[5] == list[5] && list[6]) {
returnValue = 1;
flag = 2;
}
else if (list[7] && list[8] == list[8] && list[9]) {
returnValue = 1;
flag = 3;
}
else if (list[1] && list[4] == list[4] && list[7]) {
returnValue = 1;
flag = 4;
}
else if (list[2] && list[5] == list[5] && list[8]) {
returnValue = 1;
flag = 5;
}
else if (list[3] && list[6] == list[6] && list[9]) {
returnValue = 1;
flag = 6;
}
else if (list[1] && list[5] == list[5] && list[9]) {
returnValue = 1;
flag = 7;
}
else if (list[3] && list[5] == list[5] && list[7]) {
returnValue = 1;
flag = 8;
}
else if (list[1] != '1' && list[2] != '2' && list[3] != '3' &&
list[4] != '4' && list[5] != '5' && list[6] != '6' && 
list[7] != '7' && list[8] != '8' && list[9] != '9') {
returnValue = 0;
}
else
returnValue = -1;
return returnValue;
}

问题在于下面的代码。

if (list[1] && list[2] == list[2] && list[3]) {
returnValue = 1;

您的状况:

list[1] && list[2] == list[2] && list[3]

解析为:

list[1] && (list[2] == list[2]) && list[3]

因为list的元素都不是0,所以它们都测试为true。同样,list[2]始终等于其自身。因此,这个条件总是成立的。checkVictory将始终返回1。当调用此函数,并且gameSttatus设置为1时,do-while循环结束。

相关内容

  • 没有找到相关文章

最新更新