Как сбросить массив в моей игре крестики-нолики

Я новичок в C, и я пытаюсь сделать игру в крестики-нолики для своего проекта в колледже, и я изо всех сил пытаюсь сбросить свой массив в своей игре.

Каждый раз, когда я играю снова, массив не сбрасывается. Кто-нибудь может мне с этим помочь?

Вот код:

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


char space[3][3] = {
    {'1','2','3'},
    {'4','5','6'},
    {'7','8','9'}
};

void board();
int checkWin();
int game();
void reset();




int main(){

    int choice = -1;

    do{
        printf("\n\n\n\n\n\n\n\t\t\t  ================\n");
        printf("\t\t\t     Tic Tac Toe\n");
        printf("\t\t\t  ================\n");
        printf("\t\t     -----------Menu-----------\n\n");
        printf("\t\t     1. Play\n");
        printf("\t\t     2. Exit\n");
        scanf("%d", &choice);
        switch(choice){
            case 1: game();
                break;
            case 2: printf("Goodbye!!");
                exit(0);
                break;
            default: printf(".......Wrong Key !.......Try Again!......");
                break;
        }


    }while(choice != 0);
}


int game(){
    int player = 1, i, choice;

    char mark;

    
    do
    {
        system("cls");
        board();
        player = (player % 2) ? 1 : 2;

        printf("Player %d, enter a number:  ", player);
        scanf("%d", &choice);

        mark = (player == 1) ? 'X' : 'O';

        if (choice == 1)
            space[0][0] = mark;
            
        else if (choice == 2)
            space[0][1] = mark;
            
        else if (choice == 3)
            space[0][2] = mark;
            
        else if (choice == 4)
            space[1][0] = mark;
            
        else if (choice == 5)
            space[1][1] = mark;
            
        else if (choice == 6)
            space[1][2] = mark;
            
        else if (choice == 7)
            space[2][0] = mark;
            
        else if (choice == 8)
            space[2][1] = mark;
            
        else if (choice == 9)
            space[2][2] = mark;
            
        else
        {
            printf("Invalid move ");

            player--;
            getch();
        }
        i = checkWin();

        player++;
    }while (i ==  - 1);
    
    board();
    reset();
    
    if (i == 1)
        printf("==>\aPlayer %d win \n\n", --player);
        
    else
        printf("==>\aGame draw\n\n");
    
    getch();

    return 0;
}

int checkWin(){

    if (space[0][0] == space[0][1] && space[0][1] == space[0][2])
        return 1;
        
    else if (space[1][0] == space[1][1] && space[1][1] == space[1][2])
        return 1;
        
    else if (space[2][0] == space[2][1] && space[2][1] == space[2][2])
        return 1;
        
    else if (space[0][0] == space[1][0] && space[1][0] == space[2][0])
        return 1;
        
    else if (space[0][1] == space[1][1] && space[1][1] == space[2][1])
        return 1;
        
    else if (space[0][2] == space[1][2] && space[1][2] == space[2][2])
        return 1;
        
    else if (space[0][0] == space[1][1] && space[1][1] == space[2][2])
        return 1;
        
    else if (space[0][2] == space[1][1] && space[1][1] == space[2][0])
        return 1;
        
    else if (space[0][0] != space[0][0] && space[0][1] != space[0][1] && space[0][2] != space[0][2] &&
        space[1][0] != space[1][0] && space[1][1] != space[1][1] && space[1][2] != space[1][2] && space[2][0] 
        !=  space[2][0] &&  space[2][1] != space[2][1] && space[2][2] != space[2][1])

        return 0;
    else
        return  - 1;


}

void reset(){

    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            space[i][j] = 0;
        }
        
    }
    

}


void board(){

    system("cls");
    printf("\n\n\tTic Tac Toe\n\n");

    printf("Player 1 (X)  -  Player 2 (O)\n\n\n");


    printf("     |     |     \n");
    printf("  %c  |  %c  |  %c \n", space[0][0], space[0][1], space[0][2]);

    printf("_____|_____|_____\n");
    printf("     |     |     \n");

    printf("  %c  |  %c  |  %c \n", space[1][0], space[1][1], space[1][2]);

    printf("_____|_____|_____\n");
    printf("     |     |     \n");

    printf("  %c  |  %c  |  %c \n", space[2][0], space[2][1], space[2][2]);

    printf("     |     |     \n\n");
    

}

Я пытался использовать цикл for, но он не работает; как я могу это решить?

void reset(){

    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            space[i][j] = 0;
        }
        
    }
    

}

Возможно, у вас должен быть дубликат вашего исходного массива space, и в вашей функции reset скопируйте дубликат, чтобы установить его в исходное начальное состояние?

Some programmer dude 30.11.2022 13:30
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
1
1
100
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваша функция reset заполняет всю матрицу доски 3x3 нулями; они представляют символ nul, а не символ, представляющий цифру '0'. Эти символы nul не печатаются (и не могут быть напечатаны), поэтому после сброса доска выглядит «неправильно».

Однако простое изменение строки space[i][j] = 0; на space[i][j] = '0'; не сработает! Хотя сначала вы увидите доску, полную 0 цифр, то, как работает ваша checkWin() функция, гарантирует, что «Игрок 1» выиграет новую игру сразу после своего первого хода, потому что уже будут ряды/столбцы/диагонали цифр. три одинаковых персонажа.

Итак, чтобы получить исходный дисплей (от «1» до «9»), напишите свою функцию reset(), как показано ниже. (Обратите внимание, что стандарт C требует, чтобы символы, представляющие числовые цифры, были упорядочены и непрерывны, поэтому добавление значения от 1 до 9 к символу «0» даст соответствующий цифровой символ.)

void reset()
{
    int number = 1;
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            space[i][j] = number++ + '0';
        }

    }
}

В качестве альтернативы вы можете просто объявить и инициализировать новый «массив доски» с данными в нем, а затем просто использовать memcpy, чтобы поместить массив space с его содержимым:

#include <string.h> // For "memcpy"

void reset()
{
    char empty[3][3] = { {'1','2','3'}, {'4','5','6'}, {'7','8','9'} };
    memcpy(space, empty, sizeof(space));
}

Обратите внимание, что все тесты в следующем утверждении неверны:

    else if (space[0][0] != space[0][0] && space[0][1] != space[0][1] && space[0][2] != space[0][2] &&
        space[1][0] != space[1][0] && space[1][1] != space[1][1] && space[1][2] != space[1][2] && space[2][0]
        != space[2][0] && space[2][1] != space[2][1] && space[2][2] != space[2][1])

Каждый из них проверяет, не равен ли элемент самому себе. Это никогда не может быть правдой, поэтому блок else if (строка return 0;) никогда не выполняется. Но на самом деле вам это не нужно, поэтому вы можете просто удалить этот блок.

Другие вопросы по теме