在井字游戏中随机移动-in C

时间:2019-06-20 15:25:04

标签: c

我正在做一个井字游戏,用户在其中与计算机竞争。当用户选择一个地点时,计算机也应该移动。但是,我似乎无法正常工作。每当用户移动时,它都会立即要求我进行另一次移动,而不是用计算机符号(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 个答案:

答案 0 :(得分:1)

这是因为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);