如果rand()重复数字,则将值重新分配给变量

时间:2019-06-21 05:16:00

标签: c

我正在制作一个井字游戏,用户在其中与计算机竞争。每当有人在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);
}

这是计算机的功能。在其中,“ else if”语句遇到了麻烦,因为我不知道要在语句中加上什么。

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 个答案:

答案 0 :(得分:2)

首先,更好地选择数据结构。代替:

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