Ir para conteúdo


Revista PROGRAMAR - Edição 45 (Maio 2014): Download já disponível! Visita também o novo website da revista.

- - - - -

[C++] Jogo do Galo

c++ jogo

  • Por favor inicie sessão para responder
11 respostas a este tópico

#1 ajcosta01

ajcosta01

    null

  • Novo Membro
  • Pip
  • 3 mensagens

Publicado 29 de Maio de 2008 - 14:08

Código (C++):
/*
  Name: galo.h
  Copyright:
  Author:
  Date: 22-05-08 09:14
  Description:
*/
#include <cstdlib>
#include <iostream>
#include <vector>
using namespace std;

#ifndef CLASS_GALO
#define CLASS_GALO
class Galo{
          public:
                         Galo();
                         Galo(char xx, char oo);
                         void Play();
                         int Play2();
                         void Mostrar();
                         char tab[9];
         private:      
                         //representa o tabuleiro de jogo
                         char  temp[9], X, O;
                         void Restart();
                         //void Mostrar();
                         int Ganha();
                         int Perde();
                         int Ai(int change);
                                 
          };
#endif

Código (C++):
/*
  Name: galo.cpp
  Copyright: Antonio Costa
  Author: Antonio Costa
  Date: 22-05-08 09:23
  Description:
*/
#include "galo.h"
Galo::Galo(char xx, char oo){
                                X = xx; O = oo;
                                for (int i = 0; i< 9; i++)tab[i]='-';
                                }      
Galo::Galo(){
         for (int i = 0; i< 9; i++)tab[i]='-';
         }
void Galo::Restart(){
         for (int i = 0; i< 9; i++)tab[i]='-';
         }
void Galo::Mostrar(){
         cout << "\n Tabuleiro: \n";
         for(int i = 0; i < 3; i++)cout<< "   "<< tab[i] ;
         cout << endl;
         for(int i = 3; i < 6; i++)cout<< "   "<< tab[i] ;
         cout << endl;
         for(int i = 6; i < 9; i++)cout<< "   "<< tab[i] ;
         cout << endl;                                     
         }

void Galo::Play(){
         int best[9];
         int maior = 0, melhor, a;
         Mostrar();
         cout << "\n introduz um número de um a oito para escolher uma casa.   ";
                 cin >> a ;            
                 tab[a] = O;
                 Mostrar();
                 cin.get();
                 cout<<"\n...............................................       ";
         for(int loop = 0; loop< 4; loop++){                   
             for(int i = 0; i< 9; i++)temp[i] = tab[i];//1
                 for(int i = 0; i< 9; i++)best[i] = 0;//2
                 for(int i = 0; i< 9; i++){
                                 if(tab[i]== '-'){
                                                         tab[i] = X;
                                                         if(Ganha()){
                                                                                 Mostrar();
                                                                                 cout << "\n perdeste.\n\n";
                                                                                 return;
                                                                                 }
                                                         tab[i] = '-';
                               
                                 }
                                 }
                 for(int i = 0; i < 9 ; i++)best[i] = Ai(i);//3
                 for(int i = 0; i < 9 ; i++)if(maior < best[i]){//4
                                 maior = best[i];
                                 melhor = i;
                                 }
             cout << "\n maior 1: "<< maior<< "\t melhor jogada = "<< melhor;
                 for(int i = 0; i< 9; i++)best[i] = 0;//22
                 for(int i = 0; i< 9; i++)tab[i] = temp[i];//5
                 if(tab[melhor] == '-')tab[melhor] = X;//6
                 melhor = 0;maior = 0;//7
                 Mostrar();//8
                 cout << "\n introduz um número de um a oito para escolher uma casa.   ";
                 cin >> a ;            
                 tab[a] = O;
                 Mostrar();
                 cin.get();
                 cout<<"\n................................................      ";
                 }
         }
int Galo::Play2(){
         int best[9];
         int maior = 0, melhor;
               
               
             for(int i = 0; i< 9; i++)temp[i] = tab[i];//1
                 for(int i = 0; i< 9; i++)best[i] = 0;//2
                 for(int i = 0; i < 9 ; i++)best[i] = Ai(i);//3
                 for(int i = 0; i < 9 ; i++)if(maior < best[i]){//4
                                 maior = best[i];
                                 melhor = i;
                                 }
             for(int i = 0; i< 9; i++)best[i] = 0;//22
                 for(int i = 0; i< 9; i++)tab[i] = temp[i];//5
                 if(tab[melhor] == '-')tab[melhor] = X;//6
               
                return melhor;          
             
         }
int Galo::Ai(int change){
         int w = 0, l = 0;
         int jogavel;
         for(int i = 0; i< 9; i++)tab[i] = temp[i];
       
         if(tab[change] == '-'){
                                        jogavel = 1;
                                        tab[change]= X;
                                        if(Ganha()){
                                                                //cout << "\t\t\t\tganha Já.";
                                                                w = 10000;
                                                                Restart();
                                                                return w;
                                                                }
                                        /*Testa se o adverssário ganha por não jogar para essa casa*/
                                        tab[change]= O;
                                        if(Perde()){
                                                                //cout << "\t\t Perde se não joga-se para "<<change<<".";
                                                                w = 10000;
                                                                tab[change]= X;
                                                                Restart();
                                                                return w;
                                                                }
                                        //repõe o estado anterior
                        tab[change]= X;
         for(int i = 0; i < 9; i++)if(tab[i] == '-'){
         for(int a = 0; a < 9; a++)if(tab[a] == '-'){
         for(int b = 0; b < 9; b++)if(tab[b] == '-'){
         for(int c = 0; c < 9; c++)if(tab[c] == '-'){
         for(int d = 0; d < 9; d++)if(tab[d] == '-'){                  
                         if(tab[d] == '-')tab[d] = O;
                         if(tab[c] == '-')tab[c] = X;
                         if(tab[b] == '-')tab[b] = O;
                         if(tab[a] == '-')tab[a] = X;
                         if(tab[i] == '-')tab[i] = O;
                         if(Ganha() && jogavel == 1){
                                                 w++;
                                                  }
                         tab[d] = '-';
                         tab[c] = '-';
                         tab[b] = '-';
                         tab[a] = '-';
                         tab[i] = '-';
                         }
                         }             
                         }
                         }
                         }
                         }
                         Restart();
                         return w;
                       
         }

int Galo::Ganha(){
         if((tab[0] == X) && (tab[1] == X)&& (tab[2] == X))return 1;
         if((tab[3] == X) && (tab[4] == X)&& (tab[5] == X))return 1;
         if((tab[6] == X) && (tab[7] == X)&& (tab[8] == X))return 1;
         if((tab[0] == X) && (tab[3] == X)&& (tab[6] == X))return 1;
         if((tab[1] == X) && (tab[4] == X)&& (tab[7] == X))return 1;
         if((tab[2] == X) && (tab[5] == X)&& (tab[8] == X))return 1;
         if((tab[0] == X) && (tab[4] == X)&& (tab[8] == X))return 1;
         if((tab[6] == X) && (tab[4] == X)&& (tab[2] == X))return 1;
         return 0;
         }
int Galo::Perde(){
         if(tab[0] == O&& tab[1] == O&& tab[2] == O)return 1;
         if(tab[3] == O&& tab[4] == O&& tab[5] == O)return 1;
         if(tab[6] == O&& tab[7] == O&& tab[8] == O)return 1;
         if(tab[0] == O&& tab[3] == O&& tab[6] == O)return 1;
         if(tab[1] == O&& tab[4] == O&& tab[7] == O)return 1;
         if(tab[2] == O&& tab[5] == O&& tab[8] == O)return 1;
         if(tab[0] == O&& tab[4] == O&& tab[8] == O)return 1;
         if(tab[6] == O&& tab[4] == O&& tab[2] == O)return 1;
         return 0;     
         }

Código (C++):
#include <cstdlib>
#include <iostream>
#include "galo.h"
using namespace std;

int main(int argc, char *argv[])
{
        Galo g('O', 'X');
        int a;
        g.Play();
       
    system("PAUSE");
    return EXIT_SUCCESS;
}


#2 TheDark

TheDark

    Unsigned User

  • Membro
  • PipPipPipPipPipPip
  • 4012 mensagens

Publicado 29 de Maio de 2008 - 18:10

lol, faz-me lembrar um que fiz há uns anos em Javascript.

Claro que levei nas orelhas por usar excesso de ifs.

#3 hristosax

hristosax

    Boolean User

  • Membro
  • PipPipPip
  • 224 mensagens

Publicado 02 de Setembro de 2009 - 22:59

Nao percebo para que é que é o ultimo codigo que puseste. Que ficheiro é?

#4 Triton

Triton

    Stack Overflow

  • Membro
  • PipPipPipPipPipPipPip
  • 8490 mensagens

Publicado 03 de Setembro de 2009 - 11:20

Tens o código cheio de "copy-paste". Bem podias torná-lo mais modular e compacto. :D

#5 hristosax

hristosax

    Boolean User

  • Membro
  • PipPipPip
  • 224 mensagens

Publicado 04 de Setembro de 2009 - 14:50

Diz para que é o ultimo codigo que puseste! Estou à espera de resposta :/

#6 Triton

Triton

    Stack Overflow

  • Membro
  • PipPipPipPipPipPipPip
  • 8490 mensagens

Publicado 04 de Setembro de 2009 - 15:09

Ver Mensagemhristosax, em 04 de Setembro de 2009 - 14:50, disse:

Diz para que é o ultimo codigo que puseste! Estou à espera de resposta :/

É o ficheiro que contém a função main e chama a classe do jogo.

#7 hristosax

hristosax

    Boolean User

  • Membro
  • PipPipPip
  • 224 mensagens

Publicado 04 de Setembro de 2009 - 18:19

Ver MensagemTriton, em 04 de Setembro de 2009 - 15:09, disse:

É o ficheiro que contém a função main e chama a classe do jogo.

Mas então e o segundo? Eu pensava que era esse.

O primeiro é header, necessário e que se adiciona, no visual C++ da MS, nos Header Files. Isso é claro.

mas então e os outros 2? onde ponho cada um.

O segundo deve ser Resource file?

#8 Triton

Triton

    Stack Overflow

  • Membro
  • PipPipPipPipPipPipPip
  • 8490 mensagens

Publicado 04 de Setembro de 2009 - 18:23

O segundo é um source file, que pelos comentários no topo, se chama galo.cpp.

#9 hristosax

hristosax

    Boolean User

  • Membro
  • PipPipPip
  • 224 mensagens

Publicado 04 de Setembro de 2009 - 18:51

Ver MensagemTriton, em 04 de Setembro de 2009 - 18:23, disse:

O segundo é um source file, que pelos comentários no topo, se chama galo.cpp.

Nunca me senti tão burro na minha vida :/

Enfim.. :/

#10 Triton

Triton

    Stack Overflow

  • Membro
  • PipPipPipPipPipPipPip
  • 8490 mensagens

Publicado 04 de Setembro de 2009 - 20:04

Ver Mensagemhristosax, em 04 de Setembro de 2009 - 18:51, disse:

Nunca me senti tão burro na minha vida :/

Enfim.. :/

Se ainda não percebeste explica porquê (e o quê), que eu tento explicar de outra forma.

#11 hristosax

hristosax

    Boolean User

  • Membro
  • PipPipPip
  • 224 mensagens

Publicado 04 de Setembro de 2009 - 22:40

Ver MensagemTriton, em 04 de Setembro de 2009 - 20:04, disse:

Se ainda não percebeste explica porquê (e o quê), que eu tento explicar de outra forma.

Nao, eu percebi.
So me senti burro porque nao tinha percebido à primeira

#12 Tedim

Tedim

    null

  • Novo Membro
  • Pip
  • 2 mensagens

Publicado 29 de Junho de 2012 - 04:55

Essa aí não é imbatível, longe disso :P
Esta printscreen mostra eu a ganhar, apesar da tua "raivosa e amuada" AI dizer que perdi no fim (ahah), mas podes ver a sequência.
http://goo.gl/T459B

Explico então os passos
- (EU) Primeira linha, segunda coluna para me preparar para o canto superior direito ou esquerdo.
- (PC) Centro
- (EU) Segunda linha, terceira coluna para depois bloquear o canto superior direito e ter duas opções de vitória. Nesta situação a tua AI devia parar-me ou obrigar-me a não jogar lá
- (PC) Canto inferior esquerdo. Exactamente o canto que me obriga a bloquear o canto superior direito, e portanto, a ganhar.

Erros:
  • Uma AI destas com TANTOS ciclos 'for' é bastante difícil, e ouso dizer, impossível de fazer. A maioria das acções da AI são 'if's visto que tens de prever todas as situações possíveis e antecipa-las desde as jogadas anteriores.
  • A tua AI responde SEMPRE da mesma maneira, isto não é uma AI, são respostas de código simples, que por sua vez estão a falhar, e isso porque, lá está, está tudo em ciclos 'for'.
  • A AI deveria, já que é o jogador a começar, preocupar-se em na primeira jogada ver se seria possível ganhar logo (Sim no jogo do galo da para ver isto). Se não fosse possível, impedir o jogador de ganhar.
  • Em outra printscreen podes ver como consigo substituir as jogadas da AI por jogadas minhas, e acabo por ficar com o campo com 2 linhas feitas e 5 cruzes minhas contra 1 bola da AI. http://goo.gl/b2CR6
Admira-me como ninguém dos que respondeu neste post tenha percebido ou ponderado isto após ver tantos ciclos 'for'. Foi logo o primeiro pensamento que me veio à cabeça quando vi o spam de 'for's :P

Cumprimentos