public void Update(IInput input)
        {
            bool autoBottomShift = false;
            double timeFromDown = (DateTime.Now - time).TotalMilliseconds;
            if (timeFromDown >= AUTO_BOTTOM_SHIFT_MILLISECONDS) {
                autoBottomShift = true;
                time = DateTime.Now;
            }

            if (input.leftRotation) {
                Tetrimino copy = TetriminoGenerator.Copy(currentTetrimino);
                copy.RotateLeft();
                if (cells.IsReflection(copy)) {
                    currentTetrimino = copy;
                }
            }
            if (input.rightRotation) {
                Tetrimino copy = TetriminoGenerator.Copy(currentTetrimino);
                copy.RotateRight();
                if (cells.IsReflection(copy)) {
                    currentTetrimino = copy;
                }
            }
            if (input.left) {
                Tetrimino copy = TetriminoGenerator.Copy(currentTetrimino);
                copy.MoveLeft();
                if (cells.IsReflection(copy)) {
                    currentTetrimino = copy;
                }
            }
            if (input.right) {
                Tetrimino copy = TetriminoGenerator.Copy(currentTetrimino);
                copy.MoveRight();
                if (cells.IsReflection(copy)) {
                    currentTetrimino = copy;
                }
            }
            if (input.down || autoBottomShift) {
                Tetrimino copy = TetriminoGenerator.Copy(currentTetrimino);
                copy.MoveDown();
                if (cells.IsReflection(copy)) {
                    currentTetrimino = copy;
                }
                else {
                    //固定.
                    cells.Reflect(currentTetrimino);
                    currentTetrimino = TetriminoGenerator.CreateRandomTetrimino();
                    if (!cells.IsReflection(currentTetrimino)) {
                        isGameOver = true;
                    }
                    time = DateTime.Now;
                }
            }

            cells.DeleteLine();
        }
Example #2
0
        /// <summary>
        /// 現在のテトリミノの情報をマス全体に書き込むことなく、結合した状態を取得する.
        /// </summary>
        /// <param name="tetrimino">Tetrimino.</param>
        public CellColor[,] Merge(Tetrimino tetrimino)
        {
            CellColor[,] colors = CreateEmptyCellColors();
            for (int x = 0 ; x < WiDTH ; ++x) {
                for (int y = 0 ; y < HEIGHT ; ++y) {
                    colors[x, y] = cellColors[x, y];
                }
            }

            Reflect(colors, tetrimino);
            return colors;
        }
Example #3
0
        /// <summary>
        /// 現在のテトリミノの情報をマス全体に書き込むことなく、結合した状態を取得する.
        /// </summary>
        /// <param name="tetrimino">Tetrimino.</param>
        public CellColor[,] Merge(Tetrimino tetrimino)
        {
            CellColor[,] colors = CreateEmptyCellColors();
            for (int x = 0; x < WiDTH; ++x)
            {
                for (int y = 0; y < HEIGHT; ++y)
                {
                    colors[x, y] = cellColors[x, y];
                }
            }

            Reflect(colors, tetrimino);
            return(colors);
        }
Example #4
0
        private void Reflect(CellColor[,] colors, Tetrimino tetrimino)
        {
            for (int tetriminoX = 0; tetriminoX < tetrimino.width; ++tetriminoX)
            {
                for (int tetriminoY = 0; tetriminoY < tetrimino.height; ++tetriminoY)
                {
                    int x = tetrimino.leftTopX + tetriminoX;
                    int y = tetrimino.leftTopY + tetriminoY;
                    if (x < 0 || x >= WiDTH || y < 0 || y >= HEIGHT)
                    {
                        continue;
                    }

                    if (tetrimino.colors[tetriminoX, tetriminoY] != CellColor.Empty)
                    {
                        colors[x, y] = tetrimino.colors[tetriminoX, tetriminoY];
                    }
                }
            }
        }
Example #5
0
        /// <summary>
        /// 現在のテトリミノをマスに反映させられるかどうか.
        /// </summary>
        /// <returns><c>true</c> if this instance is reflection the specified tetrimino; otherwise, <c>false</c>.</returns>
        /// <param name="tetrimino">Tetrimino.</param>
        public bool IsReflection(Tetrimino tetrimino)
        {
            //境界チェック.
            if (tetrimino.validLeft < 0 || tetrimino.vaildRight >= WiDTH || tetrimino.validTop < 0 || tetrimino.validBottom >= HEIGHT) {
                return false;
            }

            //既存のセルとぶつかるかどうか.
            for (int tetriminoX = 0 ; tetriminoX < tetrimino.width ; ++tetriminoX) {
                for (int tetriminoY = 0 ; tetriminoY < tetrimino.height ; ++tetriminoY) {
                    int x = tetrimino.leftTopX + tetriminoX;
                    int y = tetrimino.leftTopY + tetriminoY;
                    if (x < 0 || x >= WiDTH || y < 0 || y >= HEIGHT) {
                        continue;
                    }

                    if (tetrimino.colors[tetriminoX, tetriminoY] != CellColor.Empty && cellColors[x, y] != CellColor.Empty) {
                        return false;
                    }
                }
            }

            return true;
        }
        public void Update(IInput input)
        {
            bool   autoBottomShift = false;
            double timeFromDown    = (DateTime.Now - time).TotalMilliseconds;

            if (timeFromDown >= AUTO_BOTTOM_SHIFT_MILLISECONDS)
            {
                autoBottomShift = true;
                time            = DateTime.Now;
            }

            if (input.leftRotation)
            {
                Tetrimino copy = TetriminoGenerator.Copy(currentTetrimino);
                copy.RotateLeft();
                if (cells.IsReflection(copy))
                {
                    currentTetrimino = copy;
                }
            }
            if (input.rightRotation)
            {
                Tetrimino copy = TetriminoGenerator.Copy(currentTetrimino);
                copy.RotateRight();
                if (cells.IsReflection(copy))
                {
                    currentTetrimino = copy;
                }
            }
            if (input.left)
            {
                Tetrimino copy = TetriminoGenerator.Copy(currentTetrimino);
                copy.MoveLeft();
                if (cells.IsReflection(copy))
                {
                    currentTetrimino = copy;
                }
            }
            if (input.right)
            {
                Tetrimino copy = TetriminoGenerator.Copy(currentTetrimino);
                copy.MoveRight();
                if (cells.IsReflection(copy))
                {
                    currentTetrimino = copy;
                }
            }
            if (input.down || autoBottomShift)
            {
                Tetrimino copy = TetriminoGenerator.Copy(currentTetrimino);
                copy.MoveDown();
                if (cells.IsReflection(copy))
                {
                    currentTetrimino = copy;
                }
                else
                {
                    //固定.
                    cells.Reflect(currentTetrimino);
                    currentTetrimino = TetriminoGenerator.CreateRandomTetrimino();
                    if (!cells.IsReflection(currentTetrimino))
                    {
                        isGameOver = true;
                    }
                    time = DateTime.Now;
                }
            }

            cells.DeleteLine();
        }
 public GameController()
 {
     cells            = new Cells();
     currentTetrimino = TetriminoGenerator.CreateRandomTetrimino();
     time             = DateTime.Now;
 }
Example #8
0
 /// <summary>
 /// 現在のテトリミノの情報をマスにかきこむ.
 /// </summary>
 /// <param name="tetrimino">Tetrimino.</param>
 public void Reflect(Tetrimino tetrimino)
 {
     Reflect(cellColors, tetrimino);
 }
Example #9
0
        private void Reflect(CellColor[,] colors, Tetrimino tetrimino)
        {
            for (int tetriminoX = 0 ; tetriminoX < tetrimino.width ; ++tetriminoX) {
                for (int tetriminoY = 0 ; tetriminoY < tetrimino.height ; ++tetriminoY) {
                    int x = tetrimino.leftTopX + tetriminoX;
                    int y = tetrimino.leftTopY + tetriminoY;
                    if (x < 0 || x >= WiDTH || y < 0 || y >= HEIGHT) {
                        continue;
                    }

                    if (tetrimino.colors[tetriminoX, tetriminoY] != CellColor.Empty) {
                        colors[x, y] = tetrimino.colors[tetriminoX, tetriminoY];
                    }
                }
            }
        }
Example #10
0
 /// <summary>
 /// 現在のテトリミノの情報をマスにかきこむ.
 /// </summary>
 /// <param name="tetrimino">Tetrimino.</param>
 public void Reflect(Tetrimino tetrimino)
 {
     Reflect(cellColors, tetrimino);
 }
 public static Tetrimino Copy(Tetrimino tetrimino)
 {
     return(new Tetrimino(tetrimino));
 }
Example #12
0
 public Tetrimino(Tetrimino original)
 {
     leftTopX = original.leftTopX;
     leftTopY = original.leftTopY;
     colors = original.colors;
 }
 public GameController()
 {
     cells = new Cells();
     currentTetrimino = TetriminoGenerator.CreateRandomTetrimino();
     time = DateTime.Now;
 }
 public static Tetrimino Copy(Tetrimino tetrimino)
 {
     return new Tetrimino(tetrimino);
 }
Example #15
0
 public Tetrimino(Tetrimino original)
 {
     leftTopX = original.leftTopX;
     leftTopY = original.leftTopY;
     colors   = original.colors;
 }