// check is selected direction is valid public bool IsValidPath(GameArea gameArea, Matrix3x3 matrix3X3) { if (PressedKey == ConsoleKey.DownArrow) { if (matrix3X3.Matrix[1, 2] == gameArea.Empty || matrix3X3.Matrix[1, 2] == gameArea.Candy) { return(true); } return(false); } else if (PressedKey == ConsoleKey.UpArrow) { if (matrix3X3.Matrix[1, 0] == gameArea.Empty || matrix3X3.Matrix[1, 0] == gameArea.Candy) { return(true); } return(false); } else if (PressedKey == ConsoleKey.LeftArrow) { if (matrix3X3.Matrix[0, 1] == gameArea.Empty || matrix3X3.Matrix[0, 1] == gameArea.Candy) { return(true); } return(false); } else { if (matrix3X3.Matrix[2, 1] == gameArea.Empty || matrix3X3.Matrix[2, 1] == gameArea.Candy) { return(true); } return(false); } }
//move tail part to last body part position private void MoveTail(GameArea gameArea, int tailX, int tailY) { // if body part is down from tail, move tail part there if (gameArea.Matrix[tailX, tailY + 1] == gameArea.SnakeBody) { gameArea.Matrix[tailX, tailY] = gameArea.Empty; gameArea.Matrix[tailX, tailY + 1] = gameArea.SnakeTail; } // if body part is up else if (gameArea.Matrix[tailX, tailY - 1] == gameArea.SnakeBody) { gameArea.Matrix[tailX, tailY] = gameArea.Empty; gameArea.Matrix[tailX, tailY - 1] = gameArea.SnakeTail; } // if body part is left else if (gameArea.Matrix[tailX - 1, tailY] == gameArea.SnakeBody) { gameArea.Matrix[tailX, tailY] = gameArea.Empty; gameArea.Matrix[tailX - 1, tailY] = gameArea.SnakeTail; } // if body part is right else if (gameArea.Matrix[tailX + 1, tailY] == gameArea.SnakeBody) { gameArea.Matrix[tailX, tailY] = gameArea.Empty; gameArea.Matrix[tailX + 1, tailY] = gameArea.SnakeTail; } }
static void Main(string[] args) { // init setup console and game area GameArea gameArea = new GameArea(15, 15); gameArea.SetConsoleSize(); bool gameOver = false; Matrix3x3 matrix3x3 = new Matrix3x3(); Movement movement = new Movement(matrix3x3); while (!gameOver) { gameArea.ShowMatrix(); gameArea.UpdateSnakeLocation(); // check area around snake's head matrix3x3.GetNeighbors(gameArea, gameArea.SnakeHeadLocation.Item1, gameArea.SnakeHeadLocation.Item2); // move snake movement.ReadPressedKey(1000); if (!movement.IsValidPath(gameArea, matrix3x3)) { gameOver = true; break; } movement.Move(gameArea, matrix3x3); } Console.WriteLine("Game over"); Console.WriteLine("Score: " + gameArea.Score); Console.ReadLine(); }
// check if candy is on target location private bool IsValidPathCandy(GameArea gameArea, int x, int y) { if (gameArea.Matrix[x, y] == gameArea.Candy) { gameArea.Score += 1; if (gameArea.speedMs >= 100) { gameArea.speedMs -= 50; } return(true); } return(false); }
// return matrix of neighbors (3x3) // borders (walls) = "[]", "empty" are returned as in gameArea.matrix public void GetNeighbors(GameArea gameArea, int x, int y) { string[,] neighbors = new string[3, 3]; for (int NX = 0; NX < 3; NX++) { for (int NY = 0; NY < 3; NY++) { if ((NX == 0 && x == 0) || (NX == 2 && x == gameArea.LenX - 1)) { neighbors[NX, NY] = gameArea.Wall; } else if ((NY == 0 && y == 0) || (NY == 2 && y == gameArea.LenY - 1)) { neighbors[NX, NY] = gameArea.Wall; } else { neighbors[NX, NY] = gameArea.Matrix[x + NX - 1, y + NY - 1]; } } } this.Matrix = neighbors; }
// move whole gameArea matrix public void Move(GameArea gameArea, Matrix3x3 matrix3x3) { int headX = gameArea.SnakeHeadLocation.Item1; int headY = gameArea.SnakeHeadLocation.Item2; int tailX = gameArea.SnakeTailLocation.Item1; int tailY = gameArea.SnakeTailLocation.Item2; //if down arrow if (PressedKey == ConsoleKey.DownArrow) { if (IsValidPathCandy(gameArea, headX, headY + 1)) { gameArea.CreateCandy(); } else { MoveTail(gameArea, tailX, tailY); } // move head and change old head position to body gameArea.Matrix[headX, headY + 1] = gameArea.SnakeHead; gameArea.Matrix[headX, headY] = gameArea.SnakeBody; } //if up arrow if (PressedKey == ConsoleKey.UpArrow) { if (IsValidPathCandy(gameArea, headX, headY - 1)) { gameArea.CreateCandy(); } else { MoveTail(gameArea, tailX, tailY); } gameArea.Matrix[headX, headY - 1] = gameArea.SnakeHead; gameArea.Matrix[headX, headY] = gameArea.SnakeBody; } //if left arrow if (PressedKey == ConsoleKey.LeftArrow) { if (IsValidPathCandy(gameArea, headX - 1, headY)) { gameArea.CreateCandy(); } else { MoveTail(gameArea, tailX, tailY); } gameArea.Matrix[headX - 1, headY] = gameArea.SnakeHead; gameArea.Matrix[headX, headY] = gameArea.SnakeBody; } //if right arrow if (PressedKey == ConsoleKey.RightArrow) { if (IsValidPathCandy(gameArea, headX + 1, headY)) { gameArea.CreateCandy(); } else { MoveTail(gameArea, tailX, tailY); } gameArea.Matrix[headX + 1, headY] = gameArea.SnakeHead; gameArea.Matrix[headX, headY] = gameArea.SnakeBody; } }