Jogo da Velha contra o Computador.
Publicado por Danilo 18/04/2004
[ Hits: 36.863 ]
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); }
Balanceamento de parênteses utilizando Pilha
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Compartilhamento de Rede com samba em modo Público/Anônimo de forma simples, rápido e fácil
Cups: Mapear/listar todas as impressoras de outro Servidor CUPS de forma rápida e fácil
Criando uma VPC na AWS via CLI
Arch Linux - Guia para Iniciantes (2)
Problemas ao instalar o PHP (11)
Tem como instalar o gerenciador AMD Adrenalin no Ubuntu 24.04? (15)
Tenho dois Link's ( IP VÁLIDOS ), estou tentando fazer o failover... (0)