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;
 }
Beispiel #2
0
 /// <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;
 }
Beispiel #3
0
        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();
                }));
            });
        }
Beispiel #7
0
 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
         }
     }
 }
Beispiel #9
0
 /// <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;
 }
Beispiel #10
0
        /// <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;
            }
        }
Beispiel #11
0
 /// <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);
 }
Beispiel #12
0
 /// <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);
     }
 }
Beispiel #13
0
 /// <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);
             }
         }
     }
 }