сделать случайный ход в крестики-нолики-C - PullRequest
0 голосов
/ 20 июня 2019

Я играю в крестики-нолики, в которой пользователь соревнуется с компьютером. Когда пользователь выбирает место, компьютер также должен сделать ход. Тем не менее, я не могу заставить это работать. Всякий раз, когда пользователь делает ход, он сразу же просит меня сделать еще один вместо того, чтобы заполнить одно из пятен символом компьютера (O)

Я выполнял компьютерную часть в функции, отличной от пользовательской (AI () и User ()), и пытался вызывать ее в каждом операторе «else if» переключателя, однако это только заставляет игру мигать и не я не могу продолжать.

РЕДАКТИРОВАТЬ: я также попытался вместо того, чтобы сделать его функцией, выполнить весь процесс AI () внутри операторов "else if", но, казалось, он работал, только когда пользователь выбрал 1, а не для остальных опций .

РЕДАКТИРОВАТЬ # 2: Я изменил (k = 1) на (k == 1) в коде.

Чтобы облегчить чтение следующего кода, я сделал его 1x3 вместо 3x3:

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

typedef struct symbol{
    int marked;
    char symbol;
} SPOT;

SPOT spot1 = {0,'1'};
SPOT spot2 = {0,'2'};
SPOT spot3 = {0,'3'};

char symbol = 'X';
char compu = 'O';

void table();
int Check();
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{
        loop++;
        do{
            table();
            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(spot1.marked == 1){
                            printf("\nThat spot is taken\n");
                        }
                        else if(spot1.marked == 0){
                            spot1.marked = 1;
                            spot1.symbol = symbol;
                        }
                }
                break;

            case '2': 
                if(choice == '2'){
                        system("cls");
                        if(spot2.marked == 1){
                            printf("\nThat spot is taken\n");
                        }
                        else if(spot2.marked == 0){
                            spot2.marked = 1;
                            spot2.symbol = symbol;
                        }   
                }   
                break;

            case '3': 
                if(choice == '3'){
                        system("cls");
                        if(spot3.marked == 1){
                            printf("\nThat spot is taken\n");
                        }
                        else if(spot3.marked == 0){
                            spot3.marked = 1;
                            spot3.symbol = symbol;
                        }   
                }   
                break;
        }while(Check() != 0 && Check() != 1);
    }

void AI(){
    int random,k;
    srand(time(NULL));
    do{
        random = rand() % 4;
        k = 0;
        if(spot1.symbol == symbol || spot2.symbol == symbol || spot3.symbol == symbol){
            k = 1;
        }
    }while(k == 1);

    switch(random){
        case '1': 
            if (random == 1){
                spot1.symbol = compu;
                spot1.marked = 1;
            }
            break;

        case '2': 
            if (random == 2){
                spot2.symbol = compu;
                spot2.marked = 1;
            }
            break;

        case '3': 
            if (random == 3){
                spot3.symbol = compu;
                spot3.marked = 1;
            }
            break;
    }
}

int Check() {
    if(spot1.marked == spot2.marked && spot2.marked == spot3.marked){
        if(spot1.symbol == symbol){
            return 1;
            printf("You won!");
        }
        else if(spot1.symbol == compu){
            return 0;
            printf("You lost!");
        }
    }
    else {
        return 2;
    }
}

1 Ответ

1 голос
/ 20 июня 2019

Это потому, что каждая функция в вашем main вызывается одна за другой.Ваша программа застряла в User() вызове

Попробуйте изменить main на:

int main(){
    system("cls");
    do{
        User();
        AI();
    }while(Check() != 0 && Check() != 1);
    return 0;
}

Удаление do{...}while(Check() != 0 && Check() != 1); в функции User

и измените while(k = 1); на while(k == 1);

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