Jogo da Velha contra o Computador.
Publicado por Danilo 18/04/2004
[ Hits: 36.961 ]
Homepage: http://www.danilocesar.com
Este Script C cria um jogo da velha contra o comptuador. Muito interessante, pois com técnicas básicas de algoritmos é possível
criar uma espécie de IA que é capaz de se defender, escolher posição de ataque. O Algoritmo prevê muita coisa, talvez na próxima versão, crie um que possa utilizar 'estratégias' de jogo.
As partes mais importantes do código estão comentadas, acho que é um ótimo script pra quem está começando a programar em C
/***************************************************/ /* Jogo da Velha. */ /* Este Script C foi complicado em gcc 3.0 usando */ /* Linux Debian Sarge */ /* */ /* A "IA" desde game consiste em prever as */ /* ações do adversário. */ /* Basicamente, ele verifica se ele ou o adversário*/ /* podem ganhar jogando em uma casa específica */ /* Caso ele ache um espaço que termine o jogo, ele */ /* marcará esta posição. Caso ele ache 2 posições, */ /* o algoritmo decide pelo que dá a vitória a si */ /* */ /* Danilo Cesar */ /* danilo_eu@hotmail.com */ /***************************************************/ #include <stdio.h> #include <stdlib.h> #include <time.h> #define Lado 3 char matriz[3][3]; /*Começa Declarando a Matriz do Jogo*/ char matriza[3][3]; char matrizb[3][3]; char vitoria; void init_matriz(); void imprime_matriz(); int jogador_joga(int a, int b); void clrscr(void); void pega_valores(void); int checar(void); int pc_joga(); void gera_rand(); /*Gera a semente randomica necessária para a função rand e é executada no começo do programa*/ void gera_rand() { int stime; int ltime; ltime=time(NULL); stime=(unsigned) ltime/2; srand(stime); } int pc_joga() { int x,y,mx,my; int k,j,i; int erro=0; x=(rand()%3); y=(rand()%3); if(matriz[x][y]!=' ') { pc_joga(); return(1); } else { /************************************** O Computador gerará 2 números aleatórios X e Y. E verificará se as coordenadas do ponto (X,Y) estão livre. Se estiverem livres (matriz[x][y]==' ') então ele criará um "backup" da matriz original, e vai começas a jogar em cima delas. */ for(i=0;i<3;i++) for(j=0;j<3;j++) matriza[i][j]=matriz[i][j]; for(i=0;i<3;i++) for(j=0;j<3;j++) { if (matriz[i][j]==' ') { /*Neste primeiro trecho de codigo, o computador já criou uma nova matriz. Aqui, ele marca O num ponto qualquer e depois verifica se com este ponto ele consegue ganhar o jogo*/ matriz[i][j]='O'; if((checar()!=0)) { mx=i; my=j; erro=2; } else {/*Caso o computador não possa marcar zero neste ponto, ele fará o teste para ver se o jogador pode ganhar o jogo. Caso ele consiga vencer o jogo, o computador marca esta posição para evitar a vitória adversária. Logicamente, a varável erro é verificada como diferente de 2. Pois caso o computador ache um ponto onde ele possa ganhar, não vale a pena ele procurar outro para evitar a vitória adversária. */ matriz[i][j]='X'; if((checar()!=0)&&(erro!=2)) { mx=i; my=j; erro=1; } } matriz[i][j]=' '; } } //Restaura Matriz for(i=0;i<3;i++) for(j=0;j<3;j++) matriz[i][j]=matriza[i][j]; if (erro==0) matriz[x][y]='O'; if (erro!=0) matriz[mx][my]='O'; } } /*Função que verifica se há vencedor*/ int checar() { int erro=0; int i; //Caso a diagonal esteja vencida if ((matriz[0][0]==matriz[1][1])&&(matriz[1][1]==matriz[2][2])&&(matriz[0][0]!=' ')) { erro=1; vitoria=matriz[0][0]; } //Verifica Linhas e Colunas for(i=0;i<Lado;i++) { if ((matriz[i][0]==matriz[i][1])&&(matriz[i][1]==matriz[i][2])&&(matriz[i][0]!=' ')) { erro=1; vitoria=matriz[i][0]; } if ((matriz[0][i]==matriz[1][i])&&(matriz[1][i]==matriz[2][i])&&(matriz[0][i]!=' ')) { erro=1; vitoria=matriz[0][i]; } } //Verifica Diagonal Inversa if ((matriz[2][0]==matriz[1][1])&&(matriz[1][1]==matriz[0][2])&&(matriz[2][0]!=' ')) { erro=1; vitoria=matriz[2][0]; } return(erro); } /*Função que pede as coordenadas ao usuário*/ void pega_valores(void) { int x,y; printf("\n\nDigite as coordenadas do tipo: Linha, Coluna"); scanf("%d%d",&x,&y); jogador_joga(x,y); } /*Função para limpar a tela*/ void clrscr(void) { system("clear"); } /*Esta função recebe como argumento a coordenada onde deve-se marcar o X. Faz as verificações necessárias, e marca X na matriz*/ int jogador_joga(int a, int b) { clrscr(); if((a>Lado)||(b>Lado)||(a<1)||(b<1)) { printf("Valores Inválidos %d,%d\n\n",a,b); imprime_matriz(); pega_valores(); } else if(matriz[a-1][b-1]!=' ') { printf("Casa já foi preenchida %d,%d \n\n",a,b); imprime_matriz(); pega_valores(); } else matriz[a-1][b-1]='X'; } /*Esa função simplismente gera um gráfico ASCII da Matriz na tela*/ void imprime_matriz() { int i; printf("\n\n"); for(i=0;i<Lado;i++) { printf(" %c | %c | %c\n",matriz[i][0],matriz[i][1],matriz[i][2]); if(i<Lado-1) printf("------------\n"); } } /*Inicia a Matriz*/ void init_matriz() { int k,j; for (k=0;k < Lado;k++) for(j=0;j < Lado;j++) matriz[k][j]=' '; } int main(void) { int jogadas; gera_rand(); // Coloca semente randomica no sistema init_matriz(); jogadas = 0; //Zera o numero de jogadas. do { imprime_matriz(); pega_valores(); jogadas++; if((checar()==0)&&(jogadas<9)) // Verifica se não houve vitórias ou se acabaram { // ou se acabaram o numero de jogadas. pc_joga(); // Caso contrário, o computador joga e numero de jogadas jogadas++; // Aumenta um } }while((checar()==0)&&(jogadas<9)); //Repere a verificação imprime_matriz(); // Imprime matriz final na tela return(0); }
Lista Duplamente Encadeada em C
Passkeys: A Evolução da Autenticação Digital
Instalação de distro Linux em computadores, netbooks, etc, em rede com o Clonezilla
Título: Descobrindo o IP externo da VPN no Linux
Armazenando a senha de sua carteira Bitcoin de forma segura no Linux
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Instalando Brave Browser no Linux Mint 22
vídeo pra quem quer saber como funciona Proteção de Memória:
Encontre seus arquivos facilmente com o Drill
Mouse Logitech MX Ergo Advanced Wireless Trackball no Linux
Compartilhamento de Rede com samba em modo Público/Anônimo de forma simples, rápido e fácil
VMs e Interfaces de Rede desapareceram (11)
Instalação do drive do adaptador wiffi (7)