Araki Postado Outubro 18, 2012 Denunciar Share Postado Outubro 18, 2012 #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(); } Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Marcelo Utikawa da Fonseca Postado Outubro 22, 2012 Denunciar Share Postado Outubro 22, 2012 Olá!Parabéns pelo jogo. Acabei de jogar uma partida aqui... Melhor ainda pois ganhei!!! :DUma 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Araki Postado Outubro 22, 2012 Autor Denunciar Share Postado Outubro 22, 2012 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Marcelo Utikawa da Fonseca Postado Outubro 23, 2012 Denunciar Share Postado Outubro 23, 2012 Realmente percebi que eram jogadas aleatórias. E gostei da comparação, eu nunca tinha pensado no ponto de vista sobre "jogar contra o computador será jogar contra mim"... :) Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 bareta Postado Outubro 29, 2012 Denunciar Share Postado Outubro 29, 2012 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'); } Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Araki
Link para o comentário
Compartilhar em outros sites
4 respostass a esta questão
Posts Recomendados
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.