-1

簡単な三目並べゲームを作っています。ユーザーの選択を保存する際に問題が発生しました。基本的に、サイズ 12 の文字配列を持つ userBoard という構造体があります。ユーザーには、各位置に番号が付けられたボードが表示されます。次に、ユーザーはキャラクターを配置する場所を選択する必要があります。ユーザーのキャラクター (X または O) はランダムに割り当てられます。ユーザーが数字を入力すると、updateUserBoard という関数に渡されます。updateUserBoard は、ユーザーが選択した場所にユーザーのキャラクターを配置します。私が今抱えている問題は、ユーザーの文字を配列の 1 つの場所だけに配置するのではなく、配列全体をユーザーの文字で埋めることです。コードは以下です。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void printBoard(void);
void updateUserBoard(int location, char userCharacter, char computerCharacter);

struct UserTicTacToeBoard {
    char user[12]; // A user character array to store the users character.
};

struct ComputerTicTacToeBoard {
    char comp[12];
};

typedef struct UserTicTacToeBoard UserTicTacToeBoard;
typedef struct ComputerTicTacToeBoard ComputerTicTacToeBoard;

UserTicTacToeBoard userBoard;
ComputerTicTacToeBoard compBoard;

int main(int argc, char const *argv[])
{
    printf("Welcome to a game of tic tac toe.\n");
    printf("Let's see if you're smarter than the computer.\n");
    char computerCharacter, userCharacter;
    /* Getting a random number needs some fixing! */
    int assignRandom = (rand() % 10000) / 10000.0;
    int userDecision;
    switch(assignRandom) {
        case 1:
        strcpy(&userCharacter, "O");
        strcpy(&computerCharacter, "X");
        break;

        default:
        strcpy(&userCharacter, "X");
        strcpy(&computerCharacter, "O");
        break;
    }

    printf("Computer gets %c\n", computerCharacter);
    printf("User gets %c\n", userCharacter);
    printBoard();

    for(int i = 0; i <= 12; i++) {
        userBoard.user[i] = computerCharacter;
        compBoard.comp[i] = userCharacter;
    }

    while(1) {
    printf("\nLadies first.\n");
    printf("Please enter a number from the table above which you would like to replace with\nNumber: ");
    // Use some other function here instead of scanf. If the user types anything other than an int,
    // scanf goes into this crazy loop.
    scanf("%d", &userDecision);
    updateUserBoard(userDecision, userCharacter, computerCharacter);
    }
    return 0;
}

void printBoard(void)
{
    printf(" 0  | 1  | 2  | 3  |\n");
    printf("--------------------\n");
    printf(" 4  | 5  | 6  | 7  |\n");
    printf("--------------------\n");
    printf(" 8  | 9  | 10 | 11 |\n");
}

void updateUserBoard(int location, char userCharacter, char computerCharacter)
{
    if (location > 11) {
        printf("ERROR: PUSSY DETECTED. GROW A PAIR.\n");
        exit(1);
    }

    userBoard.user[location] = userCharacter; // Here instead of putting the user's character to userBoard.user[location], it fills the whole array with the users location 

    printf(" %c  | %c  | %c  | %c  |\n", userBoard.user[location], userBoard.user[location], userBoard.user[location], userBoard.user[location]);
    printf("------------------------\n");
    printf(" %c  | %c  | %c  | %c  |\n", userBoard.user[location], userBoard.user[location], userBoard.user[location], userBoard.user[location]);
    printf("------------------------\n");
    printf(" %c  | %c  | %c  | %c  |\n", userBoard.user[location], userBoard.user[location], userBoard.user[location], userBoard.user[location]);
    printf("------------------------\n");
    printf(" %c  | %c  | %c  | %c  |\n", userBoard.user[location], userBoard.user[location], userBoard.user[location], userBoard.user[location]);
}
4

2 に答える 2

2

出力コードに問題があります。16 個のセルすべてにprintfs を使用しています (つまり、同じ文字を 16 回出力しています)。userBoard.user[location]

この種のエラーは、「コピー & ペースト プログラミング」で通常発生するものです。ループを使用します。

そして、16 ではなく 12 セルを印刷する必要があると思います。

于 2013-06-08T09:22:17.417 に答える