private void StartGame() { _sGame = true; _gameover = false; _snakeRate = 2; _snakeLoop.Interval = (int)(1000 / _snakeRate); _snake.Clear(); _direction = 2; _score = 0; _bombList.Clear(); var head = new SnakePart(10, 8); _snake.Add(head); _snake.Add(new SnakePart(9, 8)); _snake.Add(new SnakePart(8, 8)); _snake.Add(new SnakePart(7, 8)); GenerateFoodandBomb(); }
private void UpdateSnake(object sender, EventArgs e) //обновление змейки { if (!_gameover) { for (var i = _snake.Count - 1; i >= 0; i--) { if (i == 0) { switch (_direction) //в зависимости от направление изменяем координаты { case 0: _snake[0].Y++; break; case 1: _snake[0].X--; break; case 2: _snake[0].X++; break; case 3: _snake[0].Y--; break; } // Check for out of boounds var maxTileW = pbCanvas.Size.Width / TileWidth; var maxTileH = pbCanvas.Size.Height / TileHeight; var head = _snake[0]; if (head.X >= maxTileW || head.X < 0 || head.Y >= maxTileH || head.Y < 0) { GameOver(); } // Check for collision with body for (var j = 1; j < _snake.Count; j++) { if (head.X == _snake[j].X && head.Y == _snake[j].Y) { GameOver(); } } // Check for collision with BOMBs foreach (SnakePart _bomb_chk in _bombList) { if (head.X == _bomb_chk.X && head.Y == _bomb_chk.Y) { PlaySoundFromResourceBomb(); GameOver(); } } // Check for collision with _food if (head.X == _food.X && head.Y == _food.Y) { PlaySoundFromResourceApple(); var xcor = 0; // corecct x, + 1 or -1 var ycor = 0; // corecct x, + 1 or -1 switch (_cor) { case 1: xcor = 1; break; case 2: xcor = -1; break; case 3: ycor = +1; break; case 0: ycor = -1; break; } var part = new SnakePart(_snake[_snake.Count - 1].X + xcor, _snake[_snake.Count - 1].Y + ycor); _snake.Add(part); //костыль GenerateFoodandBomb(); //в зависомсти от уровня сложности счет добавляется по разному if (hardToolStripMenuItem.Checked) { _score = _score + 3; } if (mediumToolStripMenuItem.Checked) { _score = _score + 2; } if (easyToolStripMenuItem.Checked) { _score++; } if (_snakeRate < 30) //если меньше 30 то добавляем скорости { _snakeRate++; _snakeLoop.Interval = (int)(1000 / _snakeRate); } } } else //если ничего не случилось из выше написаного, то передвигаем змейку { _snake[i].X = _snake[i - 1].X; _snake[i].Y = _snake[i - 1].Y; } } } }
private void GenerateFoodandBomb() { var maxTileW = pbCanvas.Size.Width / TileWidth; //максимальна длина по ширине var maxTileH = pbCanvas.Size.Height / TileHeight; //максимальна длина по высоте var valid = false; while (!valid) //цикл до того когда найдется такое значение точок для бомб и яблок, которые не будут пересекаться друг с другом и змейкой { var random = new Random(); var fx = random.Next(0, maxTileW); var fy = random.Next(0, maxTileH); var bx = random.Next(0, maxTileW); var by = random.Next(0, maxTileH); var b2x = random.Next(0, maxTileW); var b2y = random.Next(0, maxTileH); var b3x = random.Next(0, maxTileW); var b3y = random.Next(0, maxTileH); var overlap = false; for (var i = 0; i < _snake.Count - 1; i++) { var sx = _snake[i].X; var sy = _snake[i].Y; if ((fx == sx && fy == sy) || (bx == sx && by == sy) || (b2x == sx && b2y == sy) || (b3x == sx && b3y == sy)) { overlap = true; break; } } for (var q = 0; q < _bombList.Count - 1; q++) { var qx = _bombList[q].X; var qy = _bombList[q].Y; if ((fx == qx && fy == qy)) { overlap = true; break; } } if (!overlap) { _food = new SnakePart(fx, fy); _bomb = new SnakePart(bx, by); //в зависимости от уровня сложности нужно добавить 1,2 или 3 точки бомб if (hardToolStripMenuItem.Checked) { _bombList.Add(_bomb); _bombList.Add(new SnakePart(b2x, b2y)); _bombList.Add(new SnakePart(b3x, b3y)); } if (mediumToolStripMenuItem.Checked) { _bombList.Add(new SnakePart(b2x, b2y)); _bombList.Add(_bomb); } if (easyToolStripMenuItem.Checked) { _bombList.Add(_bomb); } valid = true; } } }