我正在尝试使用[7] [3]
的数组创建一个tic-tac-toe板想法是输入' |'在
[0][0] , [0][2] , [0][4] , [0][6]
[1][0] , [1][2] , [1][4] , [1][6]
[2][0] , [2][2] , [2][4] , [2][6]
和'空白空间' (' X'和' O的变量字符XO
[0][1] , [0][3] , [0][5]
[1][1] , [1][3] , [1][5]
[2][1] , [2][3] , [2][5]
这是代码:
#include <stdio.h>
char drawBoard()
{
char board[7][3], XO;
int rows, columns;
/*
0 * 2 = 0
1 * 2 = 2
2 * 2 = 4
3 * 2 = 6
0 * 2 + 1 = 1
1 * 2 + 1 = 3
2 * 2 + 1 = 5
*/
for ( rows = 0 ; rows < 3 ; rows++ )
for ( columns = 0 ; columns < 7 ; columns++ )
board[ rows ][ columns * 2 ] = '|';
for ( rows = 0 ; rows < 3 ; rows++ )
for ( columns = 0 ; columns < 6 ; columns++ )
board[ rows ][ columns *2 + 1 ] = XO;
for ( rows = 0 ; rows < 3 ; rows++ )
{
for ( columns = 0 ; columns < 7 ; columns++ )
{
printf( "%d ", board[rows][columns] );
}
printf("\n\n");
}
}/* end function drawboard */
int main()
{
drawBoard();
}/* end main */
当我运行程序时,输出都是数字,这很好,是灾难性的。
我很清楚我没有为变量指定任何输入&#39; XO&#39;但是不应该&#39; |&#39;至少打印:(?
答案 0 :(得分:4)
代码问题:
您对2d数组的声明是错误的。第一个括号应包含行数和第二个括号 - 列数。 (你的代码中有它倒退)
而不是做board[ rows ][ columns * 2 ] = '|';
..将循环计数器递增2更简单(参见我的代码)
要打印字符,请选择%c
描述符而不是%d
最后不是一个大问题,但在主要做回报是好习惯
对不起您的代码的另一个大问题。你将drawBoard函数声明为char
..但是你没有从它返回任何char
..(如果你打开-Wall标志,编译器会抱怨)..将它改为{{ 1}}而不是
以下是修正代码:( 查看代码中的注释以了解代码问题)
同样现在我用'X'填充数组..你可以改变它以满足你的需要
void
<强>输出强>
#include <stdio.h>
void drawBoard()
{
char board[3][7], XO; // you were declaring your array wrong .. it rows in first bracket and columns in 2nd bracket
int rows, columns;
for ( rows = 0 ; rows < 3 ; rows++ ){
for ( columns = 0 ; columns < 7 ; columns=columns+2 ){ // to fill every second elemnt of the array .. just increment the counter by 2
board[ rows ][ columns ] = '|';
}
}
for ( rows = 0 ; rows < 3 ; rows++ ){
for ( columns = 1 ; columns < 7 ; columns = columns+2 ){
board[ rows ][ columns ] = 'X';
}
}
for ( rows = 0 ; rows < 3 ; rows++ )
{
for ( columns = 0 ; columns < 7 ; columns++ )
{
printf( "%c", board[rows][columns] ); // its supposed to be %c as you are printing a character
}
printf("\n");
}
}/* end function drawboard */
int main()
{
drawBoard();
return 0;
}
<强> -------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------- 强>
我对游戏的解释(根据Maxime的建议稍加编辑)
Sukhvir@Sukhvir-PC ~
$ gcc -Werror -g -o test test.c
Sukhvir@Sukhvir-PC ~
$ ./test
|X|X|X|
|X|X|X|
|X|X|X|
输出(停止以保持简短..但你明白了)
#include <stdio.h>
void drawBoard(char board[][3])
{
int rows, columns;
for ( rows = 0 ; rows < 3 ; rows++ )
{
for ( columns = 0 ; columns < 3 ; columns++ )
{
if(board[rows][columns]){
printf( "|%c", board[rows][columns] );
}else{
printf("| ");
}
}
printf("|\n");
}
}/* end function drawboard */
int main()
{
char game[3][3]={{0}};
int totalEntry =0,row,column;
char value;
while(totalEntry<=9){
printf("Enter (x) or (o): ");
scanf("%c",&value);
getchar();
printf("Enter row number: ");
scanf("%d",&row);
getchar();
printf("Enter Column number: ");
scanf("%d",&column);
getchar();
game[row][column] = value;
drawBoard(game);
}
return 0;
}
答案 1 :(得分:0)
关于您的主要问题:
替换:
printf( "%d ", board[rows][columns] );
by:
printf( "%c ", board[rows][columns] );
因为目前您正在打印字符的ASCII值。
其他错误:
1)要小心,因为您还要打印垃圾,因为XO不受影响且未初始化。
2)此外,在此循环中:
for ( columns = 0 ; columns < 7 ; columns++ )
board[ rows ][ columns * 2 ] = '|';
您正在访问超出表格范围的第12列。可以进行多项修复:
for ( columns = 0 ; columns < 7 ; columns+=2 )
board[ rows ][ columns ] = '|';
或
for ( columns = 0 ; columns < 4 ; columns++ )
board[ rows ][ columns * 2] = '|';
3)您的数组声明错误。你写道:
char board[7][3]
而不是
char board[3][7]
第一个维度不是行,第二个是列,您可以自行决定。但是,根据以下代码,您使用board[rows][columns]
访问数组,因此它应该是char board[3][7]
,因为您有3行和7列。
4)如果函数drawBoard
没有返回任何内容,则不应将其声明为返回char
。将类型更改为void
。
一般评论:
1)你可能不应该把'|'在您的数组中,它会使您的代码更复杂。您应该在打印电路板时显示它们。想象一下,你想要改变印刷板的打印方式(例如改变'|'by“|”),你需要改变一切!
2)使用-Wall
进行编译。
答案 2 :(得分:0)
而不是:
printf( "%d ", board[rows][columns] );
尝试:
printf( "%c ", board[rows][columns] );
这将打印字符而不是数字。