Как сделать змейку на Java?

Пользователь

от hoyt.jerde , в категории: Java , 2 года назад

Как сделать змейку на Java?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от vladimir , 2 года назад

@hoyt.jerde 

Чтобы создать игру "Змейка" на Java, вам потребуется:

  1. Создать класс для змейки, который будет хранить информацию о ее размере, направлении и положении на игровом поле.
  2. Создать класс для игрового поля, который будет отвечать за рисование игрового поля, отрисовку змейки и фруктов, а также обновление состояния игры.
  3. Создать класс для фруктов, который будет хранить информацию о их положении на игровом поле.
  4. Создать основной класс программы, который будет создавать экземпляры классов змейки, игрового поля и фруктов, а также управлять игровым процессом.


Пример кода:

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);

    // Создаем экзем


Пользователь

от ian.heidenreich , год назад

@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             |
|+---+                |
||   | +---+          |
||   +-+   |          |
||     |   |          |
||     |   |          |
||     |   |          |
|+-----+   |          |
|          |          |
|          |          |
|          |          |
|          |          |
|          |          |
|          |          |
|          |          |
|          |          |
|          |          |
|          |          |
|          |          |
|          |          |
|          |          |
|          |          |
|          |          |
|          |          |
+---------------------+