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(); }
/// <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; }
/// <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); }
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]; } } } }
/// <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 GameController() { cells = new Cells(); currentTetrimino = TetriminoGenerator.CreateRandomTetrimino(); time = DateTime.Now; }
/// <summary> /// 現在のテトリミノの情報をマスにかきこむ. /// </summary> /// <param name="tetrimino">Tetrimino.</param> public void Reflect(Tetrimino tetrimino) { Reflect(cellColors, tetrimino); }
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]; } } } }
public static Tetrimino Copy(Tetrimino tetrimino) { return(new Tetrimino(tetrimino)); }
public Tetrimino(Tetrimino original) { leftTopX = original.leftTopX; leftTopY = original.leftTopY; colors = original.colors; }
public static Tetrimino Copy(Tetrimino tetrimino) { return new Tetrimino(tetrimino); }