/// <summary>
 /// The more formal connected client model structor
 /// </summary>
 /// <param name="clientSocket"></param>
 /// <param name="listenerSocket"></param>
 public ReversiClientModel(TcpClient clientSocket, TcpListener listenerSocket) : base(clientSocket, listenerSocket)
 {
     Game              = null;
     LastMove          = new GameMoveModel();
     ClientPlayer      = new PlayerModel();
     TimeConnectedWhen = DateTime.Now;
 }
 /// <summary>
 /// A default constructor
 /// </summary>
 public ReversiClientModel() : base(null, null)
 {
     Game              = null;
     LastMove          = new GameMoveModel();
     ClientPlayer      = new PlayerModel();
     TimeConnectedWhen = DateTime.Now;
 }
        /// <summary>
        /// The event to fire when the square is clicked.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void GameSquare_OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            var obj      = sender as FrameworkElement;
            var myObject = obj.DataContext as ReversiSquareVM;

            var Parent = VisualTreeHelper.GetParent(obj);

            var windowobj = TreeHelper.TryFindParent <MainWindow>(obj);
            var rcvm_obj  = windowobj.DataContext as ReversiClientViewModel;
            //var movemodel = rcvm_obj.Model.LastMove;
            var player = rcvm_obj.ThisPlayerViewModel.IdType;

            // MessageBox.Show("Index " + movemodel.MoveIndex.ToString());



            if (myObject.Model.HasPiece)
            {
                return;
            }

            //MessageBox.Show("Index: " + myObject.Model.Index + " was clicked");
            var movemodel = new GameMoveModel(player, myObject.Model.Index);

            // Send move to server
            rcvm_obj.Model.LastMove = movemodel;
            DataTransmission.SerializeData <GameMoveModel>(rcvm_obj.Model.LastMove, rcvm_obj.Model.ConnectionSocket);
        }
        public ReversiClientModel(ClientModel clientModel, string name) : base(clientModel)
        {
            ReversiClientModel model = (ReversiClientModel)clientModel;

            Game         = null;
            LastMove     = new GameMoveModel();
            ClientPlayer = new PlayerModel(model.ClientPlayer.PlayerId, model.ClientPlayer.IdType, name);

            this.ClientProcess     = clientModel.ClientProcess;
            this.ClientMainThread  = clientModel.ClientMainThread;
            this.TimeConnectedWhen = DateTime.Now;
        }
Пример #5
0
        public async Task <HttpResponseMessage> Post(GameMoveModel model)
        {
            var results = new GameMoveResultsModel();
            var player  = ApplicationUser.GetCurrentPlayer(this.User);

            var point = new DomainModel.Point(model.MoveToX, model.MoveToY);
            var game  = await this.gameService.PerformMoveAsync(model.GameID, player.ID, model.TokenID, point);

            results.Add(player, game);

            return(Request.CreateResponse(HttpStatusCode.OK, results));
        }
Пример #6
0
        public async Task <IActionResult> Move(int gameId, [FromBody] GameMoveModel move)
        {
            var playerId = base.HttpContext.GetPlayerId();
            var request  = new GameMove.Request()
            {
                GameId   = gameId,
                PlayerId = playerId,
                Card     = move.Card,
                TileId   = move.TileId
            };
            var response = await this.mediator.Send(request, default);

            return(base.Json(new { GameId = response.GameId, Cards = response.Cards, Tiles = response.Tiles }));
        }
        ///// <summary>
        ///// Removes a player from the staging area to the gameroom.
        ///// </summary>
        //private static void RemovePlayersFromStaging()
        //{
        //    for (int i = ReversiSettings.ReversiPlayersPerGame - 1; i >= 0; i--)
        //    {
        //        StagingArea.RemoveAt(i);
        //    }
        //}



        /// <summary>
        /// The main thread routine for each game
        /// </summary>
        /// <param name="data">The game staging area list of client models</param>
        private void InitializeMatchup(object data)
        {
            List <ReversiClientModel> clientModels = (List <ReversiClientModel>)data;

            //// Create the game instance which moves the players to the game room
            ReversiGameModel game = new ReversiGameModel(clientModels);

            RunningGames.Add(game.GameId, game);  // add the game to the dictionary of running games

            Console.WriteLine("... GameServer: Matchup pairing complete. Game " + game.GameId.ToString() + " is ready to start.");
            Console.WriteLine(game.DisplayGameInfoComplete());

            // Send the game object to each of the clients.
            foreach (KeyValuePair <int, ClientModel> item in game.CurrentPlayersList)
            {
                ReversiClientModel client = (ReversiClientModel)item.Value;

                // Send the game data to each of the players
                Console.WriteLine("Sending initial game matchup to players");
                DataTransmission.SerializeData <ReversiGameModel>(game, client.ConnectionSocket);

                // And remove the players from the Staging area.
                StagingArea.Remove(client);
            }

            //// The main game loop. Process individual moves here
            List <TcpClient> sockets = game.GetPlayersSocketList();

            while (!game.GameIsOver)
            {
                // If the game is paused ignore the user input
                if (game.GameIsPaused == true)
                {
                    continue;
                }

                if (game.GameOverCheckRequired)
                {
                    if (game.CheckGameOver(game.CurrentPlayer) == true)
                    {
                        Console.WriteLine("No available moves for " + game.CurrentPlayer);
                        game.GameIsOver = true;
                        break;
                    }

                    Console.WriteLine("Valid moves available for " + game.CurrentPlayer);
                    game.AvailableMovesList.ForEach(Console.WriteLine);
                    game.GameOverCheckRequired = false;
                }

                // If the current turn is valid and complete, switch to the next player
                if (game.TurnComplete)
                {
                    Console.WriteLine(game.Gameboard.DrawGameboardString());
                    game.NextPlayer();
                    game.TurnComplete          = false;
                    game.GameOverCheckRequired = true;

                    // Update the game model for all players...
                    SendGameToAll(game);
                }

                List <ClientModel> disconnectList = new List <ClientModel>();
                foreach (KeyValuePair <int, ClientModel> item in game.CurrentPlayersList)
                {
                    ClientModel client = item.Value;
                    Socket      s      = client.ConnectionSocket.Client;

                    // Check for disconnected sockets
                    if (!SocketConnected(s))
                    {
                        Console.WriteLine("GameServer: (GameID #" + game.GameId + ")");

                        disconnectList.Add(client);
                    }
                }

                // Remove any disconnected players from the game...
                foreach (ClientModel disconnectClient in disconnectList)
                {
                    ClientDisconnectedEventArgs args = new ClientDisconnectedEventArgs
                    {
                        client           = disconnectClient,
                        TimeOfDisconnect = DateTime.Now
                    };
                    game.GameIsPaused = true;
                    OnClientDisconnected(args);

                    game.RemovePlayerFromGame(((ClientModel)disconnectClient));
                    try
                    {
                        disconnectClient.ConnectionSocket.Close();
                    }
                    catch
                    {
                        // Do nothing
                    }
                }

                // Now proceed through the current player list, looking for moves sent by the clients
                foreach (KeyValuePair <int, ClientModel> item in game.CurrentPlayersList)
                {
                    NetworkStream stream;
                    try
                    {
                        stream = item.Value.ConnectionSocket.GetStream();
                    }
                    catch (ObjectDisposedException e)
                    {
                        // Catches a disposed socket possibility here in case it hasn't been fully disposed yet.
                        continue;
                    }

                    if (stream.DataAvailable)
                    {
                        GameMoveModel move = DataTransmission.DeserializeData <GameMoveModel>(item.Value.ConnectionSocket);
                        Console.WriteLine("GameServer: (GameID #" + game.GameId + ")" + move.ByPlayer + " move request received");

                        if (move.ByPlayer == game.CurrentPlayer)
                        {
                            game.CurrentMoveIndex = move.MoveIndex;

                            // Check that the move was valid.
                            if (game.PlayTurn())
                            {
                                Console.WriteLine("GameServer: (GameID #" + game.GameId + ")" + move.ByPlayer + " submitted a valid move");
                                game.TurnComplete     = true;
                                game.CurrentMoveIndex = move.MoveIndex;
                            }
                        }
                        else
                        {
                            Console.WriteLine("GameServer: (GameID #" + game.GameId + ") Move received by opponent.  Ignoring...");
                        }
                    }
                }
            }

            // At this point the game is over.
            Console.WriteLine("The game is over...");
        }