예제 #1
0
파일: Spiel.cs 프로젝트: dcadis/MsgTests
        /// <summary>
        /// Fügt eine Liste von Zügen hinzu
        /// </summary>
        /// <param name="turns"></param>
        public void AddTurns(List <String> turns)
        {
            foreach (string turn in turns)
            {
                Tuple <int, Enums.Seiten> turnTuple = ParseTurn(turn);

                var spielstein = new Spielstein(turnTuple.Item2);
                AddSpielstein(spielstein, turnTuple.Item1);
            }
        }
예제 #2
0
        /// <summary>
        /// Hinzufuegt Spielstein zu Spielfeld.
        /// </summary>
        /// <param name="Spielstein"></param>
        /// <param name="RowIndex">index fuer Zeiele vo Spielstein muss hinzugefuegt. Es ist >= 0 </param>
        /// <returns>Plaz wo Spielstein wuede hinzugefuegt</returns>
        internal Tuple <int, int> AddSpielstein(Spielstein Spielstein, int RowIndex)
        {
            if (RowIndex < 0 || RowIndex > (this.Spielsteine.GetUpperBound(0)))
            {
                throw new OutOfGameBoardBoundsException("Der Spielstein muss innerhalb der Breite des Spielbretts eingefügt werden.");
            }

            for (int idx = 0; idx <= this.Spielsteine.GetUpperBound(1); idx++)
            {
                if (this.Spielsteine[RowIndex, idx] == null)
                {
                    this.Spielsteine[RowIndex, idx] = Spielstein;
                    Spielstein.SetKoordinaten(RowIndex, idx);

                    return(new Tuple <int, int>(RowIndex, idx));
                }
            }

            throw new SpielbrettFullException("Es konnte kein leerer Steckplatz zum Einfügen des Spielsteine in die angeforderte Zeile gefunden werden..");
        }
예제 #3
0
        public bool PruefenGewinnbedingung(Spielbrett speilfeld, Spielstein spielstein)
        {
            int countOfSameColour = 0; // Number of discs with the same colour

            // Check upwards. We need to take into consideration the height of the speilfeld when looping
            for (int y = spielstein.YKoordinate.Value; y <= Math.Min((spielstein.YKoordinate.Value + Spiel.STEINLAENGE), speilfeld.Spielsteine.GetUpperBound(1)); y++)
            {
                if (speilfeld.Spielsteine[spielstein.XKoordinate.Value, y] != null && speilfeld.Spielsteine[spielstein.XKoordinate.Value, y].Seite == spielstein.Seite)
                {
                    countOfSameColour++;
                }
                else
                {
                    break;
                }
            }

            if (countOfSameColour >= Spiel.STEINLAENGE)
            {
                return(true);      // Gewinn Bedingung
            }
            countOfSameColour = 0; // Re-initialise to start the backward count

            // Check downward. We need to make sure we don't go lower than 0 in our check.
            for (int y = spielstein.YKoordinate.Value; y >= Math.Max(spielstein.YKoordinate.Value - Spiel.STEINLAENGE, 0); y--)
            {
                if (speilfeld.Spielsteine[spielstein.XKoordinate.Value, y] != null && speilfeld.Spielsteine[spielstein.XKoordinate.Value, y].Seite == spielstein.Seite)
                {
                    countOfSameColour++;
                }
                else
                {
                    break;
                }
            }

            return(countOfSameColour >= Spiel.STEINLAENGE);
        }
예제 #4
0
파일: Spiel.cs 프로젝트: dcadis/MsgTests
        /// <summary>
        /// Spielstein zu Spielnrett hinzufuegen
        /// </summary>
        /// <param name="spielstein"></param>
        /// <param name="spalteIndex"></param>
        public void AddSpielstein(Spielstein spielstein, int spalteIndex)
        {
            if (this._AkutellesStatus != Enums.SpielStatus.KeinSpielstein &&
                this._AkutellesStatus != Enums.SpielStatus.RedsTurn &&
                this._AkutellesStatus != Enums.SpielStatus.YellowsTurn)
            {
                throw new SpielBeebdetException(String.Format("Das Spiel ist bereits beendet! {0}", SpielStatus));
            }

            Console.WriteLine(string.Format("Spielstein {0}", spielstein));
            if (this._AkutellesStatus == Enums.SpielStatus.YellowsTurn && spielstein.Seite == Enums.Seiten.Red)
            {
                throw new FalscherSpielerzugException("Derzeit ist Gelb an der Reihe. Spielen Sie ein gelbes Spielstein ab.");
            }
            else if (this._AkutellesStatus == Enums.SpielStatus.RedsTurn && spielstein.Seite == Enums.Seiten.Yellow)
            {
                throw new FalscherSpielerzugException("Derzeit ist Rot an der Reihe. Spielen Sie eine rotes Spielstein ab.");
            }

            this._Spielbrett.AddSpielstein(spielstein, spalteIndex);

            if (!CheckForWinOrDraw()) // Need to switch the sides that are currently playing around
            {
                if (this._AkutellesStatus == Enums.SpielStatus.KeinSpielstein)
                {
                    this._AkutellesStatus = spielstein.Seite == Enums.Seiten.Red ? Enums.SpielStatus.YellowsTurn : Enums.SpielStatus.RedsTurn;
                }
                else if (this._AkutellesStatus == Enums.SpielStatus.RedsTurn)
                {
                    this._AkutellesStatus = Enums.SpielStatus.YellowsTurn;
                }
                else
                {
                    this._AkutellesStatus = Enums.SpielStatus.RedsTurn;
                }
            }
        }
예제 #5
0
        public bool PruefenGewinnbedingung(Spielbrett speilfeld, Spielstein spielstein)
        {
            int anzahlDasselbeFarbe = 0;

            for (int x = spielstein.XKoordinate.Value; x <= Math.Min((spielstein.XKoordinate.Value + Spiel.STEINLAENGE), speilfeld.Spielsteine.GetUpperBound(0)); x++)
            {
                if (speilfeld.Spielsteine[x, spielstein.YKoordinate.Value] != null && speilfeld.Spielsteine[x, spielstein.YKoordinate.Value].Seite == spielstein.Seite)
                {
                    anzahlDasselbeFarbe++;
                }
                else
                {
                    break;
                }
            }

            if (anzahlDasselbeFarbe >= Spiel.STEINLAENGE)
            {
                return(true);        // Gewinn Bedingung
            }
            anzahlDasselbeFarbe = 0; // Re-initialise to start the backward count

            // Check backward. We need to make sure we don't go lower than 0 in our check.
            for (int x = spielstein.XKoordinate.Value; x >= Math.Max(spielstein.XKoordinate.Value - Spiel.STEINLAENGE, 0); x--)
            {
                if (speilfeld.Spielsteine[x, spielstein.YKoordinate.Value] != null && speilfeld.Spielsteine[x, spielstein.YKoordinate.Value].Seite == spielstein.Seite)
                {
                    anzahlDasselbeFarbe++;
                }
                else
                {
                    break;
                }
            }

            return(anzahlDasselbeFarbe >= Spiel.STEINLAENGE);
        }
예제 #6
0
        public bool PruefenGewinnbedingung(Spielbrett speilfeld, Spielstein spielsteine)
        {
            int countOfSameColour = 0; // Number of discs with the same colour

            // There are 4 diagonal win conditions, we have to check for all of them. It seems complex but really it is merely a combination
            // of positive, negative, X and Y

            // 1) Let's tackle positive X, positive Y first - this means we're checking for "up and right" in the 2d space (left hand rule)
            // We are incrementing both X and Y axis values
            for (int i = 0; i < Spiel.STEINLAENGE; i++)
            {
                if (spielsteine.XKoordinate.Value + i <= speilfeld.Spielsteine.GetUpperBound(0) && spielsteine.YKoordinate.Value + i <= speilfeld.Spielsteine.GetUpperBound(1))
                {
                    if (speilfeld.Spielsteine[spielsteine.XKoordinate.Value + i, spielsteine.YKoordinate.Value + i] != null && speilfeld.Spielsteine[spielsteine.XKoordinate.Value + i, spielsteine.YKoordinate.Value + i].Seite == spielsteine.Seite)
                    {
                        countOfSameColour++;
                    }
                    else
                    {
                        break;
                    }
                }
                else
                {
                    break;
                }
            }

            if (countOfSameColour >= Spiel.STEINLAENGE)
            {
                return(true);      // Gewinn Bedingung
            }
            countOfSameColour = 0; // Re-initialise

            // 2) Next, positive X, negative Y - this is checking "down and right" in the 2d space
            // We are incrementing X axis values but decrementing Y axis values

            for (int i = 0; i < Spiel.STEINLAENGE; i++)
            {
                if (spielsteine.XKoordinate.Value + i <= speilfeld.Spielsteine.GetUpperBound(0) && spielsteine.YKoordinate.Value - i >= 0)
                {
                    if (speilfeld.Spielsteine[spielsteine.XKoordinate.Value + i, spielsteine.YKoordinate.Value - i] != null && speilfeld.Spielsteine[spielsteine.XKoordinate.Value + i, spielsteine.YKoordinate.Value - i].Seite == spielsteine.Seite)
                    {
                        countOfSameColour++;
                    }
                    else
                    {
                        break; // No point continuing
                    }
                }
                else
                {
                    break; // No point continuing
                }
            }

            if (countOfSameColour >= Spiel.STEINLAENGE)
            {
                return(true);      // Win condition
            }
            countOfSameColour = 0; // Re-initialise

            // 3) Next, negative X, positive Y - this is checking "up and left" in the 2d space
            // Decrement X axis values but increment Y axis values

            for (int i = 0; i < Spiel.STEINLAENGE; i++)
            {
                if (spielsteine.XKoordinate.Value - i >= 0 && spielsteine.YKoordinate.Value + i <= speilfeld.Spielsteine.GetUpperBound(1))
                {
                    if (speilfeld.Spielsteine[spielsteine.XKoordinate.Value - i, spielsteine.YKoordinate.Value + i] != null && speilfeld.Spielsteine[spielsteine.XKoordinate.Value - i, spielsteine.YKoordinate.Value + i].Seite == spielsteine.Seite)
                    {
                        countOfSameColour++;
                    }
                    else
                    {
                        break; // No point continuing
                    }
                }
                else
                {
                    break; // No point continuing
                }
            }

            if (countOfSameColour >= Spiel.STEINLAENGE)
            {
                return(true);      // Win condition
            }
            countOfSameColour = 0; // Re-initialise

            // 4) Lastly, negative X, negative Y - this is checking "down and left" in the 2d space
            // Decrement both X and Y axis values
            for (int i = 0; i < Spiel.STEINLAENGE; i++)
            {
                if (spielsteine.XKoordinate.Value - i >= 0 && spielsteine.YKoordinate.Value - i >= 0)
                {
                    if (speilfeld.Spielsteine[spielsteine.XKoordinate.Value - i, spielsteine.YKoordinate.Value - i] != null && speilfeld.Spielsteine[spielsteine.XKoordinate.Value - i, spielsteine.YKoordinate.Value - i].Seite == spielsteine.Seite)
                    {
                        countOfSameColour++;
                    }
                    else
                    {
                        break; // No point continuing
                    }
                }
                else
                {
                    break; // No point continuing
                }
            }

            return(countOfSameColour >= Spiel.STEINLAENGE);
        }