private void saveAndClose_Click(object sender, EventArgs e)
        {
            bool isTurnSelected  = false;
            bool isNameEmpty     = true;
            bool hasBothKings    = false;
            bool areKingsInCheck = true;

            /// Verify form has all valid fields and no kings are in check (turn times are automatically taken care of)
            // Check if the custom game has a name
            isNameEmpty = gameNameBox.Text == "";
            if (isNameEmpty)
            {
                ShowErrorMessage("You must enter a name for this game mode.");
                return;
            }

            // Check if the turns are selected
            isTurnSelected = whiteToMove.Checked || blackToMove.Checked;
            if (!isTurnSelected)
            {
                ShowErrorMessage("You must first select which color moves first on game startup.");
                return;
            }

            // Check to make sure there are both black and white kings on the board
            bool hasWhiteKing = false, hasBlackKing = false;

            foreach (Button square in board)
            {
                if ((string)square.Tag == TagStrings[(int)PieceEnum.WhiteKing])
                {
                    hasWhiteKing = true;
                    if (hasBlackKing)
                    {
                        // Both kings found, exit loop
                        break;
                    }
                }
                else if ((string)square.Tag == TagStrings[(int)PieceEnum.BlackKing])
                {
                    hasBlackKing = true;
                    if (hasWhiteKing)
                    {
                        // Both kings found, exit loop
                        break;
                    }
                }
            }
            hasBothKings = hasBlackKing && hasWhiteKing;
            if (!hasBothKings)
            {
                string missingKings = "";
                if (!hasBlackKing)
                {
                    missingKings += "You are missing the black king";
                    // Both kings missing
                    if (!hasWhiteKing)
                    {
                        missingKings += " and the white king";
                    }
                }
                else if (!hasWhiteKing)
                {
                    missingKings += "You are missing the white king";
                }
                missingKings += ".";
                ShowErrorMessage(missingKings);
                return;
            }

            //Verify no kings are in check
            CheckLogic logic = new CheckLogic(board);

            areKingsInCheck = logic.GetCustomGameCheckState() == ChessUtils.CheckState.Check;
            if (areKingsInCheck)
            {
                ShowErrorMessage("One of your kings is in check!");
                return;
            }

            // Add the settings to the database
            List <Piece> pieces = new List <Piece>();

            foreach (Button square in board)
            {
                Piece       piece = new Piece();
                Coordinates c     = ChessUtils.Settings.GetCoordinatesOfButton(square);
                string      name  = square.Tag.ToString();
                piece.Coordinates = c;
                piece.Name        = name;

                pieces.Add(piece);
            }

            int gameTimerSeconds = IsPlayerTotalTime.Checked ?
                                   ((int)totalMins.Value * 60) + ((int)totalSecs.Value) : 0;

            int moveTimerSeconds = IsPlayerTurnTime.Checked ?
                                   ((int)turnMins.Value * 60) + ((int)turnSecs.Value) : 0;

            CustomGame game = new CustomGame
            {
                Username        = me.Username,
                GameTimer       = gameTimerSeconds,
                MoveTimer       = moveTimerSeconds,
                WhiteMovesFirst = whiteToMove.Checked,
                CustomGameName  = gameNameBox.Text,
                Pieces          = pieces
            };

            bool success = DataApiController <CustomGame> .PostData(ChessUtils.IPAddressWithPort + "AddCustomGame", game);

            if (!success)
            {
                ShowErrorMessage("Error while adding custom game to database.");
            }
            else
            {
                Close();
            }
        }
Ejemplo n.º 2
0
        private void addGameButton_Click(object sender, EventArgs e)
        {
            if (gamesList.SelectedRows.Count > 0)
            {
                // Get the game ID from the row
                int gameId = (int)gamesList.SelectedRows[0].Cells[0].Value;

                // Match the game ID with the appropriate CustomGame in the list
                CustomGame game = gameList.Single(x => x.GameID == gameId);

                // Convert the list of pieces into a double array (board)
                MoveLogic.Piece[][] pieces = new MoveLogic.Piece[8][];
                for (int i = 0; i < 8; ++i)
                {
                    pieces[i] = new MoveLogic.Piece[8];
                }
                foreach (MoveLogic.Piece piece in game.Pieces)
                {
                    MoveLogic.Coordinates c = piece.Coordinates;
                    pieces[c.X][c.Y] = new MoveLogic.Piece();
                    pieces[c.X][c.Y] = piece;
                }

                Random rand     = new Random(Guid.NewGuid().GetHashCode());
                double randNum  = rand.NextDouble();
                bool   hostTurn = true;// (randNum < 0.5);

                moveLogic.myTurn  = hostTurn;
                moveLogic.myColor = moveLogic.myTurn ?
                                    moveLogic.myColor = MoveLogic.pieceColor.white :
                                                        moveLogic.myColor = MoveLogic.pieceColor.black;

                MoveLogic.pieceColor guestColor = (moveLogic.myColor == MoveLogic.pieceColor.white) ?
                                                  MoveLogic.pieceColor.black :
                                                  MoveLogic.pieceColor.white;

                // Create the new session to add to the lobby table
                Session mySession = new Session()
                {
                    HostPlayer       = game.Username,
                    GuestPlayer      = "",
                    GameTimerSeconds = game.GameTimer,
                    MoveTimerSeconds = game.MoveTimer,
                    CustomGameMode   = 3 /* Custom game */,
                    BoardPieces      = pieces,
                    GameID           = gameId,
                    GuestColor       = (int)guestColor
                };

                // Create the signal to send
                TCPSignal signal = new TCPSignal()
                {
                    SignalType = Signal.CreateSession,
                    NewSession = mySession
                };

                // Send the json over to the server
                string json       = JsonConvert.SerializeObject(signal) + "\r";
                byte[] jsonBytes  = ASCIIEncoding.ASCII.GetBytes(json);
                byte[] readBuffer = new byte[65535];
                lobby.stream.Write(jsonBytes, 0, jsonBytes.Length);

                lobby.RefreshTable();
                mySession.SessionID = (int)lobby.GetLobbyTable().Rows[lobby.GetLobbyTable().Rows.Count - 1].Cells[0].Value;

                GameSession session = new GameSession(me, new User("", ""), stream, mySession, lobby, moveLogic, game);
                session.ShowDialog();
                Hide();
                Close();
            }
        }