/*
* Classe principale du jeu Pacman. Représente le jeu Pacman dont le but est de manger
* toutes les pillules sans se faire attraper par les fantômes.
* Créer par Charles Lachance et Tommy Bouffard
*/
using System;
using System.Drawing;
using System.IO;
using System.Windows.Forms;
using System.Windows.Input;
using Pacman.Properties;
using PathFinder;
namespace Pacman
{
public class PacmanGame
{
//
//Hauteur du formulaire du jeu
public const int ELEMENT_HEIGHT = 20;
//Largeur du formulaire du jeu
public const int ELEMENT_WIDTH = 20;
//Pacman du jeu
private Pacman pacman = null;
//Nombre de fantômes dans le jeu
private const int NB_GHOSTS = 4;
//Tableau des fantômes dans le jeu
private Ghost[] ghosts = new Ghost[NB_GHOSTS];
//
//
//Le niveau du jeu actuel
private PacmanGrid grid = null;
///
/// Constructeur du jeu de Pacman
///
public PacmanGame()
{
pacman = new Pacman();
ghosts = new Ghost[NB_GHOSTS];
grid = new PacmanGrid();
}
///
/// Met à jour le jeu et détermine si la partie est terminée
///
/// Retourne si le joueur a perdu/gagné ou si la partie n'est pas terminée
public EndGameResult Update()
{
//Pour chaque fantôme du jeu...
foreach (Ghost ghost in ghosts)
{
//Si le fantôme existe...
if (ghost != null)
{
//On met à jour le fantôme
ghost.Update(grid, pacman);
//Si un fantôme est à la même position que le pacman...
if (ghost.GetX() == (int)pacman.GetX()/ELEMENT_WIDTH && ghost.GetY() == (int)pacman.GetY()/ELEMENT_HEIGHT)
{
//Le joueur a perdu
return EndGameResult.Loose;
}
}
}
//Si la flèche droite est pressée...
if (Keyboard.IsKeyDown(Key.Right))
{
//On essaie de déplacer le pacman vers la droite
pacman.Move(Direction.East, grid);
}
else if (Keyboard.IsKeyDown(Key.Up)) //Si la flèche haut est pressée...
{
//On essaie de déplacer le pacman vers le haut
pacman.Move(Direction.North, grid);
}
else if (Keyboard.IsKeyDown(Key.Left)) //Si la flèche gauche est pressée...
{
//On essaie de déplacer le pacman vers la gauche
pacman.Move(Direction.West, grid);
}
else if (Keyboard.IsKeyDown(Key.Down)) //Si la flèche bas est pressée...
{
//On essaie de déplacer le pacman vers le bas
pacman.Move(Direction.South, grid);
}
//Si toutes les pillules ont été mangé...
if (grid.GetPillCount() == 0)
{
//Le joueur a gagné
return EndGameResult.Win;
}
return EndGameResult.NotFinished;
}
///
/// Affiche le jeu à l'écran
///
/// Objet permettant de dessiner à l'écran
public void Draw(Graphics g)
{
//Pour chaque colonne du niveau du jeu...
for (int i = 0; i < grid.GetWidth(); i++)
{
//Pour chaque ligne du niveau du jeu...
for (int j = 0; j < grid.GetHeight(); j++)
{
//Si l'élément à la position (i,j) est un...
switch (grid.GetMazeElementAt(i, j))
{
case PacmanElement.Pacman: //Pacman
//On déplace le centre pour dessiner
g.TranslateTransform(i * ELEMENT_WIDTH + ELEMENT_WIDTH / 2, j * ELEMENT_HEIGHT + ELEMENT_HEIGHT/2);
//Si le pacman regarde vers...
switch (pacman.GetDirection())
{
case Direction.North: //Le nord
//On tourne le pacman
g.RotateTransform(270f);
break;
case Direction.West: //L'ouest
//On tourne le pacman
g.RotateTransform(180f);
break;
case Direction.South: //Le sud
//On tourne le pacman
g.RotateTransform(90f);
break;
default:
break;
}
//On dessine le pacman
g.DrawImage(Resources.pacman_moving,
-ELEMENT_WIDTH / 2,
-ELEMENT_HEIGHT / 2,
ELEMENT_WIDTH,
ELEMENT_HEIGHT);
//On réinitialise les tranformations
g.ResetTransform();
break;
case PacmanElement.Wall: //Mur
//On dessine un mur
g.DrawImage(Resources.Wall,
i * ELEMENT_WIDTH,
j * ELEMENT_HEIGHT,
ELEMENT_WIDTH,
ELEMENT_HEIGHT);
break;
//
case PacmanElement.Pill: //Pillule
//On dessine une pillule
g.DrawImage(Resources.Pill,
i * ELEMENT_WIDTH,
j * ELEMENT_HEIGHT,
ELEMENT_WIDTH,
ELEMENT_HEIGHT);
break;
case PacmanElement.SuperPill: //Super Pillule
//On dessine une super pillule
g.DrawImage(Resources.SuperPill,
i * ELEMENT_WIDTH,
j * ELEMENT_HEIGHT,
ELEMENT_WIDTH,
ELEMENT_HEIGHT);
break;
}
}
}
//Pour chaque fantôme du jeu...
foreach (Ghost ghost in ghosts)
{
//Si le fantôme existe...
if (ghost != null)
{
//On affiche le fantôme
ghost.Draw(g,ELEMENT_WIDTH,ELEMENT_HEIGHT);
}
}
}
///
/// Obtient le pacman du jeu
///
/// Retourne le pacman du jeu
public Pacman GetPacman()
{
return pacman;
}
//
///
/// Charge un niveau du jeu
///
/// Le chemin d"accès du niveau
public void LoadGrid(string path)
{
try
{
//On recrée le tableau des fantômes pour se débarasser de ceux du niveau précédent
ghosts = new Ghost[NB_GHOSTS];
//On initialise la grille du jeu
grid.InitFrom(File.ReadAllText(path));
//Pour chaque élément de la grille du jeu...
for (int i = 0; i < grid.GetWidth(); i++)
{
for (int j = 0; j < grid.GetHeight(); j++)
{
//Si l'élément est le pacman...
if (grid.GetMazeElementAt(i, j) == PacmanElement.Pacman)
{
//On initialise la position du pacman
pacman.SetX(i * ELEMENT_WIDTH);
pacman.SetY(j * ELEMENT_HEIGHT);
return;
}
}
}
}
catch (Exception ex) //Erreur
{
//
//On affiche le message d'erreur
MessageBox.Show(ex.Message, "Erreur de chargement", MessageBoxButtons.OK, MessageBoxIcon.Error);
Application.Exit();
}
}
///
/// Crée les instances du fantômes dans la partie.
///
public void SpawnGhosts()
{
int ghostNumber = 0;
if (ghosts[ghosts.Length - 1] == null && ghosts[ghosts.Length-2] == null && ghosts[0] == null && ghosts[1]==null)
{
for (int i = 0; i < grid.GetWidth(); i++)
{
for (int j = 0; j < grid.GetHeight(); j++)
{
if (grid.GetMazeElementAt(i, j) == PacmanElement.Ghost)
{
ghosts[ghostNumber] = new Ghost(i, j);
ghostNumber++;
}
}
}
}
}
//
///
/// Obtient la taille que le jeu prend dans la fenêtre
///
/// Retourne la taille que le jeu prend dans la fenêtre
public Size GetSize()
{
return new Size(grid.GetWidth() * ELEMENT_WIDTH, grid.GetHeight() * ELEMENT_HEIGHT);
}
//
}
}