繁体   English   中英

计算C中masterMind游戏的白棋数量

[英]Calculation the number of white pieces on the masterMind game in C

请原谅我的任何写作错误英语不是我的第一语言。

我正在编码 MasterMind(如果你不熟悉游戏,你可以在这里查阅它的规则https://magisterrex.files.wordpress.com/2014/07/mastermindrules.pdf )游戏在 C 参加更大的项目,我几乎完成了它,但是当程序计算白色块的数量时,我被困在 function 中; 基本上,当玩家在错误的位置猜测正确的颜色时,白色的棋子就会出现。 如果棋盘(由计算机随机生成)为相同颜色的两块,并且玩家猜错了其中一块,我的代码 function 将不起作用。 该代码是葡萄牙语(我的母语),我希望这不会阻止我获得帮助。 谢谢你的帮助

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


#define STRING_MAXIMO 10

void gerarTabuleiro(int nivel, char (*tabuleiro)[STRING_MAXIMO])
{
    //Declaração e inicialização de variaveis locais 
    //Arrays de onde serão escolhidas aleatoriamente as cores de acordo com o nivel escolhido
    char coresNivel1[6][STRING_MAXIMO] = {"vermelho", "verde", "azul", "amarelo", "rosa", "ciano"};
    char coresNivel2[7][STRING_MAXIMO] = {"vermelho", "verde", "azul", "amarelo", "rosa", "ciano", "castanho"};
    char coresNivel3[8][STRING_MAXIMO] = {"vermelho", "verde", "azul", "amarelo", "rosa", "ciano", "castanho", "roxo"};
    int index;//Variavel que controlar todos os ciclos desta função

    srand(time(NULL));//Iremos alimentar o tabueleiro com uma uma nova combinação de todas as vezes (rand irá se basear na data e hora do sistema)

    if(nivel == 1){//Nivel 1 selecionado
        for(index = 0; index != nivel + 3; index++)//Para cada posição do tabuleiro (4 peças)
            strcpy(tabuleiro[index], coresNivel1[rand() % 6]);//Será escolhido aleatoriamente uma cor do array pre-determinado
    }
    else if(nivel == 2){//Nivel 2 selecionado
        for(index = 0; index != nivel + 3; index++)//Para cada posição do tabuleiro (5 peças)
            strcpy(tabuleiro[index], coresNivel2[rand() % 7]);//Será escolhido aleatoriamente uma cor do array pre-determinado
    }
    else if(nivel == 3){//Nivel 3 selecionado
        for(index = 0; index != nivel + 3; index++)//Para cada posição do tabuleiro (6 peças)
            strcpy(tabuleiro[index], coresNivel3[rand() % 8]);//Será escolhido aleatoriamente uma cor do array pre-determinado
    }
}

int calculaPretas(int nivel, char (*tabuleiro)[STRING_MAXIMO], char (*palpite)[STRING_MAXIMO])
{
    //Declaração e incialização de variaveis locais 
    int index;//Variaveis que controlarão os ciclos para iterar sobre o tabuleiro e o palpite do jogador 
    int nDp = 0;//Variavel auxiliar que ira controlar o numero de acertos na posição correta do utilizador 

    for(index = 0; index != nivel + 3; index++){/*Iremos simultaneamente comparar o primeiro palpite do utilizador com a primeira posição do tabuleiro,
    o segundo palpite com a segunda posição e assim sucessivamente*/
        if(strcmp(palpite[index], tabuleiro[index]) == 0)//Caso a cor seja correta
            nDp++;//Iremos incrementar o numero de peças acertadas em uma unidade
    }
    return nDp;
}

int calculaBrancas(int nivel, char (*tabuleiro)[STRING_MAXIMO], char (*palpite)[STRING_MAXIMO])
{
    //Declaração e incialização de variaveis locais 
    int indexT, indexP;//Variaveis que controlarão os ciclos para iterar sobre o tabuleiro e o palpite do jogador (indexT iterara sobre o tabuleiro e indexP iterara sobre o palpite)
    int nDp = 0;//Variavel auxiliar que ira controlar o numero de acertos na posição errada do utilizador
    int contabilizado[nivel+3];//Vetor que irá armazenar se um elemento do palpite já foi contabilizado como peça branca

    //Inicialização do array a 0, pois uma posição será colocada a 1 sempre que essa peça branca já tenha sido contabilizada
    for(int index = 0; index != nivel + 3; index++)
        contabilizado[index] = 0;

    for(indexP = 0; indexP != nivel + 3; indexP++){//Ciclo que ira iterar sobre o palpite fornecido pelo jogador
        for(indexT = 0; indexT != nivel + 3; indexT++){//Ciclo que ira iterar sobre as peças do tabuleiro
            if((strcmp(palpite[indexP], tabuleiro[indexT]) == 0) && indexP != indexT && !contabilizado[indexP]){//Iremos verificar se a cor existe no tabuleiro mas esta colocada na posição errada
                nDp++;//Incremento do numero de peças brancas no tabuleiro
                contabilizado[indexP] = 1;//Incremento da peça contabilizada ao array          
            }
        }
    }
    return nDp;
}

int main(int argc, char *argv)
{
    //Declaração e inicialização de variaveis locais (automaticas)
    int nivel;//Variavel que ira permitir ao utilizador selecionar o numero de peças no tabuleiro e as cores usadas
    int numeroDecasas;//Varivel que guardará o numero de casas de acordo com o nivel escolhido 
    int index;//Variavel que controlar todos os ciclos desta função

    //Explicação das regras do jogo 
    printf("#############################################################################################################\n");
    printf("# O objectivo do Mastermind é descobrir uma combinação de cores determinada aleatoriamente pelo computador. #\n");
    printf("# Para tal e necessario que escolha o nivel de jogo adequado                                                #\n");
    printf("# Nivel 1 -> 4 casas e 6 cores possiveis                                                                    #\n");
    printf("# Nivel 2 -> 5 casas e 7 cores possiveis                                                                    #\n");
    printf("# Nivel 3 -> 6 casas e 8 cores possiveis                                                                    #\n");
    printf("# Escolha o nivel pretendido                                                                                #\n");
    scanf("%i", &nivel); 
    printf("# Nivel %i selecionado                                                                                       #\n", nivel);
    printf("#############################################################################################################\n\n\n");

    //Declaração condicional do tamanho do tabuleiro de acordo com o nivel escolhido 
    char tabuleiro[nivel + 3][STRING_MAXIMO];/*Declaramos um array de n posições (nº casas é sempre o nivel + 3 exemplo nivel 1 -> 4 casas; 
    nivel 3 -> 6 casas) e com o tamanho maximo de uma string (caracteres numa cor)*/
    char palpite[nivel + 3][STRING_MAXIMO];/*Array que guardará os palpites do jogador*/

    gerarTabuleiro(nivel, tabuleiro);


    /*Teste*/
    //Impressão do tabuleiro - retirar em versão final
    printf("| ");
    for(index = 0; index != nivel + 3; index++){
        printf("%s | ", tabuleiro[index]);
    }
    printf("\n\n");
    /*Fim de teste*/

    
    //Declaração e inicialização de variaveis locais
    int novoPalpite;//Variavel que ira permitir ao utilizador desistir do jogo ou continuar a dar palpites (1 -> continuar || 2 -> desistir)
    int tentativas = 0;//Variavel que irá contar o numero de palpites que o jogador necessitou para ganhar
    int numeroDeBrancas = 0, numeroDePretas = 0;//Variaveis que informarão o jogador de quão perto se encontra de ganhar

    do{
        //Pedido ao utilziador do seu palpite
        printf("# Insira o seu palpite #\n");
        for(index = 0; index != nivel + 3; index++){//Para cada casa do nivel atual
            printf("# Casa %i\t", index + 1);//Sera informada a posição atual da casa a preencher
            scanf("%s", palpite[index]);//E pedido ao utilziador que escolha uma cor para a preencher
        }
        tentativas++;

        numeroDePretas = calculaPretas(nivel, tabuleiro, palpite);
        numeroDeBrancas = calculaBrancas(nivel, tabuleiro, palpite);
        printf("###########################################\n");
        printf("# Numero de peças pretas: %i               #\n", numeroDePretas);
        printf("#Numero de peças brancas: %i               #\n", numeroDeBrancas);
        printf("###########################################\n");

        if(numeroDePretas == nivel + 3){
            printf("###########################################\n");
            printf("# Necessitou de %i tentativas para ganhar  #\n", tentativas);
            printf("#                  TABULEIRO              #\n# ");
            for(index = 0; index != nivel + 3; index++)
                printf("%s # ", tabuleiro[index]);
            printf("\n###########################################\n");
            break;
        }

        printf("# Deseja introduzir um novo palpite #\n");
        printf("# 1. Novo palpite #\n");
        printf("# 2. Desistir #\n");
        scanf("%i", &novoPalpite);

        if(novoPalpite == 2){
            printf("# Desistiu do jogo #\n");
            printf("# Tabuleiro #\n ");
            printf("| ");
            for(index = 0; index != nivel + 3; index++)
                printf("%s | ", tabuleiro[index]);
            printf("\n\n");
        }

    }while(novoPalpite == 1);//Peças pretas (cor e posição correta)

    return 0;
}

我让一个由 indexP 控制的循环根据玩家的猜测进行迭代,另一个循环在棋盘上迭代它自己,如果字符串在任何 position 中相同,但在两者的相同位置(黑色块的定义)我验证是否这件作品已经被认为是一件白色的作品(我认为这是行不通的部分,但我不确定)

OT:这段代码因其经常重复的注释而难以阅读,即使你知道这种语言(我不知道)。

这是您重写的第一个 function:

void gerarTabuleiro(int nivel, char tabuleiro[][] ) {
    char coresNivel[] = {
        "vermelho", "verde", "azul", "amarelo", "rosa", "ciano", "castanho", "roxo"
    };

    srand(time(NULL));

    for( int i = 0; i < nivel + 3; i++ )
        strcpy( tabuleiro[ i ], coresNivel[ rand() % (nivel + 5)] );
}

与其复制/粘贴,不如努力编写清晰、简洁的代码来实现目标。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM