Ejemplo n.º 1
0
        internal double HotLängsDiagonalUppVänster(Bräde.Fält drag, int påDrag /*<- Vilken spelares drag den ska leta efter */)
        {
            double antal = 0;
                  bool blockÅtEnaHållet = false; // Ifall serien gränsar till fält med ett motståndardrag ellet spelplanens kant

                  for (int indexökning = 1; indexökning <= 4; indexökning++) // Kollar de fyra fälten närmast snett upp vänster
                  {
                        if (drag.X + indexökning >= Bräde.sida || drag.Y + indexökning >= Bräde.sida) // Om den hamnat utanför spelanen
                        {
                              blockÅtEnaHållet = true;
                              break;
                        }
                        if (Bräde.ställning[drag.X + indexökning, drag.Y + indexökning] == påDrag) // Om det finns ett eget drag på fältet
                              antal++;
                        else {
                              if (Bräde.ställning[drag.X + indexökning, drag.Y + indexökning] == -påDrag) // Om det finns ett motståndardrag på fältet
                                    blockÅtEnaHållet = true;
                              // Annars är den öppen på ovansidan
                              break;
                        }
                  }

                  for (int indexökning = 1; indexökning <= 4; indexökning++) // Kollar de fyra fälten närmast snett ned höger
            {
                        if (drag.X - indexökning < 0 || drag.Y - indexökning < 0) // Om den hamnat utanför spelanen
                {
                              if (blockÅtEnaHållet)
                                    return antal == 4 ? 4 : 0; // Är den helt blockerad är den värd noll, om den inte är en femma i vilket fall den får värdet 4
                              else
                                    blockÅtEnaHållet = true;
                              break;
                        }
                        if (Bräde.ställning[drag.X - indexökning, drag.Y - indexökning] == påDrag) // Om det finns ett eget drag på fältet
                              antal++;
                        else {
                              if (Bräde.ställning[drag.X - indexökning, drag.Y - indexökning] == -påDrag) // Om det finns ett motståndardrag på fältet
                    {
                                    if (blockÅtEnaHållet)
                                          return antal == 4 ? 4 : 0; // Är den helt blockerad är den värd noll, om den inte är en femma i vilket fall den får värdet 4
                                    else
                                          blockÅtEnaHållet = true;
                              }
                              break;
                        }
                  }

                  antal += blockÅtEnaHållet ? 0 : 0.5; // Är serien helt öppen får den en bonus på 0,5
                  return antal;
        }
Ejemplo n.º 2
0
        // Dragvärde = bästa hotet + näst bästa hotet * sekundärhotskonstant + summan av hoten * totalaHotKonstant
        protected double BeräknaDragvärde(Bräde.Fält drag, int teckenvärde)
        {
            double största = double.MinValue;
                  double nästStörsta = double.MinValue;
                  double summa = 0;
                  double[] vektor = new double[] { HotLängsRad(drag, teckenvärde), HotLängsLinje(drag, teckenvärde),
                                                   HotLängsDiagonalUppHöger(drag, teckenvärde),
                                                   HotLängsDiagonalUppVänster(drag, teckenvärde) };

                  GörSkit(ref största, ref nästStörsta, ref summa, vektor);

                  if (teckenvärde == egetTeckenvärde) {
                        return största + nästStörsta * sekundärhotkonstant + summa * totalaHotKonstant;
                  } else {
                        return största + nästStörsta * sekundärhotkonstant + summa * totalaHotKonstant - motståndarminus;
                  }
        }
Ejemplo n.º 3
0
        // Kollar höger-vänster
        internal double HotLängsRad(Bräde.Fält drag, int påDrag /*<- Vilken spelares drag den ska leta efter */)
        {
            double antal = 0;
                  bool blockÅtEnaHållet = false; // Ifall serien gränsar till fält med ett motståndardrag ellet spelplanens kant

                  // Går igenom de fyra fälten närmast till höger
                  for (int indexökning = drag.X + 1; indexökning <= drag.X + 4; indexökning++) {
                        // Om den hamnat utanför spelanen
                        if (indexökning >= Bräde.sida) {
                              blockÅtEnaHållet = true;
                              break;
                        }
                        // Om det finns ett eget drag på fältet
                        if (Bräde.ställning[indexökning, drag.Y] == påDrag) {
                              antal++;
                        }
                              // Om det finns ett motståndardrag på fältet
                        else {
                              if (Bräde.ställning[indexökning, drag.Y] == -påDrag)
                                    blockÅtEnaHållet = true;
                              // Annars är den öppen på höger sida
                              break;
                        }
                  }

                  // Går igenom de fyra fälten närmast till vänster
                  for (int indexminskning = drag.X - 1; indexminskning >= drag.X - 4; indexminskning--) {
                        if (indexminskning < 0) // Om den hamnat utanför spelanen
                {
                              if (blockÅtEnaHållet)
                                    // Är den helt blockerad är den värd 0,
                                    // om den inte är en femma i vilket fall den får värdet 4
                                    return antal == 4 ? 4 : 0;
                              else
                                    blockÅtEnaHållet = true;
                              break;
                        }
                        // Om det finns ett eget drag på fältet
                        if (Bräde.ställning[indexminskning, drag.Y] == påDrag)
                              antal++;
                        // Om det finns ett motståndardrag på fältet
                        else {
                              if (Bräde.ställning[indexminskning, drag.Y] == -påDrag) {
                                    if (blockÅtEnaHållet)
                                          // Är den helt blockerad är den värd 0,
                                          // om den inte är en femma  i vilket fall den får värdet 4
                                          return antal == 4 ? 4 : 0;
                                    else
                                          blockÅtEnaHållet = true;
                              }
                              break;
                        }
                  }

                  antal += blockÅtEnaHållet ? 0 : 0.5; // Är serien helt öppen får den en bonus på 0,5
                  return antal;
        }