All pastes #337851 Raw Edit

Someone

public text v1 · immutable
·published 2007-02-03 00:43 UTC
rendered paste body
// main.cxx : fichier principal du jeu d'echec
//
// auteur : MEHEUST Aurélien
//



# include <iostream>
#include <string>
# include "AbstractCharacter.hxx"
# include "Character.hxx"
#include "Pawn.hxx"
#include "Math.hxx"
#include "Player.hxx"
#include "Game.hxx"
#include "Ui.hxx"



using namespace std;


class Character *making_Character(string);


int main(int argc, char* argv[])
{
	// texte d'introduction du programme de jeu d'echec
	cout << "TP C++ (1/2) -- JEU D'ECHECS -- Groupe 3CT105 (Mulot, Fanet, Meheust)" << endl;
	cout << endl;



	// declaration des 2 joueurs
	PLAYER *Player[PLAYER_LAST];

	Player[WHITE_PLAYER]=new PLAYER(WHITE);
	Player[BLACK_PLAYER]=new PLAYER(BLACK);

	// declaration des 2 joueurs fictifs utilisés pour verifier 
	// si les coups de chacun sont faisables.
	PLAYER *test_white;
	PLAYER *test_black;
	
	// declaration des 2 pointeurs pour le joueur attaquant et le defenseur
	PLAYER *offensive ;
	PLAYER *defensive ;

	// Declaration du pointeur qui recevra les resultats de 
	// l'ensemble de la ligne d'instruction PGN
	Double_Strike *pgn_result = NULL;

	// Declaration du pointeur qui recevra les resultats de 
	// l'instruction PGN pour l'attaquant uniquement
	Strike *offensive_strike = NULL;

	// Declaration du pointeur pour la piece déplacée lors du tour d'un joueur
	Character* piece_played=NULL;

	// declaration de la chaine qui contiendra la ligne courante 
	// du fichier ou du clavier
	string line;

	// declaration de la variable de boucle for utilisée pour l'analyse alternée 
	// des coups de chacun des 2 joueurs
	int tour=1;

	// variable booléenne de test si il y a echec ou non, erreur ou non dans le coup 
	bool test=false;
	bool echec=false;

	// instanciation d'un objet de type Game pour gerer la partie
	Game game;

	// création de l'interface d'entrée/ sortie soit par fichier, soit par l'entrée standard
	Ui *in;
	Ui *out;




	// si on saisit quelque chose en parametre, le premier correspond au fichier en lecture
	if (argc >= ONE_ARG_INPUT)
	{
		in= Ui::Create(argv[1],1);
	}
	// sinon on utilise le clavier comme entrée
	else
	{
		in= Ui::Create("",1);
	}

	// s'il est saisi, le second parametre correpond au nom du fichier d'ecriture
	if (argc >= TWO_ARG_INPUT)
	{
		out= Ui::Create(argv[FILE_ON_OUTPUT],FILE_ON_OUTPUT);
	}
	// sinon, on affiche par défaut les résultats à l'écran
	else
	{
		out= Ui::Create("",FILE_ON_OUTPUT);
	}



	// création de l'echiquier de debut de partie en vue de son affichage
	out->Update_Chessboard(Player[WHITE_PLAYER],Player[BLACK_PLAYER]);

	// affichage en sortie fichier ou ecran de l'echiquier de depart
	out->Display_Chessboard();



	// boucle principale du programme
	// on la quitte quand on ne lit plus rien dans le fichier...
	//...OU qu'on ne saisit rien au clavier
	//...OU qu'on saisit "quit" au clavier !!!
	while(1)
	{
		// la chaine line contient la ligne courante du fichier/clavier
		line = in->Read();

		// si on saisit rien ou "quit" ou qu'on est arrivé à la fin du fichier
		// alors on quitte l'application
		if (line == "" || line == "quit") break;



		// on affiche à l'ecran ou on inscrit dans le fichier de sortie
		// la saisie precedente suivie d'un espace
		out->Display(line);
		out->Display("   ");

		// on decode l'instruction au format lue en entrée
		// et on inscrit le resultat de l'analyse dans le Double_Strike pgn_result
		pgn_result=out->Sort(line);

		


		// si aucune erreur de saisie d'instruction au format pgn n'est décelé
		// OU que l'on a pas saisi d'instruction classique du type "N. xxx yyy"
		// (d'ou le fait que le prochain traitement est inutile...)
		if(!pgn_result->get_Error())
		{
			// on va tester si les coups saisis sont realisables
			// pour cela, on passe par des pointeurs PLAYER * qui vont etre des doublures des vrais joueurs, 
			// tout ceci, dans le but de verifier l'integrité avant de modifier DEFINITIVEMENT les donnees
			test_white = new PLAYER( Player[WHITE_PLAYER] );
			test_black = new PLAYER( Player[BLACK_PLAYER] );




			// boucle de test de validité du coup de chaque joueur à partir des données
			// de pgn_result...
			for(tour=1; tour<=2; tour++)
			{
				// on commence par le coup du joueur BLANC
				if(tour==1)
				{
					offensive=test_white;
					defensive=test_black;
					offensive_strike=pgn_result->get_White();

				}
				// ensuite au deuxieme passage, on traite le coup du joueur NOIR
				else
				{
					defensive=test_white;
					offensive=test_black;
					offensive_strike=pgn_result->get_Black();
				}


				// identification des differents coups spéciaux réalisables

				// si une petite roque est demandée
				if(offensive_strike->get_Little_Roque())
				{




				}

				// si une grande roque est demandée
				else if(offensive_strike->get_Great_Roque())
				{




				}
				
				// cas où une prise en passant est effectuée
				else if(offensive_strike->get_En_Passant())
				{




				}

				// cas ou une promotion est detectée
				else if(offensive_strike->get_Promotion())
				{
				
				
				
				
				
				}

				// cas de base où aucun coup spécial n'est réalisé par l'attaquant
				else
				{
					test=game.Move(offensive,defensive,offensive_strike);
				}


                //test de l'echec uniquement si la variable test vaut 1
                if(test)
                {
					echec=game.Echec(offensive,defensive);
                }

                // si test vaut 0 et echec 1 suite a l'appel de game.echec alors...
                if(!test || echec)
                {
					out->Display("Coup impossible pour le joueur ");
					if (tour==1) out->Display_Line("BLANC");
					else out->Display_Line("NOIR");

					// on quitte la boucle de traitement des coups
					break;
                } 
			}
			// fin de la boucle de test de validité du coup des 2 joueurs

			
			// on desalloue la memoire aux deux joueurs fictifs...
			delete(test_white);
			delete(test_black);


			// on ne modifie reellement l' echiquier
			// QUE si le coup de CHAQUE joueur est valide
			if(test && !echec)
			{
				// boucle de traitement du coup de chaque joueur à partir des données
				// de pgn_result...
				for(tour=1; tour<=2; tour++)
				{
					// on commence par le coup du joueur BLANC
					if(tour==1)
					{
						offensive=Player[WHITE_PLAYER];
						defensive=Player[BLACK_PLAYER];
						offensive_strike=pgn_result->get_White();

					}
					// ensuite au deuxieme passage, on traite le coup du joueur NOIR
					else
					{
						defensive=Player[WHITE_PLAYER];
						offensive=Player[BLACK_PLAYER];
						offensive_strike=pgn_result->get_Black();
					}


					// identification des differents coups spéciaux réalisables

					// si une petite roque est demandée
					if(offensive_strike->get_Little_Roque())
					{




					}

					// si une grande roque est demandée
					else if(offensive_strike->get_Great_Roque())
					{




					}
					
					// cas où une prise en passant est effectuée
					else if(offensive_strike->get_En_Passant())
					{




					}

					// cas ou une promotion est detectée
					else if(offensive_strike->get_Promotion())
					{
					
					
					
					
					
					}

					// cas de base où aucun coup spécial n'est réalisé par l'attaquant
					else
					{
						test=game.Move(offensive,defensive,offensive_strike);
					}

/*
					//test de l'echec uniquement si la variable test vaut 1
					if(test)
					{
						echec=game.Echec(offensive,defensive);
					}

					// si test vaut 0 ou que echec vaut 1 suite a l'appel de game.echec alors...
					if(!test || !echec)
					{
						out->Display("Coup impossible pour le joueur ");
						if (tour==1) out->Display_Line("BLANC");
						else out->Display_Line("NOIR");

						// on quitte la boucle de traitement des coups
						break;
					} 
*/
				}
				// fin de la boucle de traitement du coup des 2 joueurs

				// actualisation de l'echiquier en vue de son affichage
				out->Update_Chessboard(Player[WHITE_PLAYER],Player[BLACK_PLAYER]);

				// affichage en sortie fichier ou a l'ecran de l'echiquier actualisé
				out->Display_Chessboard();

			}
			// fin du if correspondant a 2 coups valides


		}	
	}


	return 0;

}