Ir para conteúdo
Fórum Script Brasil
  • 0

JOGO DA VELHA com BOT - by ARAKI


Araki

Pergunta

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


char tabuleiro[3][3];
int vitoria;

void deseja();

int give_me_a_random(){
    int num;
    num=rand() % 3;
    return(num+1);
}

void limpar_tabuleiro(){
    vitoria=0;
    int il,ic;
    fflush(stdin);
    for(il=0;il<3;il++){
        for(ic=0;ic<3;ic++){
            tabuleiro[il][ic]='#';
        }
    }

}
void escrever_tabuleiro(){

    system("cls");
    system("color 0a");
    printf("\n       1  2  3\n");
    printf("\n    1  %c| %c |%c ",tabuleiro[0][0],tabuleiro[0][1],tabuleiro[0][2]);
    printf("\n      --|---|--");
    printf("\n    2  %c| %c |%c ",tabuleiro[1][0],tabuleiro[1][1],tabuleiro[1][2]);
    printf("\n      --|---|--");
    printf("\n    3  %c| %c |%c\n\n\n",tabuleiro[2][0],tabuleiro[2][1],tabuleiro[2][2]);
}

int checar_jogada(char jogador){
    int teste =0;
    int gambiarra;


//Coluuuuuuuuuuuunaaaaaaaaaaaaaaasssssss!!!
    if(tabuleiro[0][2]==jogador){
        teste++;
    }

    if(tabuleiro[1][2]==jogador){
        teste++;
    }

    if(tabuleiro[2][2]==jogador){
        teste++;
    }

    if(teste==3){
        return(1);
        goto fim;
    }else{
        teste=0;
    }


    if(tabuleiro[0][1]==jogador){
        teste++;
    }

    if(tabuleiro[1][1]==jogador){
        teste++;
    }

    if(tabuleiro[2][1]==jogador){
        teste++;
    }

    if(teste==3){
        return(1);
        goto fim;
    }else{
        teste=0;
    }

    if(tabuleiro[0][0]==jogador){
        teste++;
    }

    if(tabuleiro[1][0]==jogador){
        teste++;
    }

    if(tabuleiro[2][0]==jogador){
        teste++;
    }

    if(teste==3){
        return(1);
        goto fim;
    }else{
        teste=0;
    }



//LINHASSSSSSSSSSSSSSSSSSS!!!!

    if(tabuleiro[0][0]==jogador){
        teste++;
    }

    if(tabuleiro[0][1]==jogador){
        teste++;
    }

    if(tabuleiro[0][2]==jogador){
        teste++;
    }

    if(teste==3){
        return(1);
        goto fim;
    }else{
        teste=0;
    }


    if(tabuleiro[1][0]==jogador){
        teste++;
    }

    if(tabuleiro[1][1]==jogador){
        teste++;
    }

    if(tabuleiro[1][2]==jogador){
        teste++;
    }

    if(teste==3){
        return(1);
        goto fim;
    }else{
        teste=0;
    }

    if(tabuleiro[2][0]==jogador){
        teste++;
    }

    if(tabuleiro[2][1]==jogador){
        teste++;
    }

    if(tabuleiro[2][2]==jogador){
        teste++;
    }

    if(teste==3){
        return(1);
        goto fim;
    }else{
        teste=0;
    }


//DIAAGGgooooooooooooooonaaaaaaaaaaaaaaaaiiiiiiiiiiiiiiiiiiissssssss (PRINCIPAL)

    if(tabuleiro[0][0]==jogador){
        teste++;
    }
    if(tabuleiro[1][1]==jogador){
        teste++;
    }
    if(tabuleiro[2][2]==jogador){
        teste++;
    }

    if(teste==3){
        return(1);
        goto fim;
    }else{
        teste=0;
    }

//SECUNDARIA
    if(tabuleiro[2][0]==jogador){
        teste++;
    }
    if(tabuleiro[1][1]==jogador){
        teste++;
    }
    if(tabuleiro[0][2]==jogador){
        teste++;
    }

    if(teste==3){
        return(1);
        goto fim;
    }else{
        teste=0;
        return(0);
    }

    fim:
    gambiarra=0;
}

