예제 #1
0
        //Gibt Liste mit Felder zurueck, welche nach einem Schlag von einem Feld erreicht werden koennen
        public List <Feld> GetSchlagZielfelder(Feld vonFeld, Spieler s, Brett brett)
        {
            List <Feld> felder = new List <Feld>(); //alle schwarzen Felder
            List <Feld> ziel   = new List <Feld>(); //alle möglichen ziel Felder welche durch schlagen erreicht werden können

            //setzen der schwarzen Felder
            for (int x = 0; x < brett.GetBreite(); x++)
            {
                for (int y = 0; y < brett.GetHöhe(); y++)
                {
                    if (brett.GetFelder()[x, y].GetFarbe() == Farbe.Schwarz)
                    {
                        felder.Add(brett.GetFelder()[x, y]);
                    }
                }
            }

            //finden der möglichen zielfelder
            foreach (Feld zuFeld in felder)
            {
                // Nur was machen, wenn auf dem Ziel keiner liegt
                if (zuFeld.GetSteinBesetzung() == null)
                {
                    bool temp = doppelDameFlag;
                    Feld f    = this.Schlag(vonFeld, zuFeld, s, brett); //Gibt Feld zurück welches geschlagen wird von vonFeld zu zuFeld
                    doppelDameFlag = temp;
                    if (f != null)
                    {
                        ziel.Add(zuFeld);   //adde das Feld welches erreicht werden kann
                    }
                }
            }

            return(ziel);    //Liste mit den Feldern auf, welche man ziehen kann
        }
예제 #2
0
        // Gets all possible moves for one token
        public override List <Feld> GetMoves(Feld vonFeld, Spieler spieler, Brett brett)
        {
            List <Feld> moves = new List <Feld>();          // List of possible targets

            Feld[,] felder = brett.GetFelder();             // All fields on the board

            List <Feld> ziele = new List <Feld>();          // All black fields on the board

            // Ineffiziente billig-Methode
            // 1. Fügt alle schwarzen felder der Ziel-Liste hinzu
            for (int i = 0; i < felder.GetLength(0); i++)
            {
                for (int j = 0; j < felder.GetLength(1); j++)
                {
                    if ((((i % 2 == 0) && (j % 2 == 0)) || ((i % 2 == 1) && (j % 2 == 1))) && felder[i, j].GetSteinBesetzung() == null)
                    {
                        ziele.Add(felder[i, j]);
                    }
                }
            }

            // 2. Testet alle Zielfelder, ob mit diesem startfeld ein Zug gültig ist
            for (int i = 0; i < ziele.Count; i++)
            {
                // Wenn ein normaler zug oder schlagen möglich ist, ist dies ein gültiger zug.
                if (MoveStein(vonFeld, ziele[i], spieler, brett) || Schlagen(vonFeld, ziele[i], spieler, brett) != null)
                {
                    // 3. Gültige Züge werden der moves-Liste hinzugefügt.
                    moves.Add(ziele[i]);
                }
            }

            // can be empty
            return(moves);
        }
예제 #3
0
        // Checks if a player still has moves left
        public bool CanPlayerMove(Spieler s, Brett brett)
        {
            for (int x = 0; x < brett.GetComponent <Brett>().GetBreite(); x++)
            {
                for (int y = 0; y < brett.GetComponent <Brett>().GetHöhe(); y++)
                {
                    GameObject stein = brett.GetFelder()[x, y].GetSteinBesetzung();

                    if (stein != null)
                    {
                        // Returns true as soon as a single token has a single valid move left
                        if (CanTokenMove(stein.GetComponent <Stein>().GetFeld(), s, brett))
                        {
                            return(true);
                        }
                    }
                }
            }
            return(false);
        }
예제 #4
0
        // Returns true if there is even one move available for this token
        // Verbesserte performanz mit Damen
        public override bool CanTokenMove(Feld vonFeld, Spieler spieler, Brett brett)
        {
            Feld[,] felder = brett.GetFelder();             // All fields on the board

            // Ineffiziente billig-Methode
            // 1. Fügt alle schwarzen felder der Ziel-Liste hinzu
            for (int i = 0; i < felder.GetLength(0); i++)
            {
                for (int j = 0; j < felder.GetLength(1); j++)
                {
                    if ((((i % 2 == 0) && (j % 2 == 0)) || ((i % 2 == 1) && (j % 2 == 1))) && felder[i, j].GetSteinBesetzung() == null)
                    {
                        if (MoveStein(vonFeld, felder[i, j], spieler, brett) || Schlagen(vonFeld, felder[i, j], spieler, brett) != null)
                        {
                            return(true);
                        }
                    }
                }
            }
            return(false);
        }
예제 #5
0
파일: Spiel.cs 프로젝트: eightfour/Checkers
        private void MarkMovableTokens()
        {
            if (self == null || self.GetFarbe() == aktuellerSpieler.GetFarbe())
            {
                List <Feld> markerList = new List <Feld>();

                // Alle steine des aktuellen spielers zwischenspeichern
                foreach (Feld f in brett.GetFelder())
                {
                    // Stein vorhanden, steinfarbe == spielerfarbe
                    if (f.GetSteinBesetzung() != null && f.GetSteinBesetzung().GetComponent <Stein>().GetFarbe() == this.aktuellerSpieler.GetFarbe())
                    {
                        // Wenn dieser stein auch nur einen Zug hat, markieren lassen
                        if (this.regelwerk.CanTokenMove(f, this.GetAktuellerSpieler(), this.brett))
                        {
                            markerList.Add(f);
                        }
                    }
                }

                MarkFields(markerList, Tag.Verfuegbar);
            }
        }
예제 #6
0
        public Feld Schlag(Feld vonFeld, Feld zuFeld, Spieler s, Brett brett)
        {
            Feld zuSchlagen = null;


            if (!doppelDameFlag && startSteinBesetzung.GetComponent <Stein>().IsDame() &&
                s.GetFarbe() == startSteinBesetzung.GetComponent <Stein>().GetFarbe())       //gehoert Stein zu aktuellem Spieler?
            {
                Debug.Log("Feld ist rechts oben");
                for (int counter = 1; counter < brett.GetBreite(); counter++)
                {
                    //rechts oben
                    if (vonFeld.GetPositionX() + counter < brett.GetBreite() &&
                        vonFeld.GetPositionY() + counter < brett.GetBreite() &&
                        brett.GetFelder()[vonFeld.GetPositionX() + counter, vonFeld.GetPositionY() + counter].GetSteinBesetzung() != null &&
                        brett.GetFelder()[vonFeld.GetPositionX() + counter, vonFeld.GetPositionY() + counter].GetSteinBesetzung().GetComponent <Stein>().GetFarbe() != s.GetFarbe())
                    {
                        if (zuFeld.GetPositionX() == vonFeld.GetPositionX() + counter + 1 &&   //Stimmen zuFeldKoordinaten?
                            zuFeld.GetPositionY() == vonFeld.GetPositionY() + counter + 1 &&
                            (brett.GetFelder()[vonFeld.GetPositionX() + counter - 1, vonFeld.GetPositionY() + counter - 1].GetSteinBesetzung() == null ||
                             brett.GetFelder()[vonFeld.GetPositionX() + counter - 1, vonFeld.GetPositionY() + counter - 1].GetSteinBesetzung() == startSteinBesetzung))
                        {
                            Debug.Log("Dame schlägt");
                            zuSchlagen     = brett.GetFelder()[vonFeld.GetPositionX() + counter, vonFeld.GetPositionY() + counter];
                            doppelDameFlag = true;
                        }
                        break;
                    }
                }
                for (int counter = 1; counter < brett.GetBreite(); counter++)
                {
                    //links unten
                    if (vonFeld.GetPositionX() - counter > 0 &&
                        vonFeld.GetPositionY() - counter > 0 &&
                        brett.GetFelder()[vonFeld.GetPositionX() - counter, vonFeld.GetPositionY() - counter].GetSteinBesetzung() != null &&
                        brett.GetFelder()[vonFeld.GetPositionX() - counter, vonFeld.GetPositionY() - counter].GetSteinBesetzung().GetComponent <Stein>().GetFarbe() != s.GetFarbe())
                    {
                        if (zuFeld.GetPositionX() == vonFeld.GetPositionX() - counter - 1 &&   //Stimmen zuFeldKoordinaten?
                            zuFeld.GetPositionY() == vonFeld.GetPositionY() - counter - 1 &&
                            (brett.GetFelder()[vonFeld.GetPositionX() - counter + 1, vonFeld.GetPositionY() - counter + 1].GetSteinBesetzung() == null ||
                             brett.GetFelder()[vonFeld.GetPositionX() - counter + 1, vonFeld.GetPositionY() - counter + 1].GetSteinBesetzung() == startSteinBesetzung))
                        {
                            Debug.Log("Dame schlägt");
                            zuSchlagen     = brett.GetFelder()[vonFeld.GetPositionX() - counter, vonFeld.GetPositionY() - counter];
                            doppelDameFlag = true;
                        }
                        break;
                    }
                }

                for (int counter = 1; counter < brett.GetBreite(); counter++)
                {
                    //links oben
                    if (vonFeld.GetPositionX() - counter > 0 &&
                        vonFeld.GetPositionY() + counter < brett.GetBreite() &&
                        brett.GetFelder()[vonFeld.GetPositionX() - counter, vonFeld.GetPositionY() + counter].GetSteinBesetzung() != null &&
                        brett.GetFelder()[vonFeld.GetPositionX() - counter, vonFeld.GetPositionY() + counter].GetSteinBesetzung().GetComponent <Stein>().GetFarbe() != s.GetFarbe())
                    {
                        if (zuFeld.GetPositionX() == vonFeld.GetPositionX() - counter - 1 &&   //Stimmen zuFeldKoordinaten?
                            zuFeld.GetPositionY() == vonFeld.GetPositionY() + counter + 1 &&
                            (brett.GetFelder()[vonFeld.GetPositionX() - counter + 1, vonFeld.GetPositionY() + counter - 1].GetSteinBesetzung() == null ||
                             brett.GetFelder()[vonFeld.GetPositionX() - counter + 1, vonFeld.GetPositionY() + counter - 1].GetSteinBesetzung() == startSteinBesetzung))
                        {
                            Debug.Log("Dame schlägt");
                            zuSchlagen     = brett.GetFelder()[vonFeld.GetPositionX() - counter, vonFeld.GetPositionY() + counter];
                            doppelDameFlag = true;
                        }
                        break;
                    }
                }

                for (int counter = 1; counter < brett.GetBreite(); counter++)
                {
                    //rechts unten
                    if (vonFeld.GetPositionX() + counter < brett.GetBreite() &&
                        vonFeld.GetPositionY() - counter > 0 &&
                        brett.GetFelder()[vonFeld.GetPositionX() + counter, vonFeld.GetPositionY() - counter].GetSteinBesetzung() != null &&
                        brett.GetFelder()[vonFeld.GetPositionX() + counter, vonFeld.GetPositionY() - counter].GetSteinBesetzung().GetComponent <Stein>().GetFarbe() != s.GetFarbe())
                    {
                        if (zuFeld.GetPositionX() == vonFeld.GetPositionX() + counter + 1 &&   //Stimmen zuFeldKoordinaten?
                            zuFeld.GetPositionY() == vonFeld.GetPositionY() - counter - 1 &&
                            (brett.GetFelder()[vonFeld.GetPositionX() + counter - 1, vonFeld.GetPositionY() - counter + 1].GetSteinBesetzung() == null ||
                             brett.GetFelder()[vonFeld.GetPositionX() + counter - 1, vonFeld.GetPositionY() - counter + 1].GetSteinBesetzung() == startSteinBesetzung))
                        {
                            Debug.Log("Dame schlägt");
                            zuSchlagen     = brett.GetFelder()[vonFeld.GetPositionX() + counter, vonFeld.GetPositionY() - counter];
                            doppelDameFlag = true;
                        }
                        break;
                    }
                }
            }

            else if (s.GetFarbe() == Farbe.Weiß &&
                     startSteinBesetzung.GetComponent <Stein>().GetFarbe() == Farbe.Weiß)
            {
                if (zuFeld.GetPositionX() == vonFeld.GetPositionX() - 2 &&
                    zuFeld.GetPositionY() == vonFeld.GetPositionY() + 2 &&                                                                                            //das Feld links oben
                    brett.GetFelder()[vonFeld.GetPositionX() - 1, vonFeld.GetPositionY() + 1].GetSteinBesetzung() != null &&
                    brett.GetFelder()[vonFeld.GetPositionX() - 1, vonFeld.GetPositionY() + 1].GetSteinBesetzung().GetComponent <Stein>().GetFarbe() == Farbe.Schwarz) //ist dazwischen ein Gegner?
                {
                    Debug.Log("Weiß schlägt links oben");
                    zuSchlagen = brett.GetFelder()[vonFeld.GetPositionX() - 1, vonFeld.GetPositionY() + 1];
                }
                else if (zuFeld.GetPositionX() == vonFeld.GetPositionX() + 2 &&
                         zuFeld.GetPositionY() == vonFeld.GetPositionY() + 2 &&                                                                                            // das Feld rechts oben
                         brett.GetFelder()[vonFeld.GetPositionX() + 1, vonFeld.GetPositionY() + 1].GetSteinBesetzung() != null &&
                         brett.GetFelder()[vonFeld.GetPositionX() + 1, vonFeld.GetPositionY() + 1].GetSteinBesetzung().GetComponent <Stein>().GetFarbe() == Farbe.Schwarz) //ist dazwischen ein Gegner?
                {
                    Debug.Log("Weiß schlägt rechts oben");
                    zuSchlagen = brett.GetFelder()[vonFeld.GetPositionX() + 1, vonFeld.GetPositionY() + 1];
                }
            }
            else if (s.GetFarbe() == Farbe.Schwarz &&
                     startSteinBesetzung.GetComponent <Stein>().GetFarbe() == Farbe.Schwarz)
            {
                if (zuFeld.GetPositionX() == vonFeld.GetPositionX() - 2 &&
                    zuFeld.GetPositionY() == vonFeld.GetPositionY() - 2 &&                                                                                         //das Feld links unten
                    brett.GetFelder()[vonFeld.GetPositionX() - 1, vonFeld.GetPositionY() - 1].GetSteinBesetzung() != null &&
                    brett.GetFelder()[vonFeld.GetPositionX() - 1, vonFeld.GetPositionY() - 1].GetSteinBesetzung().GetComponent <Stein>().GetFarbe() == Farbe.Weiß) //ist dazwischen ein Gegner?
                {
                    Debug.Log("Schwarz schlägt links unten");
                    zuSchlagen = brett.GetFelder()[vonFeld.GetPositionX() - 1, vonFeld.GetPositionY() - 1];
                }
                else if (zuFeld.GetPositionX() == vonFeld.GetPositionX() + 2 &&
                         zuFeld.GetPositionY() == vonFeld.GetPositionY() - 2 &&                                                                                         // das Feld rechts unten
                         brett.GetFelder()[vonFeld.GetPositionX() + 1, vonFeld.GetPositionY() - 1].GetSteinBesetzung() != null &&
                         brett.GetFelder()[vonFeld.GetPositionX() + 1, vonFeld.GetPositionY() - 1].GetSteinBesetzung().GetComponent <Stein>().GetFarbe() == Farbe.Weiß) //ist dazwischen ein Gegner?
                {
                    Debug.Log("Schwarz schlägt rechts unten");
                    zuSchlagen = brett.GetFelder()[vonFeld.GetPositionX() + 1, vonFeld.GetPositionY() - 1];
                }
            }

            return(zuSchlagen);
        }
예제 #7
0
        public override Boolean MoveStein(Feld vonFeld, Feld zuFeld, Spieler s, Brett brett)
        {
            bool b = false;

            //Debug.Log("Ist Dame: " + vonFeld.GetSteinBesetzung().GetComponent<Stein>().IsDame());


            if (zuFeld.GetFarbe() == Farbe.Schwarz)                 //ist Zielfeld ueberhaupt Schwarz?
            {
                //DamenMove:
                if (vonFeld.GetSteinBesetzung().GetComponent <Stein>().IsDame() &&              //ist Stein Dame?
                    s.GetFarbe() == vonFeld.GetSteinBesetzung().GetComponent <Stein>().GetFarbe())                           //gehoert Stein zu aktuellem Spieler?
                {
                    Debug.Log("Dame darf ziehen");
                    for (int counter = 1; counter <= brett.GetBreite(); counter++)                       //Zaehle Felder ab falls jemand dazwischen TODO: 8 muss noch an flexible Brettlaenge angepasst werden
                    {
                        Debug.Log("zaehlt: " + counter);

                        /*if (vonFeld.GetPositionX() - counter < 0 || vonFeld.GetPositionY() - counter < 0
                        || vonFeld.GetPositionX() - counter > 8 || vonFeld.GetPositionY() - counter > 8)    //ist Zaehler noch auf dem Brett TODO: Brettgroesse
                        || {
                        || Debug.Log("Counter aus dem Zaehlerbereich");
                        || break;
                        || }*/
                        if (zuFeld.GetPositionX() < vonFeld.GetPositionX() && zuFeld.GetPositionY() < vonFeld.GetPositionY())                           //ist Feld links unten?
                        {
                            Debug.Log("Feld ist links unten");
                            if (vonFeld.GetPositionX() - counter >= 0 &&
                                vonFeld.GetPositionY() - counter >= 0 &&
                                brett.GetFelder()[vonFeld.GetPositionX() - counter, vonFeld.GetPositionY() - counter].GetSteinBesetzung() == null) //ist etwas im Weg?
                            {
                                if (zuFeld.GetPositionX() == vonFeld.GetPositionX() - counter &&                                                   //Stimmen zuFeldKoordinaten?
                                    zuFeld.GetPositionY() == vonFeld.GetPositionY() - counter)
                                {
                                    Debug.Log("Dame zieht");
                                    b = true;
                                    break;
                                }
                            }
                            else
                            {
                                Debug.Log("Stein im Weg");
                                break;
                            }
                        }
                        if (zuFeld.GetPositionX() > vonFeld.GetPositionX() && zuFeld.GetPositionY() > vonFeld.GetPositionY())                           //ist Feld rechts oben?
                        {
                            Debug.Log("Feld ist rechts oben");
                            if (vonFeld.GetPositionX() + counter < brett.GetBreite() &&
                                vonFeld.GetPositionY() + counter < brett.GetBreite() &&
                                brett.GetFelder()[vonFeld.GetPositionX() + counter, vonFeld.GetPositionY() + counter].GetSteinBesetzung() == null) //ist etwas im Weg?
                            {
                                if (zuFeld.GetPositionX() == vonFeld.GetPositionX() + counter &&                                                   //Stimmen zuFeldKoordinaten?
                                    zuFeld.GetPositionY() == vonFeld.GetPositionY() + counter)
                                {
                                    Debug.Log("Dame zieht");
                                    b = true;
                                    break;
                                }
                            }
                            else
                            {
                                Debug.Log("Stein im Weg");
                                break;
                            }
                        }
                        else if (zuFeld.GetPositionX() < vonFeld.GetPositionX() && zuFeld.GetPositionY() > vonFeld.GetPositionY())                           //ist Feld links oben?
                        {
                            Debug.Log("Feld ist links oben");
                            if (vonFeld.GetPositionX() - counter >= 0 &&
                                vonFeld.GetPositionY() + counter < brett.GetBreite() &&
                                brett.GetFelder()[vonFeld.GetPositionX() - counter, vonFeld.GetPositionY() + counter].GetSteinBesetzung() == null) //ist etwas im Weg?
                            {
                                if (zuFeld.GetPositionX() == vonFeld.GetPositionX() - counter &&                                                   //Stimmen zuFeldKoordinaten?
                                    zuFeld.GetPositionY() == vonFeld.GetPositionY() + counter)
                                {
                                    Debug.Log("Dame zieht");
                                    b = true;
                                    break;
                                }
                            }
                            else
                            {
                                Debug.Log("Stein im Weg");
                                break;
                            }
                        }
                        else if (zuFeld.GetPositionX() > vonFeld.GetPositionX() && zuFeld.GetPositionY() < vonFeld.GetPositionY())                           //ist Feld rechts unten?
                        {
                            Debug.Log("Feld ist rechts unten");
                            if (vonFeld.GetPositionX() + counter < brett.GetBreite() &&
                                vonFeld.GetPositionY() - counter >= 0 &&
                                brett.GetFelder()[vonFeld.GetPositionX() + counter, vonFeld.GetPositionY() - counter].GetSteinBesetzung() == null) //ist etwas im Weg?
                            {
                                if (zuFeld.GetPositionX() == vonFeld.GetPositionX() + counter &&                                                   //Stimmen zuFeldKoordinaten?
                                    zuFeld.GetPositionY() == vonFeld.GetPositionY() - counter)
                                {
                                    Debug.Log("Dame zieht");
                                    b = true;
                                    break;
                                }
                            }
                            else
                            {
                                Debug.Log("Stein im Weg");
                                break;
                            }
                        }
                    }
                }

                //NormalerStein Move:
                else if (s.GetFarbe() == Farbe.Weiß &&
                         vonFeld.GetSteinBesetzung().GetComponent <Stein>().GetFarbe() == Farbe.Weiß)                   //fuer weissen Stein
                {
                    if (zuFeld.GetSteinBesetzung() == null)
                    {
                        if (zuFeld.GetPositionX() == vonFeld.GetPositionX() - 1 && zuFeld.GetPositionY() == vonFeld.GetPositionY() + 1 || zuFeld.GetPositionX() == vonFeld.GetPositionX() + 1 && zuFeld.GetPositionY() == vonFeld.GetPositionY() + 1)                           // das Feld links oben oder rechts oben
                        {
                            //Debug.Log("Weiß zieht");
                            b = true;
                        }
                    }
                }
                else if (s.GetFarbe() == Farbe.Schwarz &&
                         vonFeld.GetSteinBesetzung().GetComponent <Stein>().GetFarbe() == Farbe.Schwarz)                     //fuer schwarzen Stein
                {
                    if (zuFeld.GetSteinBesetzung() == null)
                    {
                        if (zuFeld.GetPositionX() == vonFeld.GetPositionX() - 1 && zuFeld.GetPositionY() == vonFeld.GetPositionY() - 1 || zuFeld.GetPositionX() == vonFeld.GetPositionX() + 1 && zuFeld.GetPositionY() == vonFeld.GetPositionY() - 1)                           // das Feld links unten oder rechts unten
                        {
                            //Debug.Log("Schwarz zieht");
                            b = true;
                        }
                    }
                }
            }
            return(b);
        }