【问题标题】:making a random move in tic tac toe -in C在tic tac toe -in C中随机移动
【发布时间】:2019-06-20 15:25:04
【问题描述】:

我正在做一个用户与计算机竞争的井字游戏。当用户选择一个地点时,计算机也应该采取行动。但是,我似乎无法让它发挥作用。每当用户移动时,它会立即要求我再移动一次,而不是用计算机符号 (O) 填充其中一个位置

我在与用户(AI() 和 User())不同的函数中完成了计算机部分,并尝试在 switch 的每个“else if”语句中调用它,但是,这只会使游戏闪烁并且不会不允许我继续。

编辑:我还尝试在“else if”语句中执行整个 AI() 过程,而不是让它成为一个函数,但它似乎只在用户选择 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;
    }
}

【问题讨论】:

  • 你需要交替调用User和AI,并且每次只能移动一个。
  • 你能告诉我这是怎么做的吗?我才学 C 几个星期
  • while(Check循环移动到main
  • 这是您实际代码的摘录还是您更改了什么?在上面的代码中,你有while(k = 1);,它将 k 分配给 1,因此循环将是无限的

标签: c


【解决方案1】:

那是因为main 中的每个函数都被一个接一个地调用。 您的程序卡在User() 调用中

尝试将您的 main 更改为:

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

删除User函数中的do{...}while(Check() != 0 &amp;&amp; Check() != 1);

并将while(k = 1); 更改为while(k == 1);

【讨论】:

  • 我这样做了,但是现在每当我选择一个位置时,板就会变成空白并且不允许我继续
  • while(k = 1);改为while(k == 1);=设置k的值
  • 我选择了第二个号码后现在无法正常工作,但我会从现在开始继续尝试看看我有什么问题,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-25
相关资源
最近更新 更多