使用数组创建tic-tac-toe板

时间:2013-10-29 09:50:17

标签: c arrays

我正在尝试使用[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;至少打印:(?

3 个答案:

答案 0 :(得分:4)

代码问题:

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

  2. 而不是做board[ rows ][ columns * 2 ] = '|'; ..将循环计数器递增2更简单(参见我的代码)

  3. 要打印字符,请选择%c描述符而不是%d

  4. 最后不是一个大问题,但在主要做回报是好习惯

  5. 对不起您的代码的另一个大问题。你将drawBoard函数声明为char ..但是你没有从它返回任何char ..(如果你打开-Wall标志,编译器会抱怨)..将它改为{{ 1}}而不是

  6. 以下是修正代码:( 查看代码中的注释以了解代码问题

    同样现在我用'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] );

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