Ejemplo n.º 1
0
        public override Bräde.Fält BestämDrag()
        {
            List<Bräde.Fält> dragAttTaBort = new List<Bräde.Fält>();
                  Bräde.Fält bästaDrag = new Bräde.Fält();
                  int vinstdifferens = int.MinValue;
                  // De AI:er som används i de simulerade partierna
                  OriginalgangsterAI egnaSidan = new OriginalgangsterAI(egetTeckenvärde, tolerans: 0);
                  OriginalgangsterAI andraSidan = new OriginalgangsterAI(-egetTeckenvärde, tolerans: 0);

                  foreach (Bräde.Fält fält in Bräde.möjligaDrag) {
                        int xkoordinat = fält.X;
                        int ykoordinat = fält.Y;
                        Bräde.Fält testdrag = new Bräde.Fält(xkoordinat, ykoordinat);

                        if (Bräde.ÄrVinstdrag(testdrag, egetTeckenvärde)) {
                              return testdrag;
                        } else {
                              int antalVinster = 0;
                              int antalFörluster = 0;

                              // Sätter in draget i spelplanen tillfälligt
                              Bräde.ställning[xkoordinat, ykoordinat] = egetTeckenvärde;

                              for (int parti = 0; parti < 100; parti++) {
                                    Bräde.Fält drag;

                                    for (int dragNummer = 0; dragNummer < 25; dragNummer++) {
                                          drag = andraSidan.BestämDrag();

                                          // Spelplanen är full
                                          // Partiet är oavgjort
                                          if (drag == Bräde.nåtHarGåttFel) {
                                                taBortFrånSpelplanen(dragAttTaBort);
                                                dragAttTaBort.Clear();
                                                break;
                                          }
                                                // Förlust
                                          else if (Bräde.ÄrVinstdrag(drag, -egetTeckenvärde)) {
                                                antalFörluster++;
                                                taBortFrånSpelplanen(dragAttTaBort);
                                                dragAttTaBort.Clear();
                                                break;
                                          }
                                                // Partiet fortsätter
                                          else {
                                                Bräde.ställning[drag.X, drag.Y] = -egetTeckenvärde;
                                                dragAttTaBort.Add(drag);
                                          }

                                          drag = egnaSidan.BestämDrag();

                                          // Spelplanen är full
                                          // Partiet är oavgjort
                                          if (drag == Bräde.nåtHarGåttFel) {
                                                taBortFrånSpelplanen(dragAttTaBort);
                                                dragAttTaBort.Clear();
                                                break;
                                          }
                                                // Vinst
                                          else if (Bräde.ÄrVinstdrag(drag, egetTeckenvärde)) {
                                                antalVinster++;
                                                taBortFrånSpelplanen(dragAttTaBort);
                                                dragAttTaBort.Clear();
                                                break;
                                          }
                                                // Partiet fortsätter
                                          else {
                                                Bräde.ställning[drag.X, drag.Y] = egetTeckenvärde;
                                                dragAttTaBort.Add(drag);
                                          }
                                    }
                              }

                              taBortFrånSpelplanen(dragAttTaBort);
                              dragAttTaBort.Clear();
                              int testDifferens = antalVinster - antalFörluster;

                              if (testDifferens > vinstdifferens) {
                                    vinstdifferens = testDifferens;
                                    bästaDrag = testdrag;
                              } else if (testDifferens == vinstdifferens
                                        && Math.Max(BeräknaDragvärde(testdrag, egetTeckenvärde),
                                                    BeräknaDragvärde(testdrag, -egetTeckenvärde))
                                        > Math.Max(BeräknaDragvärde(bästaDrag, egetTeckenvärde),
                                                    BeräknaDragvärde(bästaDrag, -egetTeckenvärde))) {
                                    vinstdifferens = testDifferens;
                                    bästaDrag = testdrag;
                              }

                              // Tar bort draget ur spelplanen
                              Bräde.ställning[testdrag.X, testdrag.Y] = 0;
                        }
                  }

                  return bästaDrag;
        }
Ejemplo n.º 2
0
        public override Bräde.Fält BestämDrag()
        {
            List <Bräde.Fält> dragAttTaBort = new List <Bräde.Fält>();

            Bräde.Fält bästaDrag      = new Bräde.Fält();
            int        vinstdifferens = int.MinValue;
            // De AI:er som används i de simulerade partierna
            OriginalgangsterAI egnaSidan  = new OriginalgangsterAI(egetTeckenvärde, tolerans: 0);
            OriginalgangsterAI andraSidan = new OriginalgangsterAI(-egetTeckenvärde, tolerans: 0);

            foreach (Bräde.Fält fält in Bräde.möjligaDrag)
            {
                int        xkoordinat = fält.X;
                int        ykoordinat = fält.Y;
                Bräde.Fält testdrag   = new Bräde.Fält(xkoordinat, ykoordinat);

                if (Bräde.ÄrVinstdrag(testdrag, egetTeckenvärde))
                {
                    return(testdrag);
                }
                else
                {
                    int antalVinster   = 0;
                    int antalFörluster = 0;

                    // Sätter in draget i spelplanen tillfälligt
                    Bräde.ställning[xkoordinat, ykoordinat] = egetTeckenvärde;

                    for (int parti = 0; parti < 100; parti++)
                    {
                        Bräde.Fält drag;

                        for (int dragNummer = 0; dragNummer < 25; dragNummer++)
                        {
                            drag = andraSidan.BestämDrag();

                            // Spelplanen är full
                            // Partiet är oavgjort
                            if (drag == Bräde.nåtHarGåttFel)
                            {
                                taBortFrånSpelplanen(dragAttTaBort);
                                dragAttTaBort.Clear();
                                break;
                            }
                            // Förlust
                            else if (Bräde.ÄrVinstdrag(drag, -egetTeckenvärde))
                            {
                                antalFörluster++;
                                taBortFrånSpelplanen(dragAttTaBort);
                                dragAttTaBort.Clear();
                                break;
                            }
                            // Partiet fortsätter
                            else
                            {
                                Bräde.ställning[drag.X, drag.Y] = -egetTeckenvärde;
                                dragAttTaBort.Add(drag);
                            }

                            drag = egnaSidan.BestämDrag();

                            // Spelplanen är full
                            // Partiet är oavgjort
                            if (drag == Bräde.nåtHarGåttFel)
                            {
                                taBortFrånSpelplanen(dragAttTaBort);
                                dragAttTaBort.Clear();
                                break;
                            }
                            // Vinst
                            else if (Bräde.ÄrVinstdrag(drag, egetTeckenvärde))
                            {
                                antalVinster++;
                                taBortFrånSpelplanen(dragAttTaBort);
                                dragAttTaBort.Clear();
                                break;
                            }
                            // Partiet fortsätter
                            else
                            {
                                Bräde.ställning[drag.X, drag.Y] = egetTeckenvärde;
                                dragAttTaBort.Add(drag);
                            }
                        }
                    }

                    taBortFrånSpelplanen(dragAttTaBort);
                    dragAttTaBort.Clear();
                    int testDifferens = antalVinster - antalFörluster;

                    if (testDifferens > vinstdifferens)
                    {
                        vinstdifferens = testDifferens;
                        bästaDrag      = testdrag;
                    }
                    else if (testDifferens == vinstdifferens &&
                             Math.Max(BeräknaDragvärde(testdrag, egetTeckenvärde),
                                      BeräknaDragvärde(testdrag, -egetTeckenvärde))
                             > Math.Max(BeräknaDragvärde(bästaDrag, egetTeckenvärde),
                                        BeräknaDragvärde(bästaDrag, -egetTeckenvärde)))
                    {
                        vinstdifferens = testDifferens;
                        bästaDrag      = testdrag;
                    }

                    // Tar bort draget ur spelplanen
                    Bräde.ställning[testdrag.X, testdrag.Y] = 0;
                }
            }

            return(bästaDrag);
        }