コード例 #1
0
        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);
        }
コード例 #2
0
ファイル: SnakeGame.cs プロジェクト: diademoff/games-cli
        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);
            }
        }
コード例 #3
0
        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;
        }
コード例 #4
0
 void CreateAllGame(Drawer d)
 {
     d.Create(snake1);
     d.Create(snake2);
     d.Create(snake1Progress.StatusBar);
     d.Create(snake2Progress.StatusBar);
     d.Create(apple);
 }
コード例 #5
0
        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);
        }
コード例 #6
0
        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();
        }
コード例 #7
0
ファイル: SnakeGame.cs プロジェクト: diademoff/games-cli
 /// <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;
 }
コード例 #8
0
        /// <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;
            }
        }
コード例 #9
0
ファイル: ScreenCaller.cs プロジェクト: diademoff/games-cli
        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);
        }
コード例 #10
0
        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;
                }
            }
        }