Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.company;
- /*
- * public @class Board - модифицированная панель
- * private @class TAdapter - слушатель нажатия нужных клавишь.
- */
- /*
- * @class Board
- *
- * @var boolean leftDirection - направлении змейки налево (состояния)
- * @var boolean rightDirection - направлении змейки направо (состояния)
- * @var boolean upDirection - направлении змейки вверх (состояния)
- * @var boolean downDirection - направлении змейки вниз (состояния)
- * @var boolean inGame - состояния игры (true - работает игра,false - проиграли)
- * @var Timer timer - таймер игры
- * @var Image ball - часть змейки (изображения)
- * @var Image apple - яблочко
- * @var Image head - голова змейки
- *
- * @var final int B_WIDTH - ширина окна
- * @var final int B_HEIGHT - высота окна
- * @var final int DOT_SIZE - расстояние между шариками змеии
- * @var final int ALL_DOTS - размер массива змеии (координат)
- * @var final int RAND_POS - расстояние между яблоками при появлении
- * @var final int DELAY - задержка перед созданием игры и запуска таймера
- * @var final int x[] - x координаты змеи
- * @var final int y[] - y координаты змеи
- * @var int dots - изначальная длинна змеии
- * @var int apple_x - x координата яблока
- * @var int apple_y - y координата яблока
- * @var int score - изначальное количество очков
- *
- * @method Board - обёртка инцлизации панели
- * @method void initBoard() - инцилизация панели
- * @method void loadResource() - загрузка ресурсов
- * @method void initGame() - инцилизация игры (Заполенения массива змейки,генерация координат яблок)
- * @method void paintComponent - прорисовка компонента первым
- * @method void doDrawing - отрисовка змейки и яблок
- * @method void gameOver - отрисовка "Экрана" проигрыша
- * @method void drawScore - отрисовка очков
- * @method void checkApple - коллизия (Змеи и яблока)
- * @method void move - перемещении змейки в зависимости от состояний
- * @method void checkCollision - коллиззия 2 (проверка столкновения змейки с головой,хвостом и за выхода предела)
- * @method void locateApple - генерация координт яблочек
- * @method void actionPerformed - пока окно активное проверяем столкновения,и перересовываем.
- *
- */
- /*
- * @class Board
- *
- * @method void keyPressed(KeyEvent e) - служатель нажатие клавиши(переключения состояния(напралвения) змейки
- * в зависимости от нажатой клавиши и состояние самой змейки )
- *
- */
- import java.awt.Color;
- import java.awt.Dimension;
- import java.awt.Font;
- import java.awt.FontMetrics;
- import java.awt.Graphics;
- import java.awt.Image;
- import java.awt.Toolkit;
- import java.awt.event.ActionEvent;
- import java.awt.event.ActionListener;
- import java.awt.event.KeyAdapter;
- import java.awt.event.KeyEvent;
- import javax.swing.ImageIcon;
- import javax.swing.JPanel;
- import javax.swing.Timer;
- public class Board extends JPanel implements ActionListener {
- private final int B_WIDTH = 300; //ширина окна
- private final int B_HEIGHT = 300; //высота окна
- private final int DOT_SIZE = 10; //расстояние между шариками змеии
- private final int ALL_DOTS = 900; //размер массива змеии (координат)
- private final int RAND_POS = 29; //расстояние между яблоками при появлении
- private final int DELAY = 100; //задержка перед созданием игры и запуска таймера
- private final int x[] = new int[ALL_DOTS]; //x координаты змеи
- private final int y[] = new int[ALL_DOTS]; //y координаты змеи
- private int dots = 2; //изначальная длинна змеии
- private int apple_x; //x координата яблока
- private int apple_y; //y координата яблока
- private int score=0; //изначальное количество очков
- private boolean leftDirection = true;
- private boolean rightDirection = true;
- private boolean upDirection = false;
- private boolean downDirection = false;
- private boolean inGame = true; //состояние игры true работает false проиграли
- private Timer timer; // таймер игры
- private Image ball; // часть змейки (изображения)
- private Image apple; // яблоко
- private Image head; //голова змейки
- public Board() {
- initBoard(); //инцилизация панели
- }
- private void initBoard() {
- addKeyListener(new TAdapter()); //слушатель нажатия нужных клавиш
- setBackground(Color.black); //цвет фона
- setFocusable(true); //фокусировка
- // setDoubleBuffered(true); //двойная буферизация
- setPreferredSize(new Dimension(B_WIDTH, B_HEIGHT)); //задаем предпочтительные размеры панели
- loadResource(); //загрузка ресурсов
- initGame(); //инцилизация игры (Заполенения массива змейки,генерация координат яблок)
- }
- private void loadResource() {
- ImageIcon iid = new ImageIcon("assets/sprites/dot.png");
- ball = iid.getImage();
- ImageIcon iia = new ImageIcon("assets/sprites/apple.png");
- apple = iia.getImage();
- ImageIcon iih = new ImageIcon("assets/sprites/head.png");
- head = iih.getImage();
- }
- private void initGame() {
- for (int z = 0; z < dots; z++) { // Создаем змейку (Заполняем массив)
- x[z] = 50 - z * 10;
- y[z] = 50;
- }
- locateApple(); //генерация координт яблочек
- timer = new Timer(DELAY, this); // Создаем таймер и запускаем
- timer.start();
- }
- @Override // проверяет, переопределён ли метод. Вызывает ошибку компиляции / интерпретации, если метод не найден в родительском классе или интерфейсе;
- public void paintComponent(Graphics g) {
- super.paintComponent(g);
- doDrawing(g);
- }
- private void doDrawing(Graphics g) {
- /*
- * Отрисовка,рисуем яблоко и змейку взависимотсти от координт.
- *
- * */
- if (inGame) {
- g.drawImage(apple, apple_x, apple_y, this);
- for (int i = 0; i < dots; i++) {
- if (i == 0) {
- g.drawImage(head, x[i], y[i], this);
- } else {
- g.drawImage(ball, x[i], y[i], this);
- }
- }
- drawScore(g);
- // Синхронизация
- Toolkit.getDefaultToolkit().sync();
- } else {
- gameOver(g); // отрисовка проигрыша
- }
- }
- private void gameOver(Graphics g) {
- String msg = "Game Over"; // создаем строку
- Font small = new Font("Helvetica", Font.BOLD, 14); // создаем шрифт
- FontMetrics metr = getFontMetrics(small); //
- g.setColor(Color.white); // устанавливаем цвет белый
- g.setFont(small); // заряжаем шрифтом
- g.drawString(msg, (B_WIDTH - metr.stringWidth(msg)) / 2, B_HEIGHT / 2); // отрисовываем
- }
- private void drawScore(Graphics g) {
- String msg = "Score:" +score;
- Font small = new Font("Helvetica", Font.BOLD, 14);
- FontMetrics metr = getFontMetrics(small);
- g.setColor(Color.white);
- g.setFont(small);
- g.drawString(msg, 225,20);
- }
- private void checkApple() {
- if ((x[0] == apple_x) && (y[0] == apple_y)) {
- dots++;
- score++;
- locateApple();
- }
- }
- private void move() {
- /* перемещение змейки*/
- for (int z = dots; z > 0; z--) {
- x[z] = x[(z - 1)];
- y[z] = y[(z - 1)];
- }
- if (leftDirection) {
- x[0] -= DOT_SIZE;
- }
- if (rightDirection) {
- x[0] += DOT_SIZE;
- }
- if (upDirection) {
- y[0] -= DOT_SIZE;
- }
- if (downDirection) {
- y[0] += DOT_SIZE;
- }
- }
- private void checkCollision() {
- /* Проверка кооллиззи */
- for (int z = dots; z > 0; z--) {
- if ((z > 4) && (x[0] == x[z]) && (y[0] == y[z])) {
- inGame = false;
- }
- }
- if ((y[0] >= B_HEIGHT) || (y[0] < 0) || (x[0] >= B_WIDTH) || (x[0] < 0) ){
- inGame = false;
- }
- if (!inGame) {
- timer.stop();
- }
- }
- private void locateApple() {
- int r = (int) (Math.random() * RAND_POS);
- apple_x = ((r * DOT_SIZE));
- r = (int) (Math.random() * RAND_POS);
- apple_y = ((r * DOT_SIZE));
- }
- @Override
- public void actionPerformed(ActionEvent e) {
- /*
- * пока игра активна проверяет коллизию,и перемешает
- */
- if (inGame) {
- checkApple();
- checkCollision();
- move();
- }
- repaint();
- }
- private class TAdapter extends KeyAdapter {
- @Override
- public void keyPressed(KeyEvent e) {
- /* Слушаем клавиатуру и активируем статус взависимоти от клавиатуры*/
- int key = e.getKeyCode();
- if ((key == KeyEvent.VK_LEFT) && (!rightDirection)) {
- leftDirection = true;
- upDirection = false;
- downDirection = false;
- }
- if ((key == KeyEvent.VK_RIGHT) && (!leftDirection)) {
- rightDirection = true;
- upDirection = false;
- downDirection = false;
- }
- if ((key == KeyEvent.VK_UP) && (!downDirection)) {
- upDirection = true;
- rightDirection = false;
- leftDirection = false;
- }
- if ((key == KeyEvent.VK_DOWN) && (!upDirection)) {
- downDirection = true;
- rightDirection = false;
- leftDirection = false;
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement