public BattleShipGrid() { InitializeComponent(); EtatGrille = GridState.None; OCurrentShip = PosShips.Orientation.Horizontale; PositionBateau = new PosShips(); }
/// <summary> /// Dessine un bateau individuellement /// </summary> /// <param name="img">l'image du bateau</param> /// <param name="location">la position du bateau</param> /// <param name="orientation">l'orientation du bateau</param> /// <param name="ShipSize">la taille du bateau</param> private void DrawSingleShip(Image img, Point location, PosShips.Orientation orientation, int ShipSize) { if (orientation == PosShips.Orientation.Verticale) { Image carry = (Image)img.Clone(); carry.RotateFlip(RotateFlipType.Rotate90FlipNone); DrawImage(carry, location.X * GridRectWidth, location.Y * GridRectHeight, 1 * GridRectWidth, ShipSize * GridRectHeight); } else { DrawImage(img, location.X * GridRectWidth, location.Y * GridRectHeight, ShipSize * GridRectWidth, 1 * GridRectHeight); } }
/// <summary> /// Retourne si le tir à couler le bateau /// </summary> /// <param name="Hit">Position du tir</param> /// <param name="location">Position du bateau</param> /// <param name="orient">Orientation du bateau</param> /// <param name="longueur">longueur du bateau</param> /// <returns>Si le bateau est toucher couler</returns> private bool ToucherCouler(Point Hit, Point location, PosShips.Orientation orient, int longueur) { if (orient == PosShips.Orientation.Horizontale) { if (Hit.X >= location.X && Hit.X <= location.X + longueur-1 && Hit.Y == location.Y) return true; else return false; } else { if (Hit.Y >= location.Y && Hit.Y <= location.Y + longueur-1 && Hit.X == location.X) return true; else return false; } }
/// <summary> /// Retourne l'état du Hit selon la Hitlist et la grille adverse /// </summary> /// <param name="Hitlist">Liste de tir sur l'adversaire</param> /// <param name="GrilleAdverse">Grille de position adverse</param> /// <returns>État du tir</returns> private Hit.HitState ProcessHit(List<Hit> Hitlist, PosShips GrilleAdverse) { //Porte Avion if (containsHit(Hitlist.Last().Location, GrilleAdverse.PPorteAvion, GrilleAdverse.OPorteAvion, 5)) { if (Hitlist.Count(touche => containsHit(touche.Location, GrilleAdverse.PPorteAvion, GrilleAdverse.OPorteAvion, 5)) == 5) { return Hit.HitState.CoulerPorteAvion; } else return Hit.HitState.Hit; } //Croiseur else if (containsHit(Hitlist.Last().Location, GrilleAdverse.PCroiseur, GrilleAdverse.OCroiseur, 4)) { if (Hitlist.Count(touche => containsHit(touche.Location, GrilleAdverse.PCroiseur, GrilleAdverse.OCroiseur, 4)) == 4) { return Hit.HitState.CoulerCroiseur; } else return Hit.HitState.Hit; } //Contre Torpilleur else if (containsHit(Hitlist.Last().Location, GrilleAdverse.PContreTorpilleur, GrilleAdverse.OContreTorpilleur, 3)) { if (Hitlist.Count(touche => containsHit(touche.Location, GrilleAdverse.PContreTorpilleur, GrilleAdverse.OContreTorpilleur, 3)) == 3) { return Hit.HitState.CoulerContreTorpilleur; } else return Hit.HitState.Hit; } //Sous Marin else if (containsHit(Hitlist.Last().Location, GrilleAdverse.PSousMarin, GrilleAdverse.OSousMarin, 3)) { if (Hitlist.Count(touche => containsHit(touche.Location, GrilleAdverse.PSousMarin, GrilleAdverse.OSousMarin, 3)) == 3) { return Hit.HitState.CoulerSousMarin; } else return Hit.HitState.Hit; } //Torpilleur else if (containsHit(Hitlist.Last().Location, GrilleAdverse.PTorpilleur, GrilleAdverse.OTorpilleur, 2)) { if (Hitlist.Count(touche => containsHit(touche.Location, GrilleAdverse.PTorpilleur, GrilleAdverse.OTorpilleur, 2)) == 2) { return Hit.HitState.CoulerTorpilleur; } else return Hit.HitState.Hit; } else { return Hit.HitState.Flop; } }
/// <summary> /// Si le joueur à gagner /// </summary> /// <param name="Hitlist">Liste de tir sur l'ADVERSAIRE</param> /// <param name="GrilleAdverse">Grille de l'adversaire</param> /// <returns>à Gagner</returns> private bool aGagner(List<Hit> Hitlist, PosShips GrilleAdverse) { //Vérifie si chaque bateau à été couler return Hitlist.Count(touche => containsHit(touche.Location, GrilleAdverse.PPorteAvion, GrilleAdverse.OPorteAvion, 5)) == 5 && Hitlist.Count(touche => containsHit(touche.Location, GrilleAdverse.PCroiseur, GrilleAdverse.OCroiseur, 4)) == 4 && Hitlist.Count(touche => containsHit(touche.Location, GrilleAdverse.PContreTorpilleur, GrilleAdverse.OContreTorpilleur, 3)) == 3 && Hitlist.Count(touche => containsHit(touche.Location, GrilleAdverse.PSousMarin, GrilleAdverse.OSousMarin, 3)) == 3 && Hitlist.Count(touche => containsHit(touche.Location, GrilleAdverse.PTorpilleur, GrilleAdverse.OTorpilleur, 2)) == 2; }
/// <summary> /// Attente de la comfirmation du serveur pour savoir si le Hit /// est un Flop ou un Touché /// </summary> /// <param name="AjoutHit"></param> private void waitHitConfirm(func AjoutHit) { object carry = null; try { carry = CommUtility.ReadAndDeserialize(serveur.GetStream()); AjoutHit((Hit)carry); Lock.WaitOne(); Thread.Sleep(300); State = GameState.WaitingTurn; Lock.ReleaseMutex(); UpdateAction(); } catch(Exception e) { try { if (carry != null) { Result result = (Result)carry; if(result.Etat == Result.ResultState.Victory)//Si la réponse est Victoire { if (result.Touche != null && result.Touche.Etat != Hit.HitState.NoAction) AjoutHit(result.Touche); Lock.WaitOne(); State = GameState.Victory; EnemyShips = result.EnemyShips; Lock.ReleaseMutex(); UpdateAction(); } else//Si la réponse est Perdage { if (result.Touche != null && result.Touche.Etat != Hit.HitState.NoAction) AjoutHit(result.Touche); Lock.WaitOne(); State = GameState.Lose; EnemyShips = result.EnemyShips; Lock.ReleaseMutex(); UpdateAction(); } } else throw; } catch (Exception) { Lock.WaitOne(); State = GameState.ServerDC; Lock.ReleaseMutex(); UpdateAction(); } } }
/// <summary> /// Attend son tour en Thread pour continuer a jouer /// </summary> public void WaitingTurn() { object data = null; try //Essai de convertir l'objet recu en Hit { serveur.ReceiveTimeout = 90000; data = CommUtility.ReadAndDeserialize(serveur.GetStream()); Hit hit = (Hit)data; if (hit.Etat != Hit.HitState.NoAction) AddHitSelf(hit); Lock.WaitOne(); State = GameState.PlayingTurn; Lock.ReleaseMutex(); UpdateAction(); } catch (Exception ex) { try //Si pas convertable en Hit, essai de convertir en result { Result result = (Result)data; if (result.Etat == Result.ResultState.Lose)//si le résultat est "Lose" { if (result.Touche != null && result.Touche.Etat!=Hit.HitState.NoAction) AddHitSelf(result.Touche); Lock.WaitOne(); State = GameState.Lose; EnemyShips = result.EnemyShips; Lock.ReleaseMutex(); } else//si le résultat est "WIN" { if (result.Touche != null && result.Touche.Etat != Hit.HitState.NoAction) AddHitSelf(result.Touche); Lock.WaitOne(); State = GameState.Victory; EnemyShips = result.EnemyShips; Lock.ReleaseMutex(); } UpdateAction(); } catch (Exception es)//Si non convertable, on lance une érreur { Lock.WaitOne(); State = GameState.ServerDC; Lock.ReleaseMutex(); UpdateAction(); } } }
/// <summary> /// Envoie La grille de bateaux au servers /// </summary> /// <param name="grilleBeto"></param> public void EnvoiBateau(PosShips grilleBeto) { CommUtility.SerializeAndSend(serveur.GetStream(), grilleBeto); Lock.WaitOne(); State = Jeu.GameState.WaitingTurn; Lock.ReleaseMutex(); UpdateAction(); }