Advertisement
Guest User

Untitled

a guest
Dec 18th, 2018
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.60 KB | None | 0 0
  1. package com.company;
  2.  
  3. /*
  4. * public @class Board - модифицированная панель
  5. * private @class TAdapter - слушатель нажатия нужных клавишь.
  6. */
  7.  
  8. /*
  9. * @class Board
  10. *
  11. * @var boolean leftDirection - направлении змейки налево (состояния)
  12. * @var boolean rightDirection - направлении змейки направо (состояния)
  13. * @var boolean upDirection - направлении змейки вверх (состояния)
  14. * @var boolean downDirection - направлении змейки вниз (состояния)
  15. * @var boolean inGame - состояния игры (true - работает игра,false - проиграли)
  16. * @var Timer timer - таймер игры
  17. * @var Image ball - часть змейки (изображения)
  18. * @var Image apple - яблочко
  19. * @var Image head - голова змейки
  20. *
  21. * @var final int B_WIDTH - ширина окна
  22. * @var final int B_HEIGHT - высота окна
  23. * @var final int DOT_SIZE - расстояние между шариками змеии
  24. * @var final int ALL_DOTS - размер массива змеии (координат)
  25. * @var final int RAND_POS - расстояние между яблоками при появлении
  26. * @var final int DELAY - задержка перед созданием игры и запуска таймера
  27. * @var final int x[] - x координаты змеи
  28. * @var final int y[] - y координаты змеи
  29. * @var int dots - изначальная длинна змеии
  30. * @var int apple_x - x координата яблока
  31. * @var int apple_y - y координата яблока
  32. * @var int score - изначальное количество очков
  33. *
  34. * @method Board - обёртка инцлизации панели
  35. * @method void initBoard() - инцилизация панели
  36. * @method void loadResource() - загрузка ресурсов
  37. * @method void initGame() - инцилизация игры (Заполенения массива змейки,генерация координат яблок)
  38. * @method void paintComponent - прорисовка компонента первым
  39. * @method void doDrawing - отрисовка змейки и яблок
  40. * @method void gameOver - отрисовка "Экрана" проигрыша
  41. * @method void drawScore - отрисовка очков
  42. * @method void checkApple - коллизия (Змеи и яблока)
  43. * @method void move - перемещении змейки в зависимости от состояний
  44. * @method void checkCollision - коллиззия 2 (проверка столкновения змейки с головой,хвостом и за выхода предела)
  45. * @method void locateApple - генерация координт яблочек
  46. * @method void actionPerformed - пока окно активное проверяем столкновения,и перересовываем.
  47. *
  48. */
  49.  
  50.  
  51. /*
  52. * @class Board
  53. *
  54. * @method void keyPressed(KeyEvent e) - служатель нажатие клавиши(переключения состояния(напралвения) змейки
  55. * в зависимости от нажатой клавиши и состояние самой змейки )
  56. *
  57. */
  58.  
  59.  
  60.  
  61.  
  62. import java.awt.Color;
  63. import java.awt.Dimension;
  64. import java.awt.Font;
  65. import java.awt.FontMetrics;
  66. import java.awt.Graphics;
  67. import java.awt.Image;
  68. import java.awt.Toolkit;
  69. import java.awt.event.ActionEvent;
  70. import java.awt.event.ActionListener;
  71. import java.awt.event.KeyAdapter;
  72. import java.awt.event.KeyEvent;
  73. import javax.swing.ImageIcon;
  74. import javax.swing.JPanel;
  75. import javax.swing.Timer;
  76.  
  77. public class Board extends JPanel implements ActionListener {
  78.  
  79. private final int B_WIDTH = 300; //ширина окна
  80. private final int B_HEIGHT = 300; //высота окна
  81. private final int DOT_SIZE = 10; //расстояние между шариками змеии
  82. private final int ALL_DOTS = 900; //размер массива змеии (координат)
  83. private final int RAND_POS = 29; //расстояние между яблоками при появлении
  84. private final int DELAY = 100; //задержка перед созданием игры и запуска таймера
  85.  
  86. private final int x[] = new int[ALL_DOTS]; //x координаты змеи
  87. private final int y[] = new int[ALL_DOTS]; //y координаты змеи
  88.  
  89. private int dots = 2; //изначальная длинна змеии
  90. private int apple_x; //x координата яблока
  91. private int apple_y; //y координата яблока
  92.  
  93. private int score=0; //изначальное количество очков
  94.  
  95.  
  96. private boolean leftDirection = true;
  97. private boolean rightDirection = true;
  98. private boolean upDirection = false;
  99. private boolean downDirection = false;
  100. private boolean inGame = true; //состояние игры true работает false проиграли
  101.  
  102. private Timer timer; // таймер игры
  103. private Image ball; // часть змейки (изображения)
  104. private Image apple; // яблоко
  105. private Image head; //голова змейки
  106.  
  107.  
  108.  
  109. public Board() {
  110.  
  111. initBoard(); //инцилизация панели
  112. }
  113.  
  114. private void initBoard() {
  115.  
  116. addKeyListener(new TAdapter()); //слушатель нажатия нужных клавиш
  117. setBackground(Color.black); //цвет фона
  118. setFocusable(true); //фокусировка
  119. // setDoubleBuffered(true); //двойная буферизация
  120.  
  121. setPreferredSize(new Dimension(B_WIDTH, B_HEIGHT)); //задаем предпочтительные размеры панели
  122. loadResource(); //загрузка ресурсов
  123. initGame(); //инцилизация игры (Заполенения массива змейки,генерация координат яблок)
  124. }
  125.  
  126. private void loadResource() {
  127.  
  128. ImageIcon iid = new ImageIcon("assets/sprites/dot.png");
  129. ball = iid.getImage();
  130.  
  131. ImageIcon iia = new ImageIcon("assets/sprites/apple.png");
  132. apple = iia.getImage();
  133.  
  134. ImageIcon iih = new ImageIcon("assets/sprites/head.png");
  135. head = iih.getImage();
  136. }
  137.  
  138.  
  139.  
  140.  
  141.  
  142. private void initGame() {
  143.  
  144. for (int z = 0; z < dots; z++) { // Создаем змейку (Заполняем массив)
  145. x[z] = 50 - z * 10;
  146. y[z] = 50;
  147. }
  148.  
  149. locateApple(); //генерация координт яблочек
  150.  
  151. timer = new Timer(DELAY, this); // Создаем таймер и запускаем
  152. timer.start();
  153. }
  154.  
  155. @Override // проверяет, переопределён ли метод. Вызывает ошибку компиляции / интерпретации, если метод не найден в родительском классе или интерфейсе;
  156. public void paintComponent(Graphics g) {
  157. super.paintComponent(g);
  158.  
  159. doDrawing(g);
  160. }
  161.  
  162. private void doDrawing(Graphics g) {
  163. /*
  164. * Отрисовка,рисуем яблоко и змейку взависимотсти от координт.
  165. *
  166. * */
  167. if (inGame) {
  168. g.drawImage(apple, apple_x, apple_y, this);
  169.  
  170. for (int i = 0; i < dots; i++) {
  171. if (i == 0) {
  172. g.drawImage(head, x[i], y[i], this);
  173. } else {
  174. g.drawImage(ball, x[i], y[i], this);
  175. }
  176. }
  177. drawScore(g);
  178. // Синхронизация
  179. Toolkit.getDefaultToolkit().sync();
  180. } else {
  181. gameOver(g); // отрисовка проигрыша
  182. }
  183. }
  184.  
  185. private void gameOver(Graphics g) {
  186.  
  187. String msg = "Game Over"; // создаем строку
  188. Font small = new Font("Helvetica", Font.BOLD, 14); // создаем шрифт
  189. FontMetrics metr = getFontMetrics(small); //
  190. g.setColor(Color.white); // устанавливаем цвет белый
  191. g.setFont(small); // заряжаем шрифтом
  192. g.drawString(msg, (B_WIDTH - metr.stringWidth(msg)) / 2, B_HEIGHT / 2); // отрисовываем
  193. }
  194.  
  195. private void drawScore(Graphics g) {
  196. String msg = "Score:" +score;
  197. Font small = new Font("Helvetica", Font.BOLD, 14);
  198. FontMetrics metr = getFontMetrics(small);
  199. g.setColor(Color.white);
  200. g.setFont(small);
  201. g.drawString(msg, 225,20);
  202. }
  203.  
  204. private void checkApple() {
  205.  
  206. if ((x[0] == apple_x) && (y[0] == apple_y)) {
  207. dots++;
  208. score++;
  209. locateApple();
  210. }
  211. }
  212.  
  213. private void move() {
  214.  
  215. /* перемещение змейки*/
  216. for (int z = dots; z > 0; z--) {
  217. x[z] = x[(z - 1)];
  218. y[z] = y[(z - 1)];
  219. }
  220.  
  221. if (leftDirection) {
  222. x[0] -= DOT_SIZE;
  223. }
  224.  
  225. if (rightDirection) {
  226. x[0] += DOT_SIZE;
  227. }
  228.  
  229. if (upDirection) {
  230. y[0] -= DOT_SIZE;
  231. }
  232.  
  233. if (downDirection) {
  234. y[0] += DOT_SIZE;
  235. }
  236. }
  237.  
  238. private void checkCollision() {
  239.  
  240. /* Проверка кооллиззи */
  241. for (int z = dots; z > 0; z--) {
  242.  
  243. if ((z > 4) && (x[0] == x[z]) && (y[0] == y[z])) {
  244. inGame = false;
  245. }
  246. }
  247.  
  248. if ((y[0] >= B_HEIGHT) || (y[0] < 0) || (x[0] >= B_WIDTH) || (x[0] < 0) ){
  249. inGame = false;
  250. }
  251.  
  252. if (!inGame) {
  253. timer.stop();
  254. }
  255. }
  256.  
  257. private void locateApple() {
  258.  
  259. int r = (int) (Math.random() * RAND_POS);
  260. apple_x = ((r * DOT_SIZE));
  261.  
  262. r = (int) (Math.random() * RAND_POS);
  263. apple_y = ((r * DOT_SIZE));
  264. }
  265.  
  266. @Override
  267. public void actionPerformed(ActionEvent e) {
  268. /*
  269. * пока игра активна проверяет коллизию,и перемешает
  270. */
  271. if (inGame) {
  272.  
  273. checkApple();
  274. checkCollision();
  275. move();
  276. }
  277. repaint();
  278. }
  279.  
  280. private class TAdapter extends KeyAdapter {
  281.  
  282. @Override
  283. public void keyPressed(KeyEvent e) {
  284.  
  285. /* Слушаем клавиатуру и активируем статус взависимоти от клавиатуры*/
  286. int key = e.getKeyCode();
  287.  
  288. if ((key == KeyEvent.VK_LEFT) && (!rightDirection)) {
  289. leftDirection = true;
  290. upDirection = false;
  291. downDirection = false;
  292. }
  293.  
  294. if ((key == KeyEvent.VK_RIGHT) && (!leftDirection)) {
  295. rightDirection = true;
  296. upDirection = false;
  297. downDirection = false;
  298. }
  299.  
  300. if ((key == KeyEvent.VK_UP) && (!downDirection)) {
  301. upDirection = true;
  302. rightDirection = false;
  303. leftDirection = false;
  304. }
  305.  
  306. if ((key == KeyEvent.VK_DOWN) && (!upDirection)) {
  307. downDirection = true;
  308. rightDirection = false;
  309. leftDirection = false;
  310. }
  311. }
  312. }
  313. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement