@hoyt.jerde
Чтобы создать игру "Змейка" на Java, вам потребуется:
Пример кода:
1 2 3 4 5 6 7 8 9 |
public class SnakeGame { public static void main(String[] args) { // Создаем экземпляр класса игрового поля GameField field = new GameField(); // Создаем экземпляр класса змейки Snake snake = new Snake(field); // Создаем экзем |
@hoyt.jerde
Для создания змейки на Java можно использовать графические библиотеки, такие как JavaFX или Swing. Ниже приведен пример кода на JavaFX:
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 |
import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.canvas.Canvas; import javafx.scene.canvas.GraphicsContext; import javafx.scene.control.Label; import javafx.scene.layout.StackPane; import javafx.scene.paint.Color; import javafx.stage.Stage; public class Snake extends Application { public static void main(String[] args) { launch(args); } private int width = 500; private int height = 500; private int cellSize = 10; private int[][] grid; private int snakeLength = 3; private int[][] snake = new int[snakeLength][2]; private int direction = 0; private boolean gameRunning = true; @Override public void start(Stage primaryStage) throws Exception { StackPane root = new StackPane(); Canvas canvas = new Canvas(width, height); root.getChildren().add(canvas); Label scoreLabel = new Label("Score: 0"); root.getChildren().add(scoreLabel); Scene scene = new Scene(root, width, height); primaryStage.setTitle("Snake"); primaryStage.setScene(scene); GraphicsContext gc = canvas.getGraphicsContext2D(); gc.setFill(Color.BLACK); gc.fillRect(0, 0, width, height); gc.setFill(Color.WHITE); gc.fillRect(0, 0, cellSize, height); gc.fillRect(0, 0, width, cellSize); gc.fillRect(width - cellSize, 0, cellSize, height); gc.fillRect(0, height - cellSize, width, cellSize); // initialize grid grid = new int[width / cellSize][height / cellSize]; for (int i = 0; i < grid.length; i++) { for (int j = 0; j < grid[0].length; j++) { if (i == 0 || j == 0 || i == grid.length - 1 || j == grid[0].length - 1) { grid[i][j] = 1; } } } // initialize snake int startX = grid.length / 2; int startY = grid[0].length / 2; for (int i = 0; i < snakeLength; i++) { snake[i][0] = startX - i; snake[i][1] = startY; grid[startX - i][startY] = 2; } // game loop new Thread(() -> { while (gameRunning) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } // move snake int[] newHead = new int[]{snake[0][0], snake[0][1]}; switch (direction) { case 0: newHead[0]--; break; case 1: newHead[1]--; break; case 2: newHead[0]++; break; case 3: newHead[1]++; break; } if (grid[newHead[0]][newHead[1]] == 0) { // move snake grid[snake[snakeLength - 1][0]][snake[snakeLength - 1][1]] = 0; for (int i = snakeLength - 1; i > 0; i--) { snake[i][0] = snake[i - 1][0]; snake[i][1] = snake[i - 1][1]; grid[snake[i][0]][snake[i][1]] = 2; } snake[0][0] = newHead[0]; snake[0][1] = newHead[1]; grid[newHead[0]][newHead[1]] = 2; } else if (grid[newHead[0]][newHead[1]] == 1) { // hit wall gameRunning = false; } else if (grid[newHead[0]][newHead[1]] == 3) { // eat food snakeLength++; int[][] newSnake = new int[snakeLength][2]; newSnake[0][0] = newHead[0]; newSnake[0][1] = newHead[1]; grid[newHead[0]][newHead[1]] = 2; for (int i = 1; i < snakeLength; i++) { newSnake[i][0] = snake[i - 1][0]; newSnake[i][1] = snake[i - 1][1]; grid[newSnake[i][0]][newSnake[i][1]] = 2; } snake = newSnake; scoreLabel.setText("Score: " + (snakeLength - 3)); placeFood(); } // draw grid gc.setFill(Color.BLACK); gc.fillRect(0, 0, width, height); for (int i = 0; i < grid.length; i++) { for (int j = 0; j < grid[0].length; j++) { if (grid[i][j] == 1) { gc.setFill(Color.WHITE); gc.fillRect(i * cellSize, j * cellSize, cellSize, cellSize); } else if (grid[i][j] == 2) { gc.setFill(Color.GREEN); gc.fillRect(i * cellSize, j * cellSize, cellSize, cellSize); } else if (grid[i][j] == 3) { gc.setFill(Color.RED); gc.fillOval(i * cellSize, j * cellSize, cellSize, cellSize); } } } } }).start(); // controls scene.setOnKeyPressed(e -> { switch (e.getCode()) { case UP: if (direction != 3) { direction = 1; } break; case DOWN: if (direction != 1) { direction = 3; } break; case LEFT: if (direction != 2) { direction = 0; } break; case RIGHT: if (direction != 0) { direction = 2; } break; } }); primaryStage.show(); placeFood(); } private void placeFood() { boolean placed = false; while (!placed) { int x = (int) (Math.random() * (grid.length - 2)) + 1; int y = (int) (Math.random() * (grid[0].length - 2)) + 1; if (grid[x][y] == 0) { grid[x][y] = 3; placed = true; } } } } |
Этот код создает игру "Змейка" на поле размером 500x500 пикселей с клетками размером 10x10. Управление змейкой осуществляется с помощью стрелок на клавиатуре.
Змейка нарисована зелеными квадратами, стены – белыми, а еда – красными кругами. Очки показываются в верхнем левом углу.
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 |
+---------------------+ |Score: 0 | |+---+ | || | +---+ | || +-+ | | || | | | || | | | || | | | |+-----+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +---------------------+ |