private Piece piece; // Une case peut être lié à une piece #endregion Fields #region Constructors // COnstructeur de case public Case(int x, int y, Piece piece = null) { this.x = x; this.y = y; this.piece = piece; estColore = false; }
// Methode de jeu principale public void lancerJeu() { while (!estPerdu) // Boucle infinie { resetEvent.WaitOne(); // Attente d'un signal double palier = Math.Round(COMPTEUR_LIGNE_COMPLETE / 10.0) * 10; // Définission du niveau if (intervalle[palier] > 50) // Si le niveau est supérieur a 50ms d'intervalle { Thread.Sleep(intervalle[palier]); // Alors on le set avec le dictionnaire } else { Thread.Sleep(50); // Sinon on le set a 50 } if (pieceCourante.PeuxDescendre()) // Si la piece peux descendre { pieceCourante.descendre(); for (int i = 0; i < NB_CASE_HAUTEUR; i++) // Parcours de chaque ligne { if (ligneEstComplete(plateau, i)) // Si elle est complete { IWavePlayer waveOut = new WaveOut(); AudioFileReader reader = new AudioFileReader("Musiques/lineComplete.mp3"); waveOut.Init(reader); waveOut.Play(); COMPTEUR_LIGNE_COMPLETE++; score += pointLigneComplete; // Suppression de la ligne for (int j = 0; j < NB_CASE_LARGEUR; j++) { plateau[j, i].estColore = false; } // Décaler toutes les lignes au dessus dans le plateau decalerLignesAuDessus(i); OnLineCompleteEvent(new LigneCompleteEvent()); } } } else if (gameOver()) // Sinon si gameOver { pieceApres = null; pieceCourante.decolorerPiece(); // On décolore la piece estPerdu = true; RaiseCustomEvent = null; // On supprime les evenements waveOutDevice.Stop(); // On arrête la musique de Tetris new Task(() => { AudioFileReader reader = new AudioFileReader("Musiques/gameover.wav"); WaveOut newWaveOut = new WaveOut(); newWaveOut.Init(reader); newWaveOut.Play(); }).Start(); // Et on lance de façon asynchrone la musique de gameOver for (int i = 0; i < NB_CASE_HAUTEUR; i++) { for (int j = 0; j < NB_CASE_LARGEUR; j++) { plateau[j, i].estColore = false; } } OnGameOverEvent(new GameOverEvent()); // On notifie l'evenement GameOver } else // Sinon on doit faire apparaitre la pièce suivante { score += pointFinish; // Parcours de la piece for (int i = 0; i < pieceCourante.hauteurPiece; i++) // On inscris la pièce dans le plateau { for (int j = 0; j < pieceCourante.largeurPiece; j++) { Case c = pieceCourante.representation[j, i]; if (c.estColore) { if (c.y < 16) { plateau[c.x, c.y] = c; if (plateau[c.x, c.y].estColore && c.y == 0) { estPerdu = true; } } } } } pieceCourante = pieceApres; pieceApres = pieceSuivante();// On génére la pièce suivante OnPieceSuivanteEvent(new PieceSuivanteEvent()); OnPeuxDescendreEvent(new PeuxDescendreEvent()); } OnRaiseCustomEvent(new RafraichirGUIEvent()); // Rafraichissement du GUI } }
// Permet de copier une case (Utile pour le décalage de ligne dans le plateau) public void ClonerCase(Case aCloner) { this.estColore = aCloner.estColore; this.piece = aCloner.piece; }