1

ゲームChompを作成しようとしています。私は途中ですが、かなり立ち往生しています。

ゲームには5つの異なる機能があります。ポインターと構造体は使用できません。

ここまで来て、しばらくの間、いくつかの問題に苦しんでいましたが、自分で解決する方法がわからないので、ここで助けを得ることができると思いました.

バグ

a)最初に2 2を入力し、次に2 1を入力すると、完全に有効な食べる位置であっても、その位置は既に食べられていると表示されます。位置が!= 'O'であるかどうかを確認する代わりに、 == 'O'であるかどうかを確認する必要がありますが、check_move()ループでは行と列が常にOであるとは限らないため、それも機能しません。 .

b)行列の内側にない位置 (つまり20 20 ) を入力すると、2行のエラーが発生します。理由がわかりません。もちろん、2 つではなく 1 つのエラーだけを表示したいのです。

c)既に食べられた位置を入力すると、プリントを数回ループしているループのために、「既に食べられています! 」というエラーが数回発生します。

質問

a)プレーヤー 1プレーヤー 2を交互に使用する最善の方法は何ですか? プレイヤーが有効な動きをするたびに+1増加する int について考えました。次に、int の値が奇数か偶数かを確認します。奇数 = プレイヤー 1、偶数 = プレイヤー 2、またはその逆。しかし、現在持っている以上のグローバル変数を持つことは許可されていないため、それは機能しません。そして、1 つの関数 ( check_move() )から 1 つの値しか返すことができません。

#include <stdio.h>

int height    =  4;
int width     = 10;
char matrix[4][10];


void initialize()
{
    for(int row = 0; row < height; row++)
        for(int col = 0; col < width; col++)
            matrix[row][col] = 'O';         
}



void print_board()
{
    printf("\n\n");

    for(int row = 0; row < height; row++)
    {
        for(int col = 0; col < width; col++)
        {
            printf("%c", matrix[row][col]);
        }
        printf("\n");
    }   
    printf("\n\n");
}



void get_move(int player, int input[])
{
    printf("Player %d, make your move: ", player);
    scanf("%d %d", &input[0], &input[1]);
}



int check_move(int position[])
{
    int row     = position[0];
    int col     = position[1];
    int status  =           1;

    if(row <= height  &&  col <= width)
    {
        for(row; row <= height; row++)
        {
            for(col; col <= width; col++)
            {
                // Checks if position already has been eaten
                if(matrix[row-1][col-1] != 'O')
                {
                    printf("Already eaten!\n");
                    status = 0; 
                }

            }
        }       
    }


    else if(row >= height  ||  col >= width)
    {
        printf("Your move must be inside the matrix!\n");
        status = 0;
    }

    return status;
}



void update_board(int x, int y)
{

    for(int xi = x; xi <= 10; ++xi)
    {
        for(int yi = y; yi <= 10; ++yi)
            matrix[xi-1][yi-1] = ' ';       
    }

}



int main(void)
{

    int player = 1;
    int position[2]; 

    initialize();
    print_board();

    while(1){

        get_move(player, position);

        check_move(position);


        while(check_move(position) != 1)
        {
            printf("Try again!\n\n");        
            get_move(player, position);
        }

        update_board(position[0], position[1]);

        print_board();

    }

    getchar();
    getchar();
    getchar();


    return 0;
}
4

2 に答える 2

1

バグ a と c:

check_move関数が間違っています。プレイされたポジションが食べられるかどうかのみをテストする必要があります。他のポジションのステータスは関係ありません。

int check_move(int pos[])
{
    if(pos[0] < 1 || pos[0] > height  ||  pos[1] < 1 || pos[1] > width)
    {
        printf("Your move must be inside the matrix!\n");
        return 0;
    }

    if(matrix[ pos[0] - 1 ][ pos[1] - 1 ] != 'O' ) {
        printf("Already eaten!\n");
        return 0; 
    }

    return 1;
}

バグ b:

check_moveメインで 2 回呼び出しているため、エラー メッセージが 2 回表示されます。

check_move(position);
while(check_move(position) != 1)

への無駄な最初の呼び出しを削除するだけcheck_move()です。

質問 a:

playermain 内の変数を更新することで、プレーヤーを切り替えることができます。

player = (player + 1) % maxNumberOfPlayer;

これは から0に移動maxNumberOfPlayer - 1するprintf("Player %d, make your move: ", player + 1);ため、よりユーザーフレンドリーな出力に使用できます。また、 の場合maxNumberOfPlayer = 2player = (player + 1) % 2;は と同等player = !playerです。

于 2013-11-05T16:57:28.163 に答える
0

ではmain、while ループ内に次を追加するだけです。

player = !player;

player0と1の間でトグルします。

于 2013-11-05T16:31:12.310 に答える