Avatar billede Spotgun Seniormester
10. august 2010 - 21:37 Der er 5 kommentarer og
1 løsning

Udtræk fra Dictionary<Player, Point> hvor koordinater er ens

Jeg er ved at udvikle et brætspil. I løbet af spillet kan nogle spillere komme til at kollidere med hinanden. Da to spillere ikke har mulighed for at være på samme felt på samme tid, skal jeg have afgjort hvad der så skal ske med dem.

Jeg har indtil videre en Dictionary<Player, Point> hvor jeg skal have kontrolleret om nogle af de Point der findes, er i konflikt med hinanden, dvs. har samme koordinater.

F.eks. har jeg følgende datasæt:
PlayerA; 10,2
PlayerB; 12,4
PlayerC; 28,12
PlayerD; 10,2
PlayerE; 23,18
PlayerF; 0,9
PlayerG; 16,16
PlayerH; 16,16
PlayerI; 31,5
PlayerJ; 28,12

Min indledende idé var at få splittet datasættet op i to dictionaries. Én med alle de Points der ikke er i konflikt med andre, og én med alle de Points der er i konflikt med hinanden. Sidstnævnte må gerne være grupperet efter Point. Rækkefølgen på spillerne er ligegyldig. Eksempelvis:

Dictionary 1 - ikke i konflikt:
PlayerB; 12,4
PlayerE; 23,18
PlayerF; 0,9
PlayerI; 31,5

Dictionary 2 - i konflikt, grupperet:
PlayerA; 10,2
PlayerD; 10,2
PlayerG; 16,16
PlayerH; 16,16
PlayerC; 28,12
PlayerJ; 28,12

Herefter skulle det være en smal sag at gennemløbe dem, og behandle de konflikter der nu måtte være.

Hvordan gøres det smartest? Og er der andre metoder som kunne være bedre til formålet?

Til testformål kan Player objektet blot erstattes af en string. Det er ligegyldigt i denne sammenhæng.
Avatar billede arne_v Ekspert
10. august 2010 - 21:44 #1
Dictionary.Values indeholder jo en liste af dine Point, saa du kan finde overlap med 2 loekker.
Avatar billede arne_v Ekspert
10. august 2010 - 21:45 #2
Alternativt kunne du have baade en Dictionary<Player, Point> og en Dictionary<Point, Player> og saa fange konflikter med det samme naar de opstaar.
Avatar billede Spotgun Seniormester
10. august 2010 - 21:51 #3
Kan du komme med et hurtigt eksempel på dit første forslag?
Avatar billede arne_v Ekspert
10. august 2010 - 22:33 #4
Med LINQ ToList i.s.f. Values:

using System;
using System.Collections.Generic;
using System.Linq;

namespace E
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Dictionary<string,int> demo = new Dictionary<string, int>();
            demo.Add("A", 1);
            demo.Add("B", 2);
            demo.Add("C", 3);
            demo.Add("D", 2);
            List<KeyValuePair<string,int>> demolist = demo.ToList();
            for(int i = 0; i < demolist.Count; i++)
            {
                for(int j = i + 1; j < demolist.Count; j++)
                {
                    if(demolist[i].Value == demolist[j].Value)
                    {
                        Console.WriteLine("Conflict between " + demolist[i].Key + " and " + demolist[j].Key);
                    }
                }
            }
            Console.ReadKey();
        }
    }
}
Avatar billede Spotgun Seniormester
10. august 2010 - 22:47 #5
Perfekt, det var lige det der skulle til for at jeg kan komme videre. Kom med et svar :)
Avatar billede arne_v Ekspert
11. august 2010 - 00:13 #6
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester