@jedidiah.brown
Чтобы создать игру змейка на Java, вам потребуется следующее:
@jedidiah.brown
Чтобы создать игру змейку на Java, вам понадобятся следующие шаги:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 |
import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class SnakeGame extends JPanel implements ActionListener { // Константы для окна игры и сетки змейки private static final int WIDTH = 300; private static final int HEIGHT = 300; private static final int DOT_SIZE = 10; private static final int ALL_DOTS = 900; private static final int RAND_POS = 29; // Массивы для хранения координат x и y змейки private final int[] x = new int[ALL_DOTS]; private final int[] y = new int[ALL_DOTS]; private int dots; // Длина змейки private int appleX; // Координаты яблока private int appleY; private Timer timer; // Таймер для обновления экрана private boolean inGame = true; // Переменная для проверки, идет ли игра // Конструктор public SnakeGame() { initGame(); addKeyListener(new KeyboardAdapter()); setFocusable(true); setBackground(Color.black); setPreferredSize(new Dimension(WIDTH, HEIGHT)); timer = new Timer(250, this); timer.start(); } // Инициализация начальных значений private void initGame() { dots = 3; // Задаем начальную длину змейки // Задаем начальные координаты для каждого сегмента змейки for (int i = 0; i < dots; i++) { x[i] = 50 - i * 10; y[i] = 50; } // Генерируем случайные координаты для яблока locateApple(); } // Генерация случайных координат для яблока private void locateApple() { int r = (int) (Math.random() * RAND_POS); appleX = r * DOT_SIZE; r = (int) (Math.random() * RAND_POS); appleY = r * DOT_SIZE; } // Отрисовка игры @Override protected void paintComponent(Graphics g) { super.paintComponent(g); if (inGame) { // Рисуем яблоко g.setColor(Color.red); g.fillOval(appleX, appleY, DOT_SIZE, DOT_SIZE); // Рисуем змейку for (int i = 0; i < dots; i++) { if (i == 0) { g.setColor(Color.green); } else { g.setColor(Color.white); } g.fillRect(x[i], y[i], DOT_SIZE, DOT_SIZE); } } else { gameOver(g); } } // Игра закончена private void gameOver(Graphics g) { String msg = "Game Over"; Font font = new Font("Helvetica", Font.BOLD, 14); FontMetrics metrics = getFontMetrics(font); g.setColor(Color.white); g.setFont(font); g.drawString(msg, (WIDTH - metrics.stringWidth(msg)) / 2, HEIGHT / 2); } // Обработка событий клавиатуры private class KeyboardAdapter extends KeyAdapter { @Override public void keyPressed(KeyEvent e) { int key = e.getKeyCode(); if ((key == KeyEvent.VK_LEFT) && (!direction.equals("RIGHT"))) { direction = "LEFT"; } if ((key == KeyEvent.VK_RIGHT) && (!direction.equals("LEFT"))) { direction = "RIGHT"; } if ((key == KeyEvent.VK_UP) && (!direction.equals("DOWN"))) { direction = "UP"; } if ((key == KeyEvent.VK_DOWN) && (!direction.equals("UP"))) { direction = "DOWN"; } } } // Обновление экрана @Override public void actionPerformed(ActionEvent e) { if (inGame) { move(); checkApple(); checkCollision(); } repaint(); } // Перемещение змейки private void move() { for (int i = dots; i > 0; i--) { x[i] = x[i - 1]; y[i] = y[i - 1]; } if (direction.equals("LEFT")) { x[0] -= DOT_SIZE; } if (direction.equals("RIGHT")) { x[0] += DOT_SIZE; } if (direction.equals("UP")) { y[0] -= DOT_SIZE; } if (direction.equals("DOWN")) { y[0] += DOT_SIZE; } } // Проверка, съела ли змейка яблоко private void checkApple() { if ((x[0] == appleX) && (y[0] == appleY)) { dots++; locateApple(); } } // Проверка столкновения с границами или самой змейкой private void checkCollision() { for (int i = dots; i > 0; i--) { if ((i > 4) && (x[0] == x[i]) && (y[0] == y[i])) { inGame = false; } } if (y[0] >= HEIGHT) { inGame = false; } if (y[0] < 0) { inGame = false; } if (x[0] >= WIDTH) { inGame = false; } if (x[0] < 0) { inGame = false; } if (!inGame) { timer.stop(); } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import javax.swing.JFrame; public class Main { public static void main(String[] args) { JFrame frame = new JFrame("Snake Game"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setResizable(false); frame.add(new SnakeGame()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } } |
Управление змейкой осуществляется с помощью стрелок на клавиатуре.
Обратите внимание, что код предоставлен в основном для демонстрации, и ещё много работы можно проделать, чтобы сделать игру полноценной.