宣布tic tac趾板冠军
我为一个tic-tac-toe问题编写了一个代码,在这个问题中,您将数字输入数组,然后电路板将被打印出来。还有一个函数声明赢家,但似乎不起作用,该函数应该声明任何大小的tic-tac趾板的赢家(现在是5x5) 我用它做了一个双for循环,检查数组中的字符是否与它旁边的字符相同,因此它沿着行移动,还有一个用于列,一个是对角线,另一个是对角线。出于某种原因,它没有显示任何赢家,总是没有赢家出现。感谢您的帮助宣布tic tac趾板冠军,c,C,我为一个tic-tac-toe问题编写了一个代码,在这个问题中,您将数字输入数组,然后电路板将被打印出来。还有一个函数声明赢家,但似乎不起作用,该函数应该声明任何大小的tic-tac趾板的赢家(现在是5x5) 我用它做了一个双for循环,检查数组中的字符是否与它旁边的字符相同,因此它沿着行移动,还有一个用于列,一个是对角线,另一个是对角线。出于某种原因,它没有显示任何赢家,总是没有赢家出现。感谢您的帮助 #include <stdio.h> #define TRUE 1 #defi
#include <stdio.h>
#define TRUE 1
#define FALSE 0
#define SIZE 3
#define NONE -1
#define NOUGHTS 0
#define CROSSES 1
#define EMPTY 2
void scanBoard(int board[SIZE][SIZE]);
void printBoard(int board[SIZE][SIZE]);
int getWinner(int board[SIZE][SIZE]);
int main( void ){
int board[SIZE][SIZE];
int winner;
printf("Please enter the board:\n");
scanBoard( board );
printf("Here is the board:\n");
printBoard( board );
printf("The winner is: ");
winner = getWinner(board);
if(winner == CROSSES){
printf("Crosses");
}
else if(winner == NOUGHTS){
printf("Noughts");
}
else{
printf("No one");
}
return 0;
}
void scanBoard(int board[SIZE][SIZE]){
int i;
int j;
for(i=0; i<SIZE; i++){
for(j=0; j<SIZE; j++){
scanf("%d", &board[i][j]);
}
}
}
void printBoard(int board[SIZE][SIZE]){
int i;
int j;
for(i=0; i<SIZE; i++){
for(j=0; j<SIZE; j++){
if(board[i][j] == EMPTY){
printf(". ");
}
else if(board[i][j] == CROSSES){
printf("X ");
}
else if(board[i][j] == NOUGHTS){
printf("O ");
}
}
printf("\n");
}
}
int getWinner(int board[SIZE][SIZE]){
int i;
int j;
int check;
int winner;
for(i=0; i<SIZE; i++){
for(j=0; j<SIZE-1 && check == TRUE; j++){
if(board[i][j] != board[i][j+1]){
check = FALSE;
}
}
if(check == TRUE && j == SIZE-1){
winner=board[i][0];
}
}
for(j=0; j<SIZE; j++){
for(i=0; i<SIZE-1 && check == TRUE; i++){
if(board[i][j] != board[i+1][j]){
check = FALSE;
}
}
if(check == TRUE && i == SIZE-1){
winner=board[0][j];
}
}
for(i=0; i<SIZE-1 && check == TRUE; i++){
if(board[i][i] != board[i+1][i+1]){
check = FALSE;
}
if(check == TRUE && i == SIZE-1){
winner=(board[i][i]);
}
}
for(i=SIZE; i>0 && check == TRUE; i--){
if( board[i][i] != board[i-1][i-1])
check = FALSE;
}
if(check == TRUE && i == SIZE-1){
winner=(board[i][i]);
}
return winner;
}
#包括
#定义真1
#定义FALSE 0
#定义尺寸3
#定义无-1
#定义零0
#定义交叉点1
#定义空2
空心扫描板(内板[尺寸][尺寸]);
空白印刷板(内板[尺寸][尺寸]);
int getWinner(int board[SIZE][SIZE]);
内部主(空){
集成电路板[尺寸][尺寸];
int优胜者;
printf(“请输入板:\n”);
扫描板;
printf(“这是电路板:\n”);
印刷板;
printf(“获胜者是:”);
赢家=获得赢家(董事会);
如果(获胜者==交叉){
printf(“交叉”);
}
否则如果(获胜者==零){
printf(“零”);
}
否则{
printf(“无人”);
}
返回0;
}
空心扫描板(内板[尺寸][尺寸]){
int i;
int j;
对于(i=0;i我没有完全检查您的检查逻辑,但这里直接在getWinner
中,您触发了未定义的行为:
for(j=0; j<SIZE-1 && check == TRUE; j++){
for(j=0;j我没有完全检查您的检查逻辑,但是在这里直接在getWinner
中,您触发了未定义的行为:
for(j=0; j<SIZE-1 && check == TRUE; j++){
for(j=0;j正如Giorgi所指出的,在开始测试其值之前,您必须初始化检查
。您还需要在getWinner()开始时将winner
初始化为空
函数,否则如果没有赢家,您的函数将返回一些不可预测的垃圾值,并且您的main()
函数可能会打印出错误的结果
int getWinner(int board[SIZE][SIZE]){
int i;
int j;
int check;
int winner=EMPTY /* <<< */;
for(i=0; i<SIZE; i++){
for(j=0, check=TRUE /* <<< */; j<SIZE-1 && check == TRUE; j++){
if(board[i][j] != board[i][j+1]){
check = FALSE;
}
}
if(check == TRUE && j == SIZE-1){
winner=board[i][0];
}
}
for(j=0; j<SIZE; j++){
for(i=0, check=TRUE /* <<< */; i<SIZE-1 && check == TRUE; i++){
if(board[i][j] != board[i+1][j]){
/** etc... **/
int-getWinner(int-board[SIZE][SIZE]){
int i;
int j;
整数检查;
int winner=EMPTY/*正如Giorgi所指出的,在开始测试其值之前,您必须初始化check
。您还需要在getWinner()开始时将winner
初始化为EMPTY
函数,否则如果没有赢家,您的函数将返回一些不可预测的垃圾值,并且您的main()
函数可能会打印出错误的结果
int getWinner(int board[SIZE][SIZE]){
int i;
int j;
int check;
int winner=EMPTY /* <<< */;
for(i=0; i<SIZE; i++){
for(j=0, check=TRUE /* <<< */; j<SIZE-1 && check == TRUE; j++){
if(board[i][j] != board[i][j+1]){
check = FALSE;
}
}
if(check == TRUE && j == SIZE-1){
winner=board[i][0];
}
}
for(j=0; j<SIZE; j++){
for(i=0, check=TRUE /* <<< */; i<SIZE-1 && check == TRUE; i++){
if(board[i][j] != board[i+1][j]){
/** etc... **/
int-getWinner(int-board[SIZE][SIZE]){
int i;
int j;
整数检查;
int winner=EMPTY/*感谢您的帮助,在第二个for循环工作之前,它似乎是初始化check=true。我现在要查看对角线,但我想我现在得到了。感谢您的帮助,在第二个for循环工作之前,它似乎是初始化check=true。我现在要查看对角线,但我想我现在得到了。谢谢s、 只需要多做一点检查就行了。1)感谢您发布了真正干净编译的代码。2)为了便于我们人类阅读/理解代码,请始终缩进。建议在每个左大括号“{”后加4个空格,在每个右大括号“}前取消缩进'切勿使用制表符,因为每个文字处理器/编辑器的制表位/制表符宽度设置都不同。注意:4个空格足够宽,因此使用可变宽度字体时缩进仍然可见。类似于:check==TRUE
的比较几乎总是一个坏主意。(在这种情况下,我们知道TRUE等于什么)通常情况下,任何不是0的都是真的。所以通常最好说这样的话:if(check)
或if(check!=FALSE)
谢谢,只是需要额外的一点,让check=TRUE就行了。1)感谢您发布的代码确实编译得很干净。2)为了便于我们人类阅读/理解代码,请始终缩进。建议在每个左大括号“{”后使用4个空格,在每个右大括号“}前取消缩进'切勿使用制表符,因为每个文字处理器/编辑器的制表位/制表符宽度设置都不同。注意:4个空格足够宽,因此使用可变宽度字体时缩进仍然可见。类似于:check==TRUE
的比较几乎总是一个坏主意。(在这种情况下,我们知道TRUE等于什么)通常,任何不是0的都是真的。所以通常最好说这样的话:if(check)
或if(check!=FALSE)