Переопределите значение переменной, если rand () повторяет число - PullRequest
0 голосов
/ 21 июня 2019

Я делаю игру в крестики-нолики, в которой пользователь соревнуется с компьютером. Всякий раз, когда человек выбирает место между 1 и 9, компьютер должен выбрать и его. Для этого я использую rand (). Однако, если место уже занято, мне нужен компьютер для расчета нового. Я пытался использовать циклы while и do-while, но когда я их применил, cmd перестает работать и не позволяет мне продолжать игру.

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

typedef struct symbol{
    int marcado;
    char simbolo;
} SPOT;

SPOT casilla1 = {0,'1'};
SPOT casilla2 = {0,'2'};
SPOT casilla3 = {0,'3'};

void table();
void User();
void AI();

int main(){
    system("cls");
    User();
    AI();
    Check();
    return 0;
}

void table(){
    printf("\n        %c   |   %c   |   %c ",spot1.symbol,spot2.symbol,spot3.symbol);
}

это функция, в которой пользователь выбирает место:

void User(){

    char choice; 

    do{

        do{
            board();
            printf("\n\nChoose a spot: ");
            fflush(stdin);
            scanf("%c",&choice);
        }while(choice < '1' || choice > '3');

        switch(choice){
            case '1': if(choice == '1'){

                        system("cls");

                        if(casilla1.marcado == 1){
                            printf("\noccupied\n");
                        }

                        else if(casilla1.marcado == 0){
                            casilla1.marcado = 1;
                            casilla1.simbolo = 'X';

                            AI();
                        }
                    }
            break;

            case '2': if(choice == '2'){

                        system("cls");

                        if(casilla2.marcado == 1){
                            printf("\noccupied\n");
                        }

                        else if(casilla2.marcado == 0){
                            casilla2.marcado = 1;
                            casilla2.simbolo = 'X';

                            AI();
                        }   
                    }   
            break;

            case '3': if(choice == '3'){

                        system("cls");

                        if(casilla3.marcado == 1){
                            printf("\noccupied");
                        }

                        else if(casilla3.marcado == 0){
                            casilla3.marcado = 1;
                            casilla3.simbolo = 'X';

                            AI();
                        }   
                    }   
            break;  

    }while(Check() != 0 && Check() != 1);
}

и это функция для компьютера. В котором у меня возникают проблемы с утверждениями «иначе, если», поскольку я не знаю, что в них вставить.

void AI(){

    int random;

    srand(time(NULL));

    random = rand() % 3 + 1;

    if (random == 1){
        if(casilla1.marcado == 0){      
            casilla1.simbolo = 'O';
            casilla1.marcado = 1;
        }

        else if(casilla1.marcado == 1){
            random = rand() % 3 + 1
        }
    }

        if (random == 2){
            if(casilla2.marcado == 0){      
                casilla2.simbolo = 'O';
                casilla2.marcado = 1;
            }

            else if(casilla2.marcado == 1){
                random = rand() % 3 + 1;
            }
        }

        if (random == 3){
            if(casilla3.marcado == 0){      
                casilla3.simbolo = 'O';
                casilla3.marcado = 1;
            }

            else if(casilla3.marcado == 1){
                random = rand() % 3 + 1;
            }
        }   
}

Как я уже говорил, я пытался поместить весь AI () в разные типы циклов, помещая в них только rand () и т. Д., И все еще не могу заставить его работать.

1 Ответ

2 голосов
/ 21 июня 2019

Во-первых, лучше выбирайте свои структуры данных. Вместо:

SPOT casilla1 = {0,'1'};
SPOT casilla2 = {0,'2'};
SPOT casilla3 = {0,'3'};

использование

SPOT casilla[3] = { {0,'1'}, {0,'2'}, {0,'3'} };

Как следствие, конструкции switch больше не нужны. Вместо:

if(casilla1.marcado == 0){
if(casilla2.marcado == 0){
if(casilla3.marcado == 0){

использование:

if(casilla[random-1].marcado == 0){

человек выбирает место между 1 и 9

и

random = rand() % 9 + 1;

У вас есть только 3 casilla. Где остальные 6?


Я пытался использовать циклы while и do-while

В AI() петель нет. Может быть, вы можете показать нам код с циклами?


printf("\n\nChoose a spot: ");
fflush(stdin);

Вы, вероятно, хотели fflush() stdout?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...