public void Resume(Game game) { string fileName = ""; switch (sign) { case '#': fileName = "wall.xml"; break; case '$': fileName = "food.xml"; break; case 'o': fileName = "snake.xml"; break; } FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read); XmlSerializer xs = new XmlSerializer(this.GetType()); switch (sign) { case '#': game.wall.body.Clear(); game.wall = xs.Deserialize(fs) as Wall; break; case '$': game.food.body.Clear(); game.food = xs.Deserialize(fs) as Food; break; case 'o': game.snake.body.Clear(); game.snake = xs.Deserialize(fs) as Snake; break; } fs.Close(); }
public void Eat(Game game) { //добавил к змейке новую точку. прирост body.Add(new Point { x = body[body.Count-1].x, y = body[body.Count-1].y }); //перемещение еды на новое случайное место, без попадания на стену или змейку int r = game.rnd.Next(game.food.available.Count); game.food.body[0].x = game.food.available[r].x; game.food.body[0].y = game.food.available[r].y; //увеличение очков game.score++; game.totalScore++; game.DrawScoreLevel(); if (game.score > 4) { //если последний уровень, то выигрыш if (game.level == 4) { game.Win(); } //в противном случае, переход на следующий уровень else { game.NextLevel(); } } game.food.Draw(); game.DrawScoreLevel(); }
//equals //Icomparable public void DeleteAvail(Point p, Game game) { for (int i = 0; i < available.Count; ++i) { if (available[i].x == p.x && available[i].y == p.y) { game.food.available.RemoveAt(i); } } }
public void Save(Game game) { string fileName = ""; switch (sign) { case '#': fileName = "wall.xml"; break; case '$': fileName = "food.xml"; break; case 'o': fileName = "snake.xml"; break; } FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write); XmlSerializer xs = new XmlSerializer(this.GetType()); xs.Serialize(fs, this); fs.Close(); }
//загрузка с помощью BinaryFormatter public void LoadBinary() { FileStream fs = new FileStream("save.dat", FileMode.OpenOrCreate, FileAccess.Read); BinaryFormatter bf = new BinaryFormatter(); instance = bf.Deserialize(fs) as Game; fs.Close(); }
public void Move(Game game) { //выход из функции, если вышли за границы игрового поля if (body[0].x + velocity[0] > 47 || body[0].x + velocity[0] < 0 || body[0].y + velocity[1] > 47 || body[0].y + velocity[1] < 0) { return; } //последнюю точку тела змеи добавляем в возможные точки для еды ДО ДВИЖЕНИЯ Point tail = new Point { x = body[body.Count - 1].x, y = body[body.Count - 1].y }; if (!game.food.available.Contains(body[body.Count - 1])) { if (!(body.Count > 1 && body[body.Count-1].Equals(body[body.Count-2]))) { game.food.available.Add(tail); } } //двигаем каждую точку тела for (int i = body.Count - 1; i > 0; --i) { body[i].x = body[i - 1].x; body[i].y = body[i - 1].y; } // Двигаем голову body[0].x = body[0].x + velocity[0]; body[0].y = body[0].y + velocity[1]; // Рисование головы Console.ForegroundColor = color; Console.SetCursorPosition(body[0].x, body[0].y); Console.Write(sign); // Рисование хвоста Console.SetCursorPosition(tail.x, tail.y); Console.Write(" "); //новое положение головы убирается из возможных точек для еды, если оно там есть game.food.DeleteAvail(body[0], Game.GetInstance); //проверка, есть ли столкновение со стеной for (int i = 0; i < game.wall.body.Count; ++i) { if (game.snake.body[0].x == game.wall.body[i].x && game.snake.body[0].y == game.wall.body[i].y) { game.GameOver(); } } //проверка, на удар змеи в своё тело for (int i = 1; i < game.snake.body.Count; ++i) { //если положение головы равно положению любой из точек тела (кроме головы) if (game.snake.body[0].Equals(game.snake.body[i])) { game.GameOver(); } } //проверка, можем ли скушать if (body[0].x == game.food.body[0].x && body[0].y == game.food.body[0].y) { Eat(game); } }