/// <summary> /// Tic-Tac-Toe játékmodell példányosítása. /// </summary> public TicTacToeViewModel(ITicTacToeModel model) { TableSize = 10; _model = model; _model._tableSize = TableSize; _model.NewGame(); _model.GameStarted += new EventHandler <GameStartedEventArgs>(Model_GameStarted); _model.GameLoaded += Model_GameLoaded; _model.FieldChanged += new EventHandler <FieldChangedEventArgs>(Model_FieldChanged); _model.GameOver += new EventHandler <GameOverEventArgs>(Model_GameOver); _model.TimePassed += new EventHandler <TimePassedEventArgs>(Model_TimePassed); CurrentPlayer = PlayerToField(_model._currentPlayer); // parancsok kezelése //NewGameCommand = new DelegateCommand(param => _model.NewGame()); NewGameCommand = new DelegateCommand(param => onNewGame()); LoadGameCommand = new DelegateCommand(param => OnLoadGame()); SaveGameCommand = new DelegateCommand(param => OnSaveGame()); ExitGameCommand = new DelegateCommand(param => OnGameExit()); PauseGameCommand = new DelegateCommand(param => OnGamePause()); // játéktábla létrehozása Fields = new ObservableCollection <TicTacToeField>(); Refresh(); }
/// <summary> /// Initializes the current instance. /// </summary> /// <param name="m">Game logic.</param> public void Initialize(ITicTacToeModel m) { _model = m; _model.GameStarted += new EventHandler(Model_GameStarted); _model.FieldChanged += new EventHandler <FieldChangedEventArgs>(Model_FieldChanged); _model.GameOver += new EventHandler <GameOverEventArgs>(Model_GameOver); Fields = new ObservableCollection <ITicTacToeField>(); }
// Construct a new model specific child of the View Model public TicTacToeViewModelChild(TicTacToeViewModel parent, ITicTacToeModel <Game, Move, Player> TicTacToeModel) { this.parent = parent; this.TicTacToeModel = TicTacToeModel; // if the game state has changed and it's not null, update the UI to reflect the new game state this.WhenAnyValue(vm => vm.gameState) .Where(gameState => gameState != null) .Subscribe(gameState => RefreshView()); }
/// <summary> /// ランダムに<see cref="playerForm"/>の駒を配置します /// </summary> /// <param name="player"></param> /// <param name="model"></param> public async void ChangedToMyTurn(PlayerForm player, ITicTacToeModel model) { await Task.Delay(TimeSpan.FromSeconds(1)); int row; int column; (row, column) = VacantPosition(model, model.BoardSize); model.PutPiece(row, column, player); }
/// <summary> /// 駒が置かれていない座標をランダムに取得します。 /// </summary> /// <returns></returns> private (int row, int column) VacantPosition(ITicTacToeModel model, int boardSize) { int row; int column; Random random = new Random(); row = random.Next(0, boardSize); column = random.Next(0, boardSize); while (!model.BoardStatuses[row, column].Equals(PlayerForm.None)) { row = random.Next(0, boardSize); column = random.Next(0, boardSize); } return(row, column); }
/// <summary> /// Tic-Tac-Toe játékmodell példányosítása. /// </summary> public TicTacToeViewModel(ITicTacToeModel model) { _model = model; _model.GameStarted += new EventHandler(Model_GameStarted); _model.FieldChanged += new EventHandler <FieldChangedEventArgs>(Model_FieldChanged); // parancsok kezelése NewGameCommand = new DelegateCommand(param => _model.NewGame()); LoadGameCommand = new DelegateCommand(param => OnLoadGame()); SaveGameCommand = new DelegateCommand(param => OnSaveGame()); ExitGameCommand = new DelegateCommand(param => OnGameExit()); // játéktábla létrehozása Fields = new ObservableCollection <TicTacToeField>(); TableSize = 30; Refresh(); }
/// <summary> /// Alkalmazás indulásának eseménykezelője. /// </summary> private void App_Startup(object sender, StartupEventArgs e) { _dataAccess = new TicTacToeFileDataAccess(); _model = new BasicTicTacToeModel(_dataAccess); _model.GameWon += new EventHandler <GameWonEventArgs>(Model_GameWon); _model.GameOver += new EventHandler(Model_GameOver); _model.NewGame(); _viewModel = new TicTacToeViewModel(_model); _viewModel.LoadGame += new EventHandler(ViewModel_LoadGame); // kezeljük a nézetmodell eseményeit _viewModel.SaveGame += new EventHandler(ViewModel_SaveGame); _viewModel.GameExit += new EventHandler(ViewModel_GameExit); _window = new TicTacToeWindow(); _window.DataContext = _viewModel; _window.Show(); }
public void Initialize(Player p1, Player p2) { _model = Activator.CreateInstanceFrom("TicTacToeModel.dll", "TicTacToeModel.TicTacToeModel") .Unwrap() as ITicTacToeModel; _model.Initialize(p1, p2); _model.GameOver += new EventHandler <GameOverEventArgs>(Model_GameOver); _viewModel = Activator.CreateInstanceFrom("TicTacToeViewModel.dll", "TicTacToeViewModel.TicTacToeViewModel") .Unwrap() as ITicTacToeViewModel; _viewModel.Initialize(_model); _viewModel.BackCommand = new DelegateCommand(p => ViewModel_GameExit()); _model.NewGame(); _window = Activator.CreateInstanceFrom("TicTacToeView.dll", "TicTacToeView.TicTacToeWindow").Unwrap() as Window; _window.DataContext = _viewModel; _window.Closed += new EventHandler(OnWindowClosed); }
public void PutPiece(int row, int column, PlayerForm player, ITicTacToeModel model) { return; }
/// <summary> /// 駒が置かれていない座標を取得します。 /// </summary> /// <returns></returns> private (int row, int column) VacantPosition(ITicTacToeModel model, int boardSize, PlayerForm player) { //駒が置かれていない座標をランダムに取得 int row; int column; Random random = new Random(); row = random.Next(0, boardSize); column = random.Next(0, boardSize); while (!model.BoardStatuses[row, column].Equals(PlayerForm.None)) { row = random.Next(0, boardSize); column = random.Next(0, boardSize); } var list = new List <PlayerForm>(); var count = 0; //縦横斜めの列のうち、自分の駒が一つもないかつ、相手の駒が一つ以上あるかつ、相手の駒の数が多い列に駒を置く //行の判定 for (int i = 0; i < boardSize; i++) { for (int j = 0; j < boardSize; j++) { list.Add(model.BoardStatuses[i, j]); } if (!list.Contains(player) && list.Contains(player.GetOpponentPlayerForm()) && count < list.Count(element => element == player.GetOpponentPlayerForm())) { count = list.Count(element => element == player.GetOpponentPlayerForm()); row = i; var index = random.Next(0, list.Count - 1); while (list[index] != PlayerForm.None) { index = random.Next(0, list.Count - 1); } column = index; } list.Clear(); } //列の判定 for (int j = 0; j < boardSize; j++) { for (int i = 0; i < boardSize; i++) { list.Add(model.BoardStatuses[i, j]); } if (!list.Contains(player) && list.Contains(player.GetOpponentPlayerForm()) && count < list.Count(element => element == player.GetOpponentPlayerForm())) { count = list.Count(element => element == player.GetOpponentPlayerForm()); var index = random.Next(0, list.Count - 1); while (list[index] != PlayerForm.None) { index = random.Next(0, list.Count - 1); } row = index; column = j; } list.Clear(); } //右斜めの判定 for (int i = 0; i < boardSize; i++) { for (int j = 0; j < boardSize; j++) { var x = i; var y = j; while (0 <= x && y < boardSize) { list.Add(model.BoardStatuses[x, y]); x--; y++; } if (list.Count < model.AlignNumber) { list.Clear(); break; } if (!list.Contains(player) && list.Contains(player.GetOpponentPlayerForm()) && count < list.Count(element => element == player.GetOpponentPlayerForm())) { count = list.Count(element => element == player.GetOpponentPlayerForm()); var index = random.Next(0, list.Count - 1); while (list[index] != PlayerForm.None) { index = random.Next(0, list.Count - 1); } row = i - index; column = j + index; } list.Clear(); } } //左斜めの判定 for (int i = 0; i < boardSize; i++) { for (int j = 0; j < boardSize; j++) { var x = i; var y = j; while (x < boardSize && y < boardSize) { list.Add(model.BoardStatuses[x, y]); x++; y++; } if (list.Count < model.AlignNumber) { list.Clear(); break; } if (!list.Contains(player) && list.Contains(player.GetOpponentPlayerForm()) && count < list.Count(element => element == player.GetOpponentPlayerForm())) { count = list.Count(element => element == player.GetOpponentPlayerForm()); var index = random.Next(0, list.Count - 1); while (list[index] != PlayerForm.None) { index = random.Next(0, list.Count - 1); } row = i + index; column = j + index; } list.Clear(); } } return(row, column); }
public void ChangedToMyTurn(PlayerForm player, ITicTacToeModel model) { return; }
public void PutPiece(int row, int column, PlayerForm player, ITicTacToeModel model) { model.PutPiece(row, column, player); }