2

我正在尝试使用 [7][3] 的数组创建井字游戏

这个想法是输入'|' 在

[0][0] , [0][2] , [0][4] , [0][6]
[1][0] , [1][2] , [1][4] , [1][6]
[2][0] , [2][2] , [2][4] , [2][6]

和“空白空间”(XO“X”和“O”的变量字符)在

[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 */

当我运行程序时,输出都是数字,这是灾难性的。

我很清楚我没有为变量“XO”指定任何输入,但不应该使用“|” 至少被打印出来:(?

4

3 回答 3

4

您的代码存在问题:

  1. 您对二维数组的声明是错误的。第一个括号应该包含行数和第二个括号 - 列数。(你在你的代码中倒退了)

  2. 而不是这样做board[ rows ][ columns * 2 ] = '|';..将循环计数器增加2要简单得多(请参阅我的代码)

  3. 要打印一个字符,你选择%c不是描述符%d

  4. 最后不是一个大问题,但在 main 中返回是一个好习惯

  5. 抱歉,您的代码存在另一个大问题。您将 drawBoard 函数声明为char.. 但您没有char从中返回任何内容..(如果您打开 -Wall 标志,您的编译器会抱怨).. 将其更改void

这是固定代码:(请参阅代码中的注释以了解您的代码的问题

另外现在我正在用'X'填充数组..你可以改变它以满足你的需要

#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;
}

输出;

Sukhvir@Sukhvir-PC ~
$ gcc -Werror -g -o test test.c

Sukhvir@Sukhvir-PC ~
$ ./test
|X|X|X|
|X|X|X|
|X|X|X|

-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- --------------

我对游戏的解释:(根据 Maxime 的建议稍作编辑)

#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;
}

输出:(停下来保持简短..但你明白了)

$ ./test
Enter (X) or (O): x
Enter row number: 0
Enter Column number: 0
|x| | |
| | | |
| | | |
Enter (X) or (O): o
Enter row number: 1
Enter Column number: 1
|x| | |
| |o| |
| | | |
Enter (X) or (O): x
Enter row number: 2
Enter Column number: 2
|x| | |
| |o| |
| | |x|
Enter (X) or (O):
[4]+  Stopped  
于 2013-10-29T10:02:07.120 回答
0

关于你的主要问题:

代替 :

printf( "%d ", board[rows][columns] );

经过 :

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返回,则不应将其声明为返回 a char。将类型更改为void.

一般评论:

1)你可能不应该把'|' 在您的数组中,它使您的代码更加复杂。您应该在打印板时显示它们。想象一下,您想更改板的打印方式(例如,将“|”更改为“|”),您需要更改所有内容!

2) 编译-Wall

于 2013-10-29T09:57:58.890 回答
0

代替:

printf( "%d ", board[rows][columns] );

尝试:

printf( "%c ", board[rows][columns] );

这将打印字符而不是数字。

于 2013-10-29T09:59:27.570 回答