-
Notifications
You must be signed in to change notification settings - Fork 1
/
Snake.java
110 lines (93 loc) · 3.68 KB
/
Snake.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
package com.javarush.task.task23.task2312;
import java.util.ArrayList;
/**
* Класс змея
*/
public class Snake {
// Направление движения змеи
private SnakeDirection direction;
// Состояние - жива змея или нет.
private boolean isAlive;
// Список кусочков змеи.
private ArrayList<SnakeSection> sections;
public Snake(int x, int y) {
sections = new ArrayList<SnakeSection>();
sections.add(new SnakeSection(x, y));
isAlive = true;
}
public boolean isAlive() {
return isAlive;
}
public int getX() {
return sections.get(0).getX();
}
public int getY() {
return sections.get(0).getY();
}
public SnakeDirection getDirection() {
return direction;
}
public void setDirection(SnakeDirection direction) {
this.direction = direction;
}
public ArrayList<SnakeSection> getSections() {
return sections;
}
/**
* Метод перемещает змею на один ход.
* Направление перемещения задано переменной direction.
*/
public void move() {
if (!isAlive) return;
if (direction == SnakeDirection.UP)
move(0, -1);
else if (direction == SnakeDirection.RIGHT)
move(1, 0);
else if (direction == SnakeDirection.DOWN)
move(0, 1);
else if (direction == SnakeDirection.LEFT)
move(-1, 0);
}
/**
* Метод перемещает змею в соседнюю клетку.
* Координаты клетки заданы относительно текущей головы с помощью переменных (dx, dy).
*/
private void move(int dx, int dy) {
// Создаем новую голову - новый "кусочек змеи".
SnakeSection head = sections.get(0);
head = new SnakeSection(head.getX() + dx, head.getY() + dy);
// Проверяем - не вылезла ли голова за границу комнаты
checkBorders(head);
if (!isAlive) return;
// Проверяем - не пересекает ли змея саму себя
checkBody(head);
if (!isAlive) return;
// Проверяем - не съела ли змея мышь.
Mouse mouse = Room.game.getMouse();
if (head.getX() == mouse.getX() && head.getY() == mouse.getY()) // съела
{
sections.add(0, head); // Добавили новую голову
Room.game.eatMouse(); // Хвост не удаляем, но создаем новую мышь.
} else // просто движется
{
sections.add(0, head); // добавили новую голову
sections.remove(sections.size() - 1); // удалили последний элемент с хвоста
}
}
/**
* Метод проверяет - находится ли новая голова в пределах комнаты
*/
private void checkBorders(SnakeSection head) {
if ((head.getX() < 0 || head.getX() >= Room.game.getWidth()) || head.getY() < 0 || head.getY() >= Room.game.getHeight()) {
isAlive = false;
}
}
/**
* Метод проверяет - не совпадает ли голова с каким-нибудь участком тела змеи.
*/
private void checkBody(SnakeSection head) {
if (sections.contains(head)) {
isAlive = false;
}
}
}