Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Windows.Forms;
- namespace Snake
- {
- static class Program
- {
- /// <summary>
- /// Главная точка входа для приложения.
- /// </summary>
- [STAThread]
- static void Main()
- {
- Application.EnableVisualStyles();
- Application.SetCompatibleTextRenderingDefault(false);
- Application.Run(new Form1());
- }
- }
- }
- namespace Snake
- {
- class Circle
- {
- public int X { get; set; }
- public int Y { get; set; }
- public Circle ()
- {
- X = 0;
- Y = 0;
- }
- }
- }
- using System.Collections;
- using System.Windows.Forms;
- namespace Snake
- {
- internal class Input
- {
- //Загружаем список доступных кнопок клавиатуры
- private static Hashtable keyTable = new Hashtable();
- //Выполняем проверку, чтобы узнать, нажата ли определенная кнопка.
- public static bool KeyPressed(Keys key)
- {
- if (keyTable[key] == null)
- {
- return false;
- }
- return (bool) keyTable[key];
- }
- //Обнаружение нажатия кнопки клавиатуры
- public static void ChangeState(Keys key, bool state)
- {
- keyTable[key] = state;
- }
- }
- }
- namespace Snake
- {
- // используется для привязки значения к элементу управления
- public enum Direction
- {
- Up,
- Down,
- Left,
- Right
- };
- public class Settings
- {
- //создание переменных для хранения "Ширины", "Высоты", "Скорости", "Счёта", "Стоимости 1 ед. еды"
- public static int Width { get; set; }
- public static int Height { get; set; }
- public static int Speed { get; set; }
- public static int Score { get; set; }
- public static int Points { get; set; }
- // логическая переменная, которая хранит себе данные о окончании игры
- public static bool GameOver { get; set; }
- public static Direction direction { get; set; }
- public Settings()
- {
- Width = 16;
- Height = 16;
- Speed = 16;
- Score = 0;
- Points = 100;
- GameOver = false;
- direction = Direction.Down;
- }
- }
- }
- using System;
- using System.Collections.Generic;
- using System.Drawing;
- using System.Windows.Forms;
- namespace Snake
- {
- public partial class Form1 : Form
- {
- private List<Circle> Snake = new List<Circle>();
- private Circle food = new Circle();
- public Form1()
- {
- InitializeComponent();
- //Установка параметров по умолчанию
- new Settings();
- //Установка скорости игры и таймера запуска
- gameTimer.Interval = 1000 / Settings.Speed;
- gameTimer.Tick += UpdateScreen;
- gameTimer.Start();
- //Старт новой игры
- StartGame();
- }
- private void StartGame()
- {
- lblGameOver.Visible = false;
- //Установка параметров по умолчанию
- new Settings();
- //Создаем новый объект игрока
- Snake.Clear();
- Circle head = new Circle {X = 10, Y = 5};
- Snake.Add(head);
- lblScore.Text = Settings.Score.ToString();
- GenerateFood();
- }
- //Место случайного предмета пищи
- private void GenerateFood()
- {
- int maxXPos = pbCanvas.Size.Width / Settings.Width;
- int maxYPos = pbCanvas.Size.Height / Settings.Height;
- Random random = new Random();
- food = new Circle {X = random.Next(0, maxXPos), Y = random.Next(0, maxYPos)};
- }
- private void UpdateScreen(object sender, EventArgs e)
- {
- //Проверяем конец игры
- if (Settings.GameOver)
- {
- //Проверяем, нажата ли клавиша Enter
- if (Input.KeyPressed(Keys.Enter))
- {
- StartGame();
- }
- }
- else
- {
- if (Input.KeyPressed(Keys.Right) && Settings.direction != Direction.Left)
- Settings.direction = Direction.Right;
- else if (Input.KeyPressed(Keys.Left) && Settings.direction != Direction.Right)
- Settings.direction = Direction.Left;
- else if (Input.KeyPressed(Keys.Up) && Settings.direction != Direction.Down)
- Settings.direction = Direction.Up;
- else if (Input.KeyPressed(Keys.Down) && Settings.direction != Direction.Up)
- Settings.direction = Direction.Down;
- MovePlayer();
- }
- pbCanvas.Invalidate();
- }
- private void pbCanvas_Paint(object sender, PaintEventArgs e)
- {
- Graphics canvas = e.Graphics;
- if (!Settings.GameOver)
- {
- //Устанавливаем цвет змеи
- //Рисуем змею
- for (int i = 0; i < Snake.Count; i++)
- {
- Brush snakeColour;
- if (i == 0)
- snakeColour = Brushes.Black; //Устанавливаем цвет головы
- else
- snakeColour = Brushes.Green; //Устанавливаем цвет остальной части тела
- //Рисуем змею
- canvas.FillEllipse(snakeColour,
- new Rectangle(Snake[i].X * Settings.Width,
- Snake[i].Y * Settings.Height,
- Settings.Width, Settings.Height));
- //Рисуем еду
- canvas.FillEllipse(Brushes.Red,
- new Rectangle(food.X * Settings.Width,
- food.Y * Settings.Height, Settings.Width, Settings.Height));
- }
- }
- else
- {
- string gameOver = "Конец игры \nВаш финальный счёт : " + Settings.Score + "\nНажмите Enter, чтобы начать заново.";
- lblGameOver.Text = gameOver;
- lblGameOver.Visible = true;
- }
- }
- private void MovePlayer()
- {
- for (int i = Snake.Count - 1; i >= 0; i--)
- {
- //Перемещение головы змеи
- if (i == 0)
- {
- switch (Settings.direction)
- {
- case Direction.Right:
- Snake[i].X++;
- break;
- case Direction.Left:
- Snake[i].X--;
- break;
- case Direction.Up:
- Snake[i].Y--;
- break;
- case Direction.Down:
- Snake[i].Y++;
- break;
- }
- //Полиучаем максимальное значение X и Y Pos
- int maxXPos = pbCanvas.Size.Width / Settings.Width;
- int maxYPos = pbCanvas.Size.Height / Settings.Height;
- //Проверяем на столкновение с границами игры
- if (Snake[i].X < 0 || Snake[i].Y < 0
- || Snake[i].X >= maxXPos || Snake[i].Y >= maxYPos)
- {
- Die();
- }
- //Проверяем на столкновение с телом
- for (int j = 1; j < Snake.Count; j++)
- {
- if (Snake[i].X == Snake[j].X &&
- Snake[i].Y == Snake[j].Y)
- {
- Die();
- }
- }
- //Проверяем на поедание змеёй еды
- if (Snake[0].X == food.X && Snake[0].Y == food.Y)
- {
- Eat();
- }
- }
- else
- {
- //Перемещение тела
- Snake[i].X = Snake[i - 1].X;
- Snake[i].Y = Snake[i - 1].Y;
- }
- }
- }
- private void Form1_KeyDown(object sender, KeyEventArgs e)
- {
- Input.ChangeState(e.KeyCode, true);
- }
- private void Form1_KeyUp(object sender, KeyEventArgs e)
- {
- Input.ChangeState(e.KeyCode, false);
- }
- private void Eat()
- {
- //Добавление круга в тело
- Circle circle = new Circle
- {
- X = Snake[Snake.Count - 1].X,
- Y = Snake[Snake.Count - 1].Y
- };
- Snake.Add(circle);
- //Увеличение счёта
- Settings.Score += Settings.Points;
- lblScore.Text = Settings.Score.ToString();
- GenerateFood();
- }
- private void Die()
- {
- //Конец игры
- Settings.GameOver = true;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement