Пример #1
0
 public GameStateMessage(List <CatanClient> clients, CatanClient currentClient, CatanClient winner, Hexagon[][] hexagoneFields)
 {
     this.Clients        = clients;
     this.CurrentClient  = currentClient;
     this.HexagoneFields = hexagoneFields;
     this.Winner         = winner;
 }
Пример #2
0
        public void Handle(CatanClient catanClient, CatanClientStateChangeMessage catanClientStateChangeMessage)
        {
            this.catanClient = catanClient;
            if (catanClientStateChangeMessage.NewSpielFiguren != null)
            {
                foreach (var newSpielFiguren in catanClientStateChangeMessage.NewSpielFiguren.Where(spielFigur => spielFigur is Siedlung).ToList())
                {
                    addNewSiedlung(newSpielFiguren as Siedlung);
                }

                foreach (var newSpielFiguren in catanClientStateChangeMessage.NewSpielFiguren.Where(spielFigur => spielFigur is Strasse).ToList())
                {
                    addNewStrasse(newSpielFiguren as Strasse);
                }

                foreach (var newSpielFiguren in catanClientStateChangeMessage.NewSpielFiguren.Where(spielFigur => spielFigur is Stadt).ToList())
                {
                    addNewStadt(newSpielFiguren as Stadt);
                }
            }

            if (catanClientStateChangeMessage.NewEntwicklungskarten != null)
            {
                foreach (var newEntwicklungskarte in catanClientStateChangeMessage.NewEntwicklungskarten)
                {
                    addNewEntwicklungskarte(newEntwicklungskarte);
                }
            }
        }
Пример #3
0
        private void NetMessageWriter_CatanClientAuth_Response_WriteCompleted(object obj, NetworkMessageWriterWriteCompletedEventArgs e)
        {
            //getDisconnectedClientConnections(silently:true);

            // new catan client
            CatanClient catanClient = new CatanClient(e.TcpClient, e.TcpClient.Client.RemoteEndPoint.ToString(), (e.NetMessage as CatanClientAuthenticationResponseMessage).AuthRequestMessage.Playername);

            catanClients.Add(catanClient);

            Console.WriteLine($"Catan player joined: {catanClient.Name}");
            if (catanClients.Count == maxClients)
            {
                // Start game
                tcpListener.Stop();
                Thread.Sleep(1000);

                catanClients.ForEach(client =>
                {
                    var netReader            = new NetworkMessageReader(client.TcpClient);
                    netReader.ReadCompleted += NetMessageReader_CatanClientMessageReceived;
                    netReader.ReadAsync(readLoop: true);
                }); // error handling wird ignoriert !!!

                iLogicLayer.ServerFinishedListening(catanClients);
            }
        }
Пример #4
0
        private bool[][][] getAllowedStaedteByClient(CatanClient client)
        {
            if (client.SpielfigurenContainer.Siedlungen?.Count <= 0)
            {
                return(null);
            }

            var allowedStaedte = initilize3DBoolArrayBasedOnHexfields();

            foreach (var siedlung in client.SpielfigurenContainer.Siedlungen)
            {
                var gridPoint = HexagonGrid.GetGridPointByHexagonPositionAndPoint(siedlung.HexagonPosition, siedlung.HexagonPoint);
                foreach (var hexPosEdge in HexagonGrid.GetHexagonEdgesByGridPoint(HexagonGrid.GetHexagonesByGridPoint(gridPoint), gridPoint))
                {
                    if (client.SpielfigurenContainer.Strassen.Find(strasse =>
                                                                   HexagonGrid.IsHexagonEdgeOnHexagonEdge(hexPosEdge, new HexagonPositionHexagonEdge(strasse.HexagonPosition, strasse.HexagonEdge))) != null)
                    {
                        allowedStaedte[siedlung.HexagonPosition.RowIndex][siedlung.HexagonPosition.ColumnIndex][siedlung.HexagonPoint.Index] = true;
                        break;
                    }
                }
            }

            return(allowedStaedte);
        }
Пример #5
0
 private void addNewKartenByNewStrassenNewSiedlungen(CatanClient cclient, int newStrassen, int newSiedlung)
 {
     if (newStrassen >= 2)
     {
         cclient.Siegpunkte += 1;
     }
     if (newSiedlung >= 1)
     {
         cclient.Siegpunkte += 1;
     }
 }
Пример #6
0
        /*
         * public void ClientGameStateChangeMessageReceived(CatanClientStateChangeMessage catanClientStateChangeMessage)
         * {
         *  CatanClient receivedMessageCatanClient = catanClients.Find(client => client.ID == catanClientStateChangeMessage.ClientID);
         *  if (receivedMessageCatanClient == null)
         *      new NullReferenceException("ClientGameStateChangeMessageReceived");
         *
         *  if (this.currentClient == receivedMessageCatanClient)
         *  {
         *      //modifyCatanClientStateMessageIfNecessary(catanClientStateChangeMessage);
         *      this.messageHandler.Handle(receivedMessageCatanClient, catanClientStateChangeMessage);
         *
         #region Gewinner gefunden?
         *
         *      CatanClient winner = null;
         *      if (receivedMessageCatanClient.Siegpunkte >= MAX_SIEGPUNKTE_WINN)
         *      {
         *          winner = receivedMessageCatanClient;
         *      }
         *      else
         *      {
         *          currentClient = getNextClient();
         *          clearAllowedSpielFigurenByClients();
         *          setAllowedSpielFigurenByClient(currentClient);
         *      }
         *
         #endregion
         *
         *      iNetworkLayer.SendBroadcastMessage(new GameStateMessage(this.catanClients, currentClient, winner, null));
         *  }
         * }*/

        public void ClientGameStateChangeMessageReceived(CatanClientStateChangeMessage catanClientStateChangeMessage)
        {
            CatanClient receivedMessageCatanClient = catanClients.Find(client => client.ID == catanClientStateChangeMessage.ClientID);

            if (receivedMessageCatanClient == null)
            {
                new NullReferenceException("ClientGameStateChangeMessageReceived");
            }

            if (this.currentClient == receivedMessageCatanClient)
            {
                modifyCatanClientStateMessageIfNecessary(catanClientStateChangeMessage);
                this.messageHandler.Handle(receivedMessageCatanClient, catanClientStateChangeMessage);
                CatanClient winner = null;


                // Neue Karten verdient?
                int newStrassen = catanClientStateChangeMessage.NewSpielFiguren != null?catanClientStateChangeMessage.NewSpielFiguren.Where(sf => sf is Strasse).ToList().Count : 0;

                int newSiedlung = catanClientStateChangeMessage.NewSpielFiguren != null?catanClientStateChangeMessage.NewSpielFiguren.Where(sf => sf is Siedlung).ToList().Count : 0;


                if (catanClientStateChangeMessage.IsTurnDone)
                {
                    #region Gewinner gefunden?

                    if (receivedMessageCatanClient.Siegpunkte >= MAX_SIEGPUNKTE_WINN)
                    {
                        winner = receivedMessageCatanClient;
                    }

                    #endregion

                    currentClient    = getNextClient();
                    previousTurnDone = true;
                }

                clearAllowedSpielFigurenByClients();
                setAllowedSpielFigurenByClient(currentClient);

                iNetworkLayer.SendBroadcastMessage(new GameStateMessage(this.catanClients, currentClient, winner, null));

                //catanClients.ForEach(cclient => addNewKartenByNewStrassenNewSiedlungen(cclient,0, newSiedlung));

                if (catanClientStateChangeMessage.IsTurnDone && previousTurnDone)
                {
                    // Neue Karten verdient?
                    catanClients.ForEach(cclient => addNewKartenByClient(cclient));
                    previousTurnDone = false;
                }
            }
        }
Пример #7
0
 private bool isCatanClientConnected(CatanClient catanClient)
 {
     try
     {
         return(!(catanClient.TcpClient.Client.Poll(500, SelectMode.SelectRead) &&
                  catanClient.TcpClient.Client.Poll(500, SelectMode.SelectWrite) &&
                  !catanClient.TcpClient.Client.Poll(500, SelectMode.SelectError)));
     }
     catch (Exception ex)
     {
         iLogicLayer.ThrowException(ex);
         return(false);
     }
 }
Пример #8
0
 private void setAllowedSpielFigurenByClient(CatanClient client)
 {
     if (BuildChecker.CanBuildSiedlung(client.KartenContainer))
     {
         client.AllowedSiedlungen = getAllowedSiedlungenByClient(client);
     }
     if (BuildChecker.CanBuildStadt(client.KartenContainer))
     {
         client.AllowedStaedte = getAllowedStaedteByClient(client);
     }
     if (BuildChecker.CanBuildStrasse(client.KartenContainer))
     {
         client.AllowedStrassen = getAllowedStrassenByClient(client);
     }
 }
Пример #9
0
        public void ServerFinishedListening(List <CatanClient> catanClients)
        {
            // Let clients play catan !
            this.catanClients.Clear();
            this.catanClients.AddRange(catanClients);
            setClientsColor();

            currentClient = getNextClient();

            // damit die Clients bei der ersten Runde eine Stadt und Strasse bauen können ...
            catanClients.ForEach(client => initKartenContainerWithStartKarten(client));

            clearAllowedSpielFigurenByClients();
            setAllowedSpielFigurenByClient(currentClient);

            iNetworkLayer.SendBroadcastMessage(new GameStateMessage(catanClients, currentClient, null, HexagonGrid.Instance.Hexagones));
        }
Пример #10
0
        private void initKartenContainerWithStartKarten(CatanClient client)
        {
            client.KartenContainer.AddRohstoffkarte(KartenContainer.Rohstoffkarte.Eisen);
            client.KartenContainer.AddRohstoffkarte(KartenContainer.Rohstoffkarte.Eisen);
            client.KartenContainer.AddRohstoffkarte(KartenContainer.Rohstoffkarte.Eisen);
            client.KartenContainer.AddRohstoffkarte(KartenContainer.Rohstoffkarte.Eisen);

            client.KartenContainer.AddRohstoffkarte(KartenContainer.Rohstoffkarte.Getreide);
            client.KartenContainer.AddRohstoffkarte(KartenContainer.Rohstoffkarte.Getreide);
            client.KartenContainer.AddRohstoffkarte(KartenContainer.Rohstoffkarte.Getreide);
            client.KartenContainer.AddRohstoffkarte(KartenContainer.Rohstoffkarte.Getreide);

            client.KartenContainer.AddRohstoffkarte(KartenContainer.Rohstoffkarte.Wolle);
            client.KartenContainer.AddRohstoffkarte(KartenContainer.Rohstoffkarte.Wolle);
            client.KartenContainer.AddRohstoffkarte(KartenContainer.Rohstoffkarte.Wolle);
            client.KartenContainer.AddRohstoffkarte(KartenContainer.Rohstoffkarte.Wolle);

            client.KartenContainer.AddRohstoffkarte(KartenContainer.Rohstoffkarte.Wasser);
            client.KartenContainer.AddRohstoffkarte(KartenContainer.Rohstoffkarte.Wasser);
            client.KartenContainer.AddRohstoffkarte(KartenContainer.Rohstoffkarte.Wasser);
            client.KartenContainer.AddRohstoffkarte(KartenContainer.Rohstoffkarte.Wasser);
        }
Пример #11
0
        private void addNewKartenByClient(CatanClient cclient)
        {
            foreach (var strasse in cclient.SpielfigurenContainer.Strassen)
            {
                var            foundHexagons = new List <Hexagon>();
                List <Hexagon> tempHexagons;
                tempHexagons = HexagonGrid.GetHexagonesByGridPoint(HexagonGrid.GetGridPointByHexagonPositionAndPoint(strasse.HexagonPosition, strasse.HexagonEdge.PointA));
                foreach (var tempHex in tempHexagons)
                {
                    if (!foundHexagons.Exists(hex => hex.Position.Equals(tempHex.Position)))
                    {
                        foundHexagons.Add(tempHex);
                    }
                }
                tempHexagons = HexagonGrid.GetHexagonesByGridPoint(HexagonGrid.GetGridPointByHexagonPositionAndPoint(strasse.HexagonPosition, strasse.HexagonEdge.PointB));

                foreach (var tempHex in tempHexagons)
                {
                    if (!foundHexagons.Exists(hex => hex.Position.Equals(tempHex.Position)))
                    {
                        foundHexagons.Add(tempHex);
                    }
                }

                // checking edges
                foreach (var hex in foundHexagons)
                {
                    foreach (var edge in hex.Edges)
                    {
                        if (HexagonGrid.IsHexagonEdgeOnHexagonEdge(new HexagonPositionHexagonEdge(hex.Position, edge), new HexagonPositionHexagonEdge(strasse.HexagonPosition, strasse.HexagonEdge)))
                        {
                            cclient.KartenContainer.AddRohstoffkarte(Game.LandFeld.GetErtragByLandFeldTyp(hex.LandFeldTyp)); // matched hex
                        }
                    }
                }
            }
        }
Пример #12
0
 public CatanClientConnectedEventArgs(CatanClient catanClient)
 {
     this.CatanClient = catanClient;
 }
Пример #13
0
        private bool[][][] getAllowedSiedlungenByClient(CatanClient client)
        {
            bool[][][] allowedSiedlungen = initilize3DBoolArrayBasedOnHexfields();

            for (int rowIndex = 0; rowIndex < allowedSiedlungen.GetLength(0); rowIndex++)
            {
                for (int columnIndex = 0; columnIndex < allowedSiedlungen[rowIndex].GetLength(0); columnIndex++)
                {
                    for (int pointIndex = 0; pointIndex < allowedSiedlungen[rowIndex][columnIndex].GetLength(0); pointIndex++)
                    {
                        var currentGridPoint = HexagonGrid.GetGridPointByHexagonPositionAndPoint(new HexagonPosition(rowIndex, columnIndex), new HexagonPoint(pointIndex));

                        var foundHexagones = HexagonGrid.GetHexagonesByGridPoint(currentGridPoint);
                        if (foundHexagones.Count >= 2)
                        {
                            #region Überprüfen, ob es schon eine Siedlung an diesem GridPoint angelegt wurde, wenn ja, dann ignorieren

                            var hexPositionAndHexPoint = HexagonGrid.GetHexagonAndHexagonPointByGridPoint(currentGridPoint);
                            if (hexPositionAndHexPoint.Exists(hexPosHexPoint => allowedSiedlungen[hexPosHexPoint.HexagonPosition.RowIndex][hexPosHexPoint.HexagonPosition.ColumnIndex][hexPosHexPoint.Point.Index]))
                            {
                                continue;
                            }

                            #endregion

                            #region Überprüfen, ob es hier eine Stadt oder Siedlung gibt

                            var stadtGefunden = catanClients.Exists(_client => _client.SpielfigurenContainer.Staedte.Find(
                                                                        stadt => HexagonGrid.GetGridPointByHexagonPositionAndPoint(stadt.HexagonPosition, stadt.HexagonPoint).Equals(currentGridPoint)) != null);

                            var siedlungGefunden = catanClients.Exists(_client => _client.SpielfigurenContainer.Siedlungen.Find(
                                                                           siedlung => HexagonGrid.GetGridPointByHexagonPositionAndPoint(siedlung.HexagonPosition, siedlung.HexagonPoint).Equals(currentGridPoint)) != null);

                            #endregion

                            if (!stadtGefunden && !siedlungGefunden)
                            {
                                #region Überprüfen, ob die drei angrenzenden Kreuzungen von Siedlungen oder Städten besetzt sind

                                allowedSiedlungen[rowIndex][columnIndex][pointIndex] = catanClients.Find(_client =>

                                                                                                         _client.SpielfigurenContainer.Siedlungen.Find(siedlung =>
                                                                                                                                                       HexagonGrid.GetHexagonEdgesByGridPoint(foundHexagones, currentGridPoint).Find(hex =>
                                                                                                                                                                                                                                     HexagonGrid.IsGridPointOnHexagonEdge(hex.HexagonPosition, hex.HexagonEdge,
                                                                                                                                                                                                                                                                          HexagonGrid.GetGridPointByHexagonPositionAndPoint(siedlung.HexagonPosition, siedlung.HexagonPoint))) != null) != null ||

                                                                                                         _client.SpielfigurenContainer.Staedte.Find(stadt =>
                                                                                                                                                    HexagonGrid.GetHexagonEdgesByGridPoint(foundHexagones, currentGridPoint).Find(hex =>
                                                                                                                                                                                                                                  HexagonGrid.IsGridPointOnHexagonEdge(hex.HexagonPosition, hex.HexagonEdge,
                                                                                                                                                                                                                                                                       HexagonGrid.GetGridPointByHexagonPositionAndPoint(stadt.HexagonPosition, stadt.HexagonPoint))) != null) != null) == null;

                                #endregion
                            }
                            else
                            {
                                allowedSiedlungen[rowIndex][columnIndex][pointIndex] = false;
                            }
                        }
                    }
                }
            }
            return(allowedSiedlungen);
        }
Пример #14
0
        private bool[][][] getAllowedStrassenByClient(CatanClient client)
        {
            if (client.SpielfigurenContainer.Siedlungen?.Count <= 0)
            {
                return(null);
            }

            bool[][][] allowedStrassen = initilize3DBoolArrayBasedOnHexfields();
            #region An den eigenen Siedlungen und Städten dürfen Straßen gebaut werden

            // Siedlungen
            foreach (var siedlung in client.SpielfigurenContainer.Siedlungen)
            {
                var hexPosEdges = HexagonGrid.GetHexagonEdgesByGridPoint(HexagonGrid.Instance.HexagonesList, HexagonGrid.GetGridPointByHexagonPositionAndPoint(siedlung.HexagonPosition, siedlung.HexagonPoint));
                foreach (var hexPosEdge in hexPosEdges)
                {
                    allowedStrassen[hexPosEdge.HexagonPosition.RowIndex][hexPosEdge.HexagonPosition.ColumnIndex][hexPosEdge.HexagonEdge.Index] =
                        client.SpielfigurenContainer.Strassen.Find(strasse =>
                                                                   HexagonGrid.IsHexagonEdgeOnHexagonEdge(hexPosEdge, new HexagonPositionHexagonEdge(strasse.HexagonPosition, strasse.HexagonEdge))) == null;
                }
            }
            // Städte
            foreach (var stadt in client.SpielfigurenContainer.Staedte)
            {
                var hexPosEdges = HexagonGrid.GetHexagonEdgesByGridPoint(HexagonGrid.Instance.HexagonesList, HexagonGrid.GetGridPointByHexagonPositionAndPoint(stadt.HexagonPosition, stadt.HexagonPoint));
                foreach (var hexPosEdge in hexPosEdges)
                {
                    allowedStrassen[hexPosEdge.HexagonPosition.RowIndex][hexPosEdge.HexagonPosition.ColumnIndex][hexPosEdge.HexagonEdge.Index] =
                        client.SpielfigurenContainer.Strassen.Find(strasse =>
                                                                   HexagonGrid.IsHexagonEdgeOnHexagonEdge(hexPosEdge, new HexagonPositionHexagonEdge(strasse.HexagonPosition, strasse.HexagonEdge))) == null;
                }
            }

            #endregion

            #region An den eigenen Straßen dürfen Straßen gebaut werden und auf der keine fremde Siedlung oder Stadt steht

            foreach (var strasse in client.SpielfigurenContainer.Strassen)
            {
                var gridPointA = HexagonGrid.GetGridPointByHexagonPositionAndPoint(strasse.HexagonPosition, strasse.HexagonEdge.PointA);
                var gridPointB = HexagonGrid.GetGridPointByHexagonPositionAndPoint(strasse.HexagonPosition, strasse.HexagonEdge.PointB);

                foreach (var allowedGridPoint in new List <GridPoint>()
                {
                    gridPointA, gridPointB
                })
                {
                    foreach (var allowedHexagonEdge in HexagonGrid.GetHexagonEdgesByGridPoint(HexagonGrid.Instance.HexagonesList, allowedGridPoint).Where(hexPosEdge =>
                                                                                                                                                          catanClients.Find(_client => _client.SpielfigurenContainer.Strassen.Find(_strasse =>
                                                                                                                                                                                                                                   HexagonGrid.IsHexagonEdgeOnHexagonEdge(hexPosEdge, new HexagonPositionHexagonEdge(_strasse.HexagonPosition, _strasse.HexagonEdge))) != null) == null).ToList())

                    {
                        allowedStrassen[allowedHexagonEdge.HexagonPosition.RowIndex][allowedHexagonEdge.HexagonPosition.ColumnIndex][allowedHexagonEdge.HexagonEdge.Index] = true;
                    }
                }
            }

            #endregion

            return(allowedStrassen);
        }