char trocar_jogador(char jogador){
    if(jogador=='X'){
        return ('O');
    }else{
        return ('X');
    }
}

void computar_jogada(char jogador, int linha,int coluna){
        /*printf("%d",linha);
        system("pause");
        printf("%d",coluna);
        system("pause");*/
        tabuleiro[linha-1][coluna-1]=jogador;
}

int realizar_jogada(char jogador,int bot){

    int l ,c;
    escrever_tabuleiro();

    PORINVALIDEZ:

    printf("Vez do jogador ' %c '\n",jogador);

    if((bot == 1)&&(jogador!='O')){
        l=give_me_a_random();
        c=give_me_a_random();
    }else{
        printf("Digite onde deseja marcar %c:\n",jogador);
        scanf  ("%d %d",&l,&c);
    }

    if((l<1||l>3)||(c<1||c>3)&&(bot==0)){
        system("color 0c");
        printf("Jogada invalida(Coordenada)\n");
        system("pause");
        escrever_tabuleiro();
        fflush(stdin);
        goto PORINVALIDEZ;
    }else
        if((l<1||l>3)||(c<1||c>3)&&(bot==1)&&(jogador='O')){
            system("color 0c");
            printf("Jogada invalida(Coordenada)\n");
            system("pause");
            escrever_tabuleiro();
            fflush(stdin);
            goto PORINVALIDEZ;
    }else
        if((l<1||l>3)||(c<1||c>3)&&(jogador=='X')&&(bot==1)){
            escrever_tabuleiro();
            fflush(stdin);
            goto PORINVALIDEZ;
    }


    if ((tabuleiro[l-1][c-1]!='#')&&(bot==0)){
        system("color 0c");
        printf("Jogada invalida(Repetida)\n");
        system("pause");
        escrever_tabuleiro();
        fflush(stdin);
        goto PORINVALIDEZ;
    }else

    if((tabuleiro[l-1][c-1]!='#')&&(jogador=='X')&&(bot==1)){
        escrever_tabuleiro();
        fflush(stdin);
        goto PORINVALIDEZ;
    }else

    if((tabuleiro[l-1][c-1]!='#')&&(jogador=='O')&&(bot==1)){
        system("color 0c");
        printf("Jogada invalida(Repetida)\n");
        system("pause");
        escrever_tabuleiro();
        fflush(stdin);
        goto PORINVALIDEZ;
    }else{
        computar_jogada(jogador,l,c);
    }
    return(checar_jogada(jogador));
}


void comecar_jogo(int bot){
    char jogador;
    int ok,teste,contador;
    contador=0;
    ok=0;
    jogador='O';
    do{
        fflush(stdin);
        teste=realizar_jogada(jogador,bot);
   //     printf("%d",teste);
        contador++;
        if(teste==0){
            escrever_tabuleiro();
            jogador=trocar_jogador(jogador);
           //return (0);
        }else{
            escrever_tabuleiro();
            printf("\n\n\n  O JOGADOR %c VENCEU!\n\n\n",jogador);
            ok=1;
            vitoria=1;
            //return(1);
        }

        if((contador>=9)&&(vitoria==0)){
            printf("\n\n\n O JOGO EMPATOU!!!\n\n\n");
            ok=1;
        }

    }while(ok==0);
    fflush(stdin);
    deseja();
}

/*
void comecar_jogo(){
    char jogador;
    int ok,teste,contador;
    contador=0;
    ok=0;
    jogador='O';
    do{
        fflush(stdin);
        teste=realizar_jogada(jogador);
        contador++;
        if(teste==0){
            escrever_tabuleiro();
            jogador=trocar_jogador(jogador);
        }else{
            escrever_tabuleiro();
            printf("\n\n\n  O JOGADOR %c VENCEU!\n\n\n",jogador);
            ok=1;
        }

        if(contador>=9){
            printf("\n\n\n O JOGO EMPATOU!!!\n\n\n");
            ok=1;
        }

    }while(ok==0);
    fflush(stdin);
    deseja();
}

*/



void deseja(){
    char escolha, bot;
    int botp;
    printf("Deseja iniciar um novo jogo? 's' ou 'n'?\n");
    scanf("%c",&escolha);
    switch(escolha){
        case's':
                printf("\n Deseja jogar contra bot ou player?\n");
                printf("\n  p - para player");
                printf("\n  b - para bot\n\n");
                fflush(stdin);
                scanf("%c",&bot);
                if(bot=='p'){
                    botp=0;
                }else{
                    botp=1;
                }
                system("cls");
                limpar_tabuleiro();
                comecar_jogo(botp);
                fflush(stdin);
        case 'n':
            exit(0);
            fflush(stdin);
        default:
            fflush(stdin);
            deseja();
    }
}

/*void deseja(){
    char escolha;
    printf("Deseja iniciar um novo jogo? 's' ou 'n'?\n");
    scanf("%c",&escolha);
    switch(escolha){
        case's':
                system("cls");
                limpar_tabuleiro();
                comecar_jogo();
                fflush(stdin);
        case 'n':
            exit(0);
            fflush(stdin);
        default:
            fflush(stdin);
            deseja();
    }
}*/

main(){
    system("title JOGO DA VELHA");
    system("color 0a");
    printf("\n                      Bem Vindo ao Jogo da Velha!\n\n");
    printf("\n  Os comandos são simples: Deve se digitar a linha e a coluna separador por 1 caractere qualquer ex.'espaço'");
    printf("\n  Por exemplo: o Jogador O digita '2 2'");
    printf("\n  Com isso 'O' sera marcada na 'casa do meio';\n\n");
    deseja();
}

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

Olá!

Parabéns pelo jogo. Acabei de jogar uma partida aqui... Melhor ainda pois ganhei!!! :D

Uma sugestão: poderia tentar melhorar o código de checagem da jogada com um for, evitando a repetição do código. Eu faria uma função que checa apenas 1 linha (horizontal, vertical, diagonal) por vez para tornar o código mais "legível". Por exemplo:

#define CHECAR_HORIZ 0
#define CHECAR_VERT 1
#define CHECAR_DIAG 2

int checa_linha(int direcao, int indice, char jogador)
{
    switch(direcao) {
        case CHECAR_HORIZ: return (tabuleiro[indice][0]==jogador && tabuleiro[indice][1]==jogador && tabuleiro[indice][2]==jogador);
        case CHECAR_VERT: return (tabuleiro[0][indice]==jogador && tabuleiro[1][indice]==jogador && tabuleiro[2][indice]==jogador);
        case CHECAR_DIAG:
            if(indice == 0) { // Primaria!
                return (tabuleiro[0][0]==jogador && tabuleiro[1][1]==jogador && tabuleiro[2][2]==jogador);
            } else { // Secundaria!
                return (tabuleiro[0][2]==jogador && tabuleiro[1][1]==jogador && tabuleiro[2][0]==jogador);
            }
    }

    return 0;
}

Abraços,

Marcelo Utikawa da Fonseca

Link para o comentário
Compartilhar em outros sites

  • 0

Olá, obrigado pela sugestão.

No momento, estou um pouco ocupado com [link]http://br.spoj.pl/problems/BORABORA/[/link], porém assim que eu terminar(já estou em ajustes finais), pretendo melhorar o jogo da velha, principalmente no sentido de fazer o bot realizar jogadas inteligentes ao invés de aleatória, com o intuito de que qualquer pessoa que jogue o meu jogo, esteja na verdade jogando contra mim.

Link para o comentário
Compartilhar em outros sites

  • 0

eu tava vendo, não sei de onde eu tirei mais... so pra completar o tópico um jogo da velha com heuristica !!!

#include <stdio.h>
#include <ctype.h>
#define Tamanho_String 80
#define Quadrados 9
typedef char Tipo_Quadrado;
typedef Tipo_Quadrado Tabuleiro[Quadrados];
const Tipo_Quadrado Vazio = ' ';
const int Infinito = 10;
const int Maximo_Movimentos = Quadrados;
int Total_Nos;
#define Possiveis_wins 8
const int Linhas[Possiveis_wins][3]={{ 0, 1, 2 },{ 3, 4, 5 },{ 6, 7, 8 },{ 0, 3, 6 },{ 1, 4, 7 },{ 2, 5, 8 },{ 0, 4, 8 },{ 2, 4, 6 }};
const int Array_Heuristico[4][4] = {{0,-10,-100,-1000},{10,0,0,0},{100,0,0,0},{1000,0,0,0}};
typedef struct { int Quadrado,Heuristico; } Movimento_Heuristico_Tipo;
void Initialize(Tabuleiro tabuleiro) {
    int I;
    for (I = 0; I < Quadrados; I++)
        tabuleiro[I] = Vazio;
}
Tipo_Quadrado Vencedor(Tabuleiro tabuleiro) {
    int I;
    for (I = 0; I < Possiveis_wins; I++) {
        Tipo_Quadrado Possivel_Vencedor = tabuleiro[Linhas[I][0]];
        if (Possivel_Vencedor != Vazio && Possivel_Vencedor == tabuleiro[Linhas[I][1]] && Possivel_Vencedor == tabuleiro[Linhas[I][2]])
            return Possivel_Vencedor;
    }
    for (I = 0; I < Quadrados; I++)
        if (tabuleiro[I] == Vazio)
            return Vazio;
    return 'C';
}
Tipo_Quadrado Outro(Tipo_Quadrado Jogador){return Jogador == 'X' ? 'O' : 'X';}
void Jogar(Tabuleiro tabuleiro, int Quadrado, Tipo_Quadrado Jogador){tabuleiro[Quadrado] = Jogador;}
void Mostra(Tabuleiro tabuleiro) {
    int I;
    for (I = 0; I < Quadrados; I += 3) {
        if (I > 0)
            printf("---+---+---\n");
        printf(" %c | %c | %c \n", tabuleiro[I], tabuleiro[I + 1], tabuleiro[I + 2]);
    }
    printf("\n");
}
int Avaliar(Tabuleiro tabuleiro, Tipo_Quadrado Jogador){
    int I,J,Heuristico = 0;
    for (I = 0; I < Possiveis_wins; I++) {
        int Jogadores = 0, Outros = 0;
        for (J = 0; J < 3; J++) {
            Tipo_Quadrado Piece = tabuleiro[Linhas[I][J]];
            if (Piece == Jogador)
                Jogadores++;
            else if (Piece == Outro(Jogador))
                Outros++;
        }
        Heuristico += Array_Heuristico[Jogadores][Outros];
    }
    return Heuristico;
}
int Melhor_Jogada(Tabuleiro tabuleiro, Tipo_Quadrado Jogador, int *Quadrado, int Move_Nbr,int Alpha, int Beta) {
    int Melhor_Quadrado = -1,Moves = 0,I;
    Movimento_Heuristico_Tipo Mover_Heuristico[Quadrados];
    Total_Nos++;
    for (I = 0; I < Quadrados; I++) {
        if (tabuleiro[I] == Vazio) {
            int Heuristico,J;
            Jogar(tabuleiro, I, Jogador);
            Heuristico = Avaliar(tabuleiro, Jogador);
            Jogar(tabuleiro, I, Vazio);
            for (J = Moves-1; J >= 0 && Mover_Heuristico[J].Heuristico < Heuristico; J--) {
                Mover_Heuristico[J + 1].Heuristico = Mover_Heuristico[J].Heuristico;
                Mover_Heuristico[J + 1].Quadrado = Mover_Heuristico[J].Quadrado;
            }
            Mover_Heuristico[J + 1].Heuristico = Heuristico;
            Mover_Heuristico[J + 1].Quadrado = I;
            Moves++;
        }
    }
    for (I = 0; I < Moves; I++) {
        int Score, Sq = Mover_Heuristico[I].Quadrado;
        Tipo_Quadrado W;
        Jogar(tabuleiro, Sq, Jogador);
        W = Vencedor(tabuleiro);
        if (W == 'X')
            Score = (Maximo_Movimentos + 1) - Move_Nbr;
        else if (W == 'O')
            Score = Move_Nbr - (Maximo_Movimentos + 1);
        else if (W == 'C')
            Score = 0;
        else
            Score = Melhor_Jogada(tabuleiro, Outro(Jogador), Quadrado, Move_Nbr + 1, Alpha, Beta);
        Jogar(tabuleiro, Sq, Vazio);
        if (Jogador == 'X') {
            if (Score >= Beta) {
                *Quadrado = Sq;
                return Score;
            } else if (Score > Alpha) {
                Alpha = Score;
                Melhor_Quadrado = Sq;
            }
        } else {
            if (Score <= Alpha) {
                *Quadrado = Sq;
                return Score;
            } else if (Score < Beta) {
                Beta = Score;
                Melhor_Quadrado = Sq;
            }
        }
    }
    *Quadrado = Melhor_Quadrado;
    return (Jogador == 'X') ? Alpha : Beta;
}
void Describe(int Score) {
    if (Score < 0)
        printf("\nVoce garantiu a vitoria.\n");
    else if (Score == 0)
        printf(" \ngarantiu empate.\n");
    else
        printf(" \nganhou a vitoria com o movimento %d.\n",Maximo_Movimentos - Score + 1);
}
void Move(Tabuleiro tabuleiro, Tipo_Quadrado Jogador, int Move_Nbr) {
    int Quadrado;
    if (Jogador == 'X') {
        Total_Nos = 0;
        Describe(Melhor_Jogada(tabuleiro, 'X', &Quadrado, Move_Nbr, -Infinito, Infinito));
        printf("\n %d nos examinados.\n", Total_Nos);
        Jogar(tabuleiro, Quadrado, 'X');
        printf("\n Movimento #%d - X moveu para %d\n", Move_Nbr, Quadrado + 1);
    } else {
        do {
            printf("\n Movimento #%d - qual o movimento de O? ", Move_Nbr);
            scanf("%d", &Quadrado);
            Quadrado--;
        } while (tabuleiro[Quadrado] != ' ');
        Jogar(tabuleiro, Quadrado, 'O');
    }
}
void Game() {
    Tipo_Quadrado Jogador;
    char Answer[Tamanho_String];
    Tabuleiro tabuleiro;
    int Move_Nbr = 1;
    Initialize(tabuleiro);
    printf("\ndeseja jogar primeiro (Y ou N)? ");
    scanf("%s", Answer);
    (toupper(Answer[0]) == 'Y') ? Jogador = 'O' : Jogador = 'X';
    while(Vencedor(tabuleiro) == ' ') {
        Mostra(tabuleiro);
        Move(tabuleiro, Jogador, Move_Nbr);
        Jogador = Outro(Jogador);
        Move_Nbr++;
    }
    Mostra(tabuleiro);
    (Vencedor(tabuleiro) != 'C') ? printf("%c venceu!\n", Vencedor(tabuleiro)) : printf("empatou.\n");
}
int main() {
    char Answer[Tamanho_String];
    printf("Bem vindo ao jogo da velha!\n\nessas são as casas jogaveis:\n 1 | 2 | 3\n---+---+---\n 4 | 5 | 6\n---+---+---\n 7 | 8 | 9\n\n");
    printf("computador joga com X, voce com O.\n");
    do {
        Game();
        printf("\nDeseja jogar novamente (Y ou N)? ");
        scanf("%s", Answer);
    }while(toupper(Answer[0]) == 'Y');
}

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...