public override void NextFrame(Drawer d) { if (MenuPaused.IsFocused) { d.Create(MenuPaused); PauseMenuAction(d); return; } d.Create(scoreCounter); var birdContent = bird.ElementContent; // Проверять перед отрисовкой, чтобы не было исключения if (IsBirdIntersectsWithColumn(birdContent) || BirdIntersectsBorder(birdContent)) { GameOverUserAction(d); return; } drawnBird = birdContent; d.Create(buttonLine); d.Create(topLine); d.Create(drawnBird); bird.Fall(birdFallOffset); MoveColumns(d); }
public override void NextFrame(Drawer d) { if (drawBorder) { this.border = d.CreateBorder(ConfigStorage.Current.SnakeGameBorderChar.Value, Padding); drawBorder = false; } if (snake.IsDead(FieldSize, Padding)) { selectGameOverAction(d); return; } if (IsPaused) { d.Create(MenuPaused); CheckPausedMenuSomethingSelected(d); } if (!IsPaused) { MoveSnake(); } if (!isGameOver) { d.Create(snake); d.Create(apple); d.Create(progress.StatusBar); } }
public override void NextFrame(Drawer d) { if (IsPaused) { d.Create(MenuPaused); CheckPauseMenuSomethingSelected(d); return; } else { d.Remove(MenuPaused); } if (playGround.GameOver) { playGround.IsFocused = false; d.Create(GameOverActionMenu); UserSelectionOnPlaygroundFilled(d); return; } this.border = d.CreateBorder(ConfigStorage.Current.TetrisBorderChar.Value, new Padding( leftBorderPlayground, FieldSize.Width - rightBorderPlayground, Padding.Top, Padding.Bottom)); playGround.NextFrame(); rf.ChangeNextTetromino(playGround.NextTetromino); rf.SetScore(playGround.Score); d.Create(rf); d.Create(playGround); playGroundDrawn = playGround.ElementContent; }
void CreateAllGame(Drawer d) { d.Create(snake1); d.Create(snake2); d.Create(snake1Progress.StatusBar); d.Create(snake2Progress.StatusBar); d.Create(apple); }
public override void NextFrame(Drawer d) { if (BorderIsNotDrawn) { d.Create(border); d.RedrawAll(); BorderIsNotDrawn = false; } if (IsGameOver || FinalScreen) { return; } if (IsPaused) { d.Create(MenuPaused); if (MenuPaused.IsSelected) { if (MenuPaused.SelectedIndex == 0) { IsPaused = false; MenuPaused = GetDefaultPauseMenu(); } else if (MenuPaused.SelectedIndex == 1) { CloseGame(d, CloseReason.ForceClose); } } return; } snake1.Move(); snake2.Move(); if (IsDraw()) { CloseGame(d, CloseReason.Draw); return; } if (IsSnakeDead(snake1, other: snake2)) { CloseGame(d, CloseReason.Snake2Win); return; } if (IsSnakeDead(snake2, other: snake1)) { CloseGame(d, CloseReason.Snake1Win); return; } CheckAppleIsEatenBy(snake1, snake1Progress); CheckAppleIsEatenBy(snake2, snake2Progress); CreateAllGame(d); }
private void CloseGame(Drawer d, CloseReason reason) { RemoveAllGame(d); MessageBox mbox = new MessageBox("", 40, 5, FieldSize.Width, FieldSize.Height, Padding); switch (reason) { case CloseReason.Snake1Win: mbox.Text = $"Первый игрок выиграл со счетом {snake1Progress.Score}!"; break; case CloseReason.Snake2Win: mbox.Text = $"Второй игрок выиграл со счетом {snake2Progress.Score}!"; break; case CloseReason.Draw: mbox.Text = "Ничья!"; break; case CloseReason.ForceClose: d.Remove(border); RemoveAllGame(d); isGameOver = true; return; } FinalScreen = true; d.Create(mbox); d.RedrawAll(); }
/// <summary> /// Окно выбора действия после столкновения змейки с чем-либо /// </summary> void selectGameOverAction(Drawer d) { if (GameOverActionMenu.IsSelected) { // Пользователь уже выбрал что делать if (GameOverActionMenu.SelectedIndex == 1) { ExitGame(d); return; } else if (GameOverActionMenu.SelectedIndex == 0) { RestartGame(d); return; } } d.Create(GameOverActionMenu); GameOverActionMenu.IsFocused = true; }
/// <summary> /// Пользователь выбирает действие /// </summary> void GameOverUserAction(Drawer d) { d.Create(GameOverActionMenu); this.GameOverActionMenu.IsFocused = true; if (!GameOverActionMenu.IsSelected) { return; } RemoveGame(d); d.Remove(GameOverActionMenu); if (GameOverActionMenu.SelectedIndex == 0) { Init(); } else if (GameOverActionMenu.SelectedIndex == 1) { isGameOver = true; } }
public static ScreenCaller Call(Screen screen, Drawer d, Func <int> delay) { var output = new ScreenCaller(); screen.OnExit += (o) => { output.prevScreenResult = o; }; do { d.Create(screen); d.DrawToConsole(); Thread.Sleep(delay()); } while (!screen.Exited); d.Remove(screen); d.DrawToConsole(); screen.OnExit -= (o) => { output.prevScreenResult = o; }; return(output); }
void MoveColumns(Drawer d) { drawnColumns.Clear(); for (int i = 0; i < columns.Length; i++) { Column c = columns[i]; // current c.MoveLeft(columnMoveOffset); var content = c.ElementContent; var contentCuttted = CutContentVertical(content); d.Create(contentCuttted); drawnColumns.Add(contentCuttted); if (IsGoneLeft(content)) { // Получить координаты самой правой колонки int rightCol = columns.OrderBy(x => x.ElementContent.OrderBy(y => y.Location.X).Last().Location.X).Last().ElementContent.OrderBy(z => z.Location.X).Last().Location.X; columns[i] = GetColumn(rightCol + blockInterval); score += 1; } } }