public MainWindow() { InitializeComponent(); allowedMouv = new SuggMap(); sugg = new Suggestion(); listUnitSelected = new List<Unite>(); tileFactory = new ImageFactory(); _pool = new Semaphore(0, 1); _poolInit = new Semaphore(0, 1); selectionRectangle = new SelectedRect(); selectionRectangle.Visibility = Visibility.Collapsed; filename = "saveSmallWorld"; saved = true; neverSaved = true; }
/// <summary> /// Retourne la liste des meilleurs coordonnees en fonction de coefficient de suggestion /// </summary> /// <param name="allowedMouv"></param> /// <returns></returns> private List<Coordonnees> getMeilleursDeplacements(SuggMap allowedMouv) { List<Coordonnees> coord = new List<Coordonnees>(); int max = 0; foreach (var pair in allowedMouv) { if (pair.Value.Sugg > max) { coord.Clear(); coord.Add(pair.Key); max = pair.Value.Sugg; } else if (pair.Value.Sugg == max && max != 0) { coord.Add(pair.Key); } } return coord; }
private static SuggMap listIntToSuggMap(Carte carte, List<int> sugg) { SuggMap res = new SuggMap(); for (int i = 0; i < carte.Largeur; i++) { for (int j = 0; j < carte.Hauteur; j++) { SuggData data = new SuggData(); data.Sugg = sugg[i * carte.Hauteur + j]; res[new Coordonnees(i, j)] = data; } } for (int i = 0; i < carte.Largeur; i++) { for (int j = 0; j < carte.Hauteur; j++) { res[new Coordonnees(i, j)].Depl = sugg[carte.Largeur * carte.Hauteur + (i * carte.Hauteur + j)]; } } return res; }
private void Rectangle_MouseDown(object sender, MouseButtonEventArgs e) { if (!partie.Finpartie) { var rect = sender as Tile; int column = (int)Canvas.GetLeft(rect) / 50; int row = (int)Canvas.GetTop(rect) / 50; Canvas.SetLeft(selectionRectangle, Canvas.GetLeft(rect)); Canvas.SetTop(selectionRectangle, Canvas.GetTop(rect)); Canvas.SetZIndex(selectionRectangle, 3); selectionRectangle.selectRect.Stroke = (SolidColorBrush)new BrushConverter().ConvertFromString(partie.joueurActuel().Couleur); selectionRectangle.Visibility = Visibility.Visible; selectionRectangle.TileSelected = rect; selectionRectangle.Coord = new Coordonnees(column, row); if (listUnitSelected.Count > 0 && allowedMouv.Count > 0) { partie.Carte.deplaceUnites(listUnitSelected, new Coordonnees(column, row), allowedMouv); listUnitSelected.Clear(); saved = false; } else { allowedMouv = null; afficherSuggestions(); } afficheCarte(); actualisePanneauDroit(); } }
/// <summary> /// Actualise l'interace graphique dans le Thread de la fenêtre /// </summary> private void rafraichirInterface() { Dispatcher.BeginInvoke(new Action(() => { allowedMouv = null; listUnitSelected.Clear(); afficheCarte(); afficherSuggestions(); actualisePanneauDroit(); actualisePanneauGauche(); _pool.Release(); })); }
/// <summary> /// Charge les suggestions et les affiche /// </summary> private void loadDataSuggestion() { Task.Factory.StartNew(() => { Unite unit = uniteAvecMoinsDepl(); allowedMouv = sugg.getSuggestion(partie.Carte, unit); // on charge les suggestions pour cette unités ( et qui servira pour toutes les unités select) this.Dispatcher.BeginInvoke(new Action(() => { afficheCarte(); afficherSuggestions(); })); }); }
private void testDeplacementApresCombat(Unite unit, SuggMap sugg, ref Coordonnees coordApres, ref int deplMax, Coordonnees tmp) { if (caseAccessible(tmp, unit, sugg) && sugg[tmp].Depl > deplMax) { deplMax = sugg[tmp].Depl; coordApres = tmp; } }
private void grpUnit_MouseDown(object sender, MouseButtonEventArgs e) { var grp = (GroupeUnite)sender; if (grp.Selected) // si on selectionne l'unité { if (grp.Unit.PointsDepl > 0) // et qu'elle lui reste des points de déplacements { listUnitSelected.Add(grp.Unit); // on l'ajout à la liste des unités séléctionnées loadDataSuggestion(); // et on réactualise l'affichage des suggestions de déplacements } } else // sinon on la désélectionne { listUnitSelected.Remove(grp.Unit); // on la retire de la liste if (listUnitSelected.Count == 0) // si plus aucune unité n'est sélectionné { afficheCarte(); allowedMouv = null; // on supprime l'affichage des suggestions afficherSuggestions(); } else { loadDataSuggestion(); //sinon on réactualise l'affichage des suggestions avec les unités restantes } } }
/// <summary> /// Rapproche l'unité au plus pret de la destination /// </summary> /// <param name="unit">l'unité a déplacé</param> /// <param name="destCoord">la case de déstination</param> /// <param name="sugg">Les suggestions</param> private void rapprocheAuPlusPret(Unite unit, Coordonnees destCoord, SuggMap sugg) { Coordonnees coordApres = null; int deplMax = int.MinValue; //OUEST Coordonnees tmp = new Coordonnees(destCoord.X - 1, destCoord.Y); testDeplacementApresCombat(unit, sugg, ref coordApres, ref deplMax, tmp); //EST tmp = new Coordonnees(destCoord.X + 1, destCoord.Y); testDeplacementApresCombat(unit, sugg, ref coordApres, ref deplMax, tmp); //NORD tmp = new Coordonnees(destCoord.X, destCoord.Y - 1); testDeplacementApresCombat(unit, sugg, ref coordApres, ref deplMax, tmp); //SUD tmp = new Coordonnees(destCoord.X, destCoord.Y + 1); testDeplacementApresCombat(unit, sugg, ref coordApres, ref deplMax, tmp); unit.Coord = coordApres; }
/// <summary> /// Fait combattre 2 unités, et fait les déplacements appropriés en cas de victoire de l'attaquant. /// </summary> /// <param name="unit"></param> /// <param name="unitDef"></param> /// <param name="destCoord"></param> /// <param name="sugg"></param> private void combat(Unite unit, Unite unitDef, Coordonnees destCoord, SuggMap sugg) { unit.attaquer(unitDef); if (!unit.estEnVie()) { unites.Remove(unit); } if (!unitDef.estEnVie()) { unites.Remove(unitDef); if (getUniteFromCoord(destCoord).Count == 0) { unit.Coord = destCoord; } else { if (!estAdjacent(destCoord, unit.Coord)) // si l'unité n'est pas sur une case adjacente à l'adversaire, on rapproche l'unité { rapprocheAuPlusPret(unit, destCoord, sugg); } } unit.PointsDepl = sugg[destCoord].Depl; } }
/// <summary> /// Teste si la cases est accessible à une unité. C-a-d que la case est vide ou qu'elle contient des unités du même joueur /// et que les suggestions le permettent /// </summary> /// <param name="c">la coordonnees de destination</param> /// <param name="u">l'unité qui doit se déplacer</param> /// <returns>vrai si la case est accessible, faux sinon</returns> private bool caseAccessible(Coordonnees c, Unite u, SuggMap sugg) { List<Unite> listUniteCase = getUniteFromCoord(c); return coordInBound(c) && sugg[c].Sugg > 0 && listUniteCase.Count == 0 || (listUniteCase.Count > 0 && listUniteCase[0].IdProprietaire == u.IdProprietaire); }
/// <summary> /// Déplace la liste d'unités /// </summary> /// <param name="u"></param> /// <param name="destCoord"></param> /// <param name="sugg"></param> public void deplaceUnites(List<Unite> u, Coordonnees destCoord, SuggMap sugg) { foreach(Unite unit in u) { deplaceUnite(unit, destCoord, sugg); } }
/// <summary> /// Déplace un unité sur la case de destination. /// Attaque les unités ennemis présentes sur la case et se déplace après le combat si la case est vide /// </summary> /// <param name="unit">l'unité à déplacé</param> /// <param name="destCoord">coordonnees de la case de destination</param> /// <param name="sugg">les suggesions de deplacement</param> public void deplaceUnite(Unite unit, Coordonnees destCoord, SuggMap sugg) { if (sugg.Keys.Contains(destCoord) && sugg[destCoord].Sugg > 0) { List<Unite> dest = getUniteFromCoord(destCoord); if (unites.Contains(unit)) { if (caseAccessible(destCoord, unit,sugg)) // si case vide ou case avec alliés { unit.Coord = destCoord; unit.PointsDepl = sugg[destCoord].Depl; } else // sinon combat { Unite unitDef = getMeilleurUniteDef(dest); combat(unit, unitDef, destCoord, sugg); } } } }