Advertisement
Guest User

Untitled

a guest
Dec 11th, 2017
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.13 KB | None | 0 0
  1. using System;
  2. using System.Windows.Forms;
  3.  
  4. namespace Snake
  5. {
  6. static class Program
  7. {
  8. /// <summary>
  9. /// Главная точка входа для приложения.
  10. /// </summary>
  11. [STAThread]
  12. static void Main()
  13. {
  14. Application.EnableVisualStyles();
  15. Application.SetCompatibleTextRenderingDefault(false);
  16. Application.Run(new Form1());
  17. }
  18. }
  19. }
  20.  
  21. namespace Snake
  22. {
  23. class Circle
  24. {
  25. public int X { get; set; }
  26. public int Y { get; set; }
  27.  
  28. public Circle ()
  29. {
  30. X = 0;
  31. Y = 0;
  32. }
  33. }
  34. }
  35.  
  36. using System.Collections;
  37. using System.Windows.Forms;
  38.  
  39. namespace Snake
  40. {
  41. internal class Input
  42. {
  43. //Загружаем список доступных кнопок клавиатуры
  44. private static Hashtable keyTable = new Hashtable();
  45.  
  46. //Выполняем проверку, чтобы узнать, нажата ли определенная кнопка.
  47. public static bool KeyPressed(Keys key)
  48. {
  49. if (keyTable[key] == null)
  50. {
  51. return false;
  52. }
  53.  
  54. return (bool) keyTable[key];
  55. }
  56.  
  57. //Обнаружение нажатия кнопки клавиатуры
  58. public static void ChangeState(Keys key, bool state)
  59. {
  60. keyTable[key] = state;
  61. }
  62. }
  63. }
  64.  
  65. namespace Snake
  66. {
  67. // используется для привязки значения к элементу управления
  68. public enum Direction
  69. {
  70. Up,
  71. Down,
  72. Left,
  73. Right
  74. };
  75.  
  76. public class Settings
  77. {
  78. //создание переменных для хранения "Ширины", "Высоты", "Скорости", "Счёта", "Стоимости 1 ед. еды"
  79. public static int Width { get; set; }
  80. public static int Height { get; set; }
  81. public static int Speed { get; set; }
  82. public static int Score { get; set; }
  83. public static int Points { get; set; }
  84. // логическая переменная, которая хранит себе данные о окончании игры
  85. public static bool GameOver { get; set; }
  86. public static Direction direction { get; set; }
  87.  
  88. public Settings()
  89. {
  90. Width = 16;
  91. Height = 16;
  92. Speed = 16;
  93. Score = 0;
  94. Points = 100;
  95. GameOver = false;
  96. direction = Direction.Down;
  97. }
  98. }
  99. }
  100.  
  101. using System;
  102. using System.Collections.Generic;
  103. using System.Drawing;
  104. using System.Windows.Forms;
  105.  
  106. namespace Snake
  107. {
  108. public partial class Form1 : Form
  109. {
  110. private List<Circle> Snake = new List<Circle>();
  111. private Circle food = new Circle();
  112.  
  113. public Form1()
  114. {
  115. InitializeComponent();
  116.  
  117. //Установка параметров по умолчанию
  118. new Settings();
  119.  
  120. //Установка скорости игры и таймера запуска
  121. gameTimer.Interval = 1000 / Settings.Speed;
  122. gameTimer.Tick += UpdateScreen;
  123. gameTimer.Start();
  124.  
  125. //Старт новой игры
  126. StartGame();
  127. }
  128.  
  129. private void StartGame()
  130. {
  131. lblGameOver.Visible = false;
  132.  
  133. //Установка параметров по умолчанию
  134. new Settings();
  135.  
  136. //Создаем новый объект игрока
  137. Snake.Clear();
  138. Circle head = new Circle {X = 10, Y = 5};
  139. Snake.Add(head);
  140.  
  141.  
  142. lblScore.Text = Settings.Score.ToString();
  143. GenerateFood();
  144.  
  145. }
  146.  
  147. //Место случайного предмета пищи
  148. private void GenerateFood()
  149. {
  150. int maxXPos = pbCanvas.Size.Width / Settings.Width;
  151. int maxYPos = pbCanvas.Size.Height / Settings.Height;
  152.  
  153. Random random = new Random();
  154. food = new Circle {X = random.Next(0, maxXPos), Y = random.Next(0, maxYPos)};
  155. }
  156.  
  157.  
  158. private void UpdateScreen(object sender, EventArgs e)
  159. {
  160. //Проверяем конец игры
  161. if (Settings.GameOver)
  162. {
  163. //Проверяем, нажата ли клавиша Enter
  164. if (Input.KeyPressed(Keys.Enter))
  165. {
  166. StartGame();
  167. }
  168. }
  169. else
  170. {
  171. if (Input.KeyPressed(Keys.Right) && Settings.direction != Direction.Left)
  172. Settings.direction = Direction.Right;
  173. else if (Input.KeyPressed(Keys.Left) && Settings.direction != Direction.Right)
  174. Settings.direction = Direction.Left;
  175. else if (Input.KeyPressed(Keys.Up) && Settings.direction != Direction.Down)
  176. Settings.direction = Direction.Up;
  177. else if (Input.KeyPressed(Keys.Down) && Settings.direction != Direction.Up)
  178. Settings.direction = Direction.Down;
  179.  
  180. MovePlayer();
  181. }
  182.  
  183. pbCanvas.Invalidate();
  184.  
  185. }
  186.  
  187. private void pbCanvas_Paint(object sender, PaintEventArgs e)
  188. {
  189. Graphics canvas = e.Graphics;
  190.  
  191. if (!Settings.GameOver)
  192. {
  193. //Устанавливаем цвет змеи
  194.  
  195. //Рисуем змею
  196. for (int i = 0; i < Snake.Count; i++)
  197. {
  198. Brush snakeColour;
  199. if (i == 0)
  200. snakeColour = Brushes.Black; //Устанавливаем цвет головы
  201. else
  202. snakeColour = Brushes.Green; //Устанавливаем цвет остальной части тела
  203.  
  204. //Рисуем змею
  205. canvas.FillEllipse(snakeColour,
  206. new Rectangle(Snake[i].X * Settings.Width,
  207. Snake[i].Y * Settings.Height,
  208. Settings.Width, Settings.Height));
  209.  
  210.  
  211. //Рисуем еду
  212. canvas.FillEllipse(Brushes.Red,
  213. new Rectangle(food.X * Settings.Width,
  214. food.Y * Settings.Height, Settings.Width, Settings.Height));
  215.  
  216. }
  217. }
  218. else
  219. {
  220. string gameOver = "Конец игры \nВаш финальный счёт : " + Settings.Score + "\nНажмите Enter, чтобы начать заново.";
  221. lblGameOver.Text = gameOver;
  222. lblGameOver.Visible = true;
  223. }
  224. }
  225.  
  226.  
  227. private void MovePlayer()
  228. {
  229. for (int i = Snake.Count - 1; i >= 0; i--)
  230. {
  231. //Перемещение головы змеи
  232. if (i == 0)
  233. {
  234. switch (Settings.direction)
  235. {
  236. case Direction.Right:
  237. Snake[i].X++;
  238. break;
  239. case Direction.Left:
  240. Snake[i].X--;
  241. break;
  242. case Direction.Up:
  243. Snake[i].Y--;
  244. break;
  245. case Direction.Down:
  246. Snake[i].Y++;
  247. break;
  248. }
  249.  
  250.  
  251. //Полиучаем максимальное значение X и Y Pos
  252. int maxXPos = pbCanvas.Size.Width / Settings.Width;
  253. int maxYPos = pbCanvas.Size.Height / Settings.Height;
  254.  
  255. //Проверяем на столкновение с границами игры
  256. if (Snake[i].X < 0 || Snake[i].Y < 0
  257. || Snake[i].X >= maxXPos || Snake[i].Y >= maxYPos)
  258. {
  259. Die();
  260. }
  261.  
  262.  
  263. //Проверяем на столкновение с телом
  264. for (int j = 1; j < Snake.Count; j++)
  265. {
  266. if (Snake[i].X == Snake[j].X &&
  267. Snake[i].Y == Snake[j].Y)
  268. {
  269. Die();
  270. }
  271. }
  272.  
  273. //Проверяем на поедание змеёй еды
  274. if (Snake[0].X == food.X && Snake[0].Y == food.Y)
  275. {
  276. Eat();
  277. }
  278.  
  279. }
  280. else
  281. {
  282. //Перемещение тела
  283. Snake[i].X = Snake[i - 1].X;
  284. Snake[i].Y = Snake[i - 1].Y;
  285. }
  286. }
  287. }
  288.  
  289. private void Form1_KeyDown(object sender, KeyEventArgs e)
  290. {
  291. Input.ChangeState(e.KeyCode, true);
  292. }
  293.  
  294. private void Form1_KeyUp(object sender, KeyEventArgs e)
  295. {
  296. Input.ChangeState(e.KeyCode, false);
  297. }
  298.  
  299. private void Eat()
  300. {
  301. //Добавление круга в тело
  302. Circle circle = new Circle
  303. {
  304. X = Snake[Snake.Count - 1].X,
  305. Y = Snake[Snake.Count - 1].Y
  306. };
  307. Snake.Add(circle);
  308.  
  309. //Увеличение счёта
  310. Settings.Score += Settings.Points;
  311. lblScore.Text = Settings.Score.ToString();
  312.  
  313. GenerateFood();
  314. }
  315.  
  316. private void Die()
  317. {
  318. //Конец игры
  319. Settings.GameOver = true;
  320. }
  321. }
  322. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement