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]

および 'empty space' ( XO'X' と 'O' の変数 char) で

[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次元配列の宣言が間違っています。最初の括弧には行数を、2 番目の括弧には列数を含める必要があります。(コード内で逆に持っています)

  2. board[ rows ][ columns * 2 ] = '|';.. ループ カウンターを 2 ずつインクリメントする方がはるかに簡単です (私のコードを参照してください) 。

  3. %c文字を印刷するには、記述子ではなく選択します%d

  4. 最後に、大きな問題ではありませんが、メインでリターンを行うことをお勧めします

  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|

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

ゲームの私の解釈: (マキシムからの提案に従ってわずかに編集されています)

#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] );

これにより、数字の代わりに文字が印刷されます。

于 2013-10-29T09:59:27.570 に答える
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]

最初の次元が行で、2 番目の次元が列である必要はありません。それを決めることができます。ただし、次のコードによると、配列にアクセスしているため、3 行と 7 列があるため、board[rows][columns]そうする必要があります。char board[3][7]

4)関数が何も返さない場合はdrawBoard、 a を返すと宣言しないでください。charタイプを に変更しvoidます。

一般的なコメント:

1) おそらく「|」を入れるべきではありません 配列では、コードがより複雑になります。代わりに、ボードを印刷するときにそれらを表示する必要があります。ボードの印刷方法を変更したいと想像してみてください (たとえば、'|' を " | " に変更するなど)、すべてを変更する必要があります!

2) でコンパイルし-Wallます。

于 2013-10-29T09:57:58.890 に答える