• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

ajcosta01

[C++] Jogo do Galo

12 posts in this topic

/*
 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

/*
 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;	
 }

#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;
}

0

Share this post


Link to post
Share on other sites

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

Claro que levei nas orelhas por usar excesso de ifs.

0

Share this post


Link to post
Share on other sites

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

0

Share this post


Link to post
Share on other sites

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

0

Share this post


Link to post
Share on other sites

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

0

Share this post


Link to post
Share on other sites

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.

0

Share this post


Link to post
Share on other sites

É 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?

0

Share this post


Link to post
Share on other sites

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

0

Share this post


Link to post
Share on other sites

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.. :/

0

Share this post


Link to post
Share on other sites

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.

0

Share this post


Link to post
Share on other sites

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

0

Share this post


Link to post
Share on other sites

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:

  1. 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.
  2. 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'.
  3. 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.
  4. 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

0

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now