这是我在stackoverflow上的第一篇文章。我对我的课程有所了解,而我的老师并不知道发生了什么,他建议请求stackoverflow(你应该得到他的薪水)。 嗯,这是我的代码:
#include <stdio.h>
#define MAX_X 3
#define MAX_Y 3
#define SYMBOL_X "X"
#define SYMBOL_Y "Y"
#define SYMBOL_EMPTY -1
#define FALSE 0
#define TRUE 1
void printBoard(int board[MAX_X][MAX_Y]){
printf("\n");
printf("%d\t%d\t%d\n",board[0][0],board[1][0],board[2][0]);
printf("\n");
printf("%d\t%d\t%d\n",board[0][1],board[1][1],board[2][1]);
printf("\n");
printf("%d\t%d\t%d\n",board[0][2],board[1][2],board[2][2]);
printf("\n");
}
void fillboard(int board[MAX_X][MAX_Y]){
int i,j;
for (i = 0; i < MAX_Y; ++i){
for (j = 0; j < MAX_X; ++j){
board[j][i]=SYMBOL_EMPTY;
}
}
}
int findEmptyBox(int board[MAX_X][MAX_Y])
{
int i,j;
for (i = 0; i < MAX_Y; ++i){
for (j = 0; j < MAX_X; ++j){
if(board[j][i]=SYMBOL_EMPTY)return FALSE;
}
}
return TRUE;
}
int checkBoxIntroduced(int x,int y){
if((x!=0 && x!=1 && x!=2) || (y!=0 && y!=1 && y!=2)){
printf("Alguna de las casillas no ha sido introducida correctamente\n");
return FALSE;
}
return TRUE;
}
void introducirFichaConDialogos(int board[MAX_X][MAX_Y],int player){
int x,y;
do{
printf("Introduce la posicion X: \n");
scanf("%d",&x);
printf("Introduce la posicion Y: \n");
scanf("%d",&y);
}while(!checkBoxIntroduced(x,y));
if(player==0)board[x][y]=1;
else board[x][y]=2;
}
void checkPlayer(int *pplayer){
if(*pplayer==1)*pplayer=0;
else *pplayer=1;
}
void main(){
int x=0,y=0,board[MAX_X][MAX_Y],i,j,player=0;
fillboard(board);
do{
system("clear");
printBoard(board);
introducirFichaConDialogos(board,player);
checkPlayer(&player);
}while(!findEmptyBox(board));
}
我的问题是只有棋盘[0] [0]没有保存符号而我和我的老师不知道发生了什么,为什么只有0 0位置。 感谢您的帮助,如果有人有意见,我将不胜感激。
答案 0 :(得分:4)
数组确实将值保存在
中if(board[j][i]=SYMBOL_EMPTY)return FALSE;
且只有board[0][0]
受到影响,因为SYMBOL_EMPTY
非零,因此控件将从函数返回。
你的意思是比较而不是作业吗? e.g。
if(board[j][i]==SYMBOL_EMPTY)return FALSE;
答案 1 :(得分:1)
gcc在编译此代码时会引发很多警告:
[fbgo448@n9dvap997]~/prototypes/board: gcc -o board -std=c99 -pedantic -Wall board.c
board.c: In function âfindEmptyBoxâ:
board.c:33: warning: suggest parentheses around assignment used as truth value
board.c: At top level:
board.c:60: warning: return type of âmainâ is not âintâ
board.c: In function âmainâ:
board.c:64: warning: implicit declaration of function âsystemâ
board.c:61: warning: unused variable âjâ
board.c:61: warning: unused variable âiâ
board.c:61: warning: unused variable âyâ
board.c:61: warning: unused variable âxâ
第一个警告是抱怨以下内容:
if(board[j][i]=SYMBOL_EMPTY)return FALSE;
您将 SYMBOL_EMPTY
分配给board[j][i]
,而不是将分配给彼此。由于SYMBOL_EMPTY
非零,因此赋值表达式的值不为零,因此函数会立即返回FALSE
。
将其更改为
if(board[j][i] == SYMBOL_EMPTY) return FALSE;
你可以分配到0,0。
与常量表达式进行比较时的常见做法是将常量放在==
运算符的左侧,如下所示:
if ( SYMBOL_EMPTY == board[i][j] )
这样,如果您不小心编写=
而不是==
,编译器将捕获它并发出诊断(常量表达式不能是赋值语句的目标)。当两个操作数都是变量时,这并没有帮助,而且我自己从未以这种方式编写比较,但它可能会有所帮助。
下一个警告是抱怨
void main()
main
返回int
,而不是void
;将其更改为
int main( void )
虽然这不是您的主要问题(=
而不是==
),但您需要修复此问题。有些奇怪的平台会阻塞使用void main()
的程序。
您还希望包含stdlib.h
以摆脱功能系统的隐含声明&#34;警告。
你也应该摆脱任何未使用的变量,但这并不重要,而不是你现在面临的问题。
答案 2 :(得分:0)
比较表达式应该这样写:
const int VAR = 0;
int main(void) {
if(VAR==3) return 1;
return 0;
}
因此,如果您忘记了一个=
,则会收到编译错误:
prog.c: In function 'main':
prog.c:6:9: error: assignment of read-only variable 'VAR'
if(VAR =3) return 1;