public class Room {
private int width;
private int height;
private Snake snake;
private Mouse mouse;
public Room(int width, int height, Snake snake) {
this.width = width;
this.height = height;
this.snake = snake;
game = this;
}
public Snake getSnake() {
return snake;
}
public Mouse getMouse() {
return mouse;
}
public int getWidth() {
return width;
}
public int getHeight() {
return height;
}
public void setWidth(int width) {
this.width = width;
}
public void setHeight(int height) {
this.height = height;
}
public void setSnake(Snake snake) {
this.snake = snake;
}
public void setMouse(Mouse mouse) {
this.mouse = mouse;
}
/**
* Основной цикл программы.
* Тут происходят все важные действия
*/
public void run() {
//Создаем объект "наблюдатель за клавиатурой" и стартуем его.
KeyboardObserver keyboardObserver = new KeyboardObserver();
keyboardObserver.start();
//пока змея жива
while (snake.isAlive()) {
//"наблюдатель" содержит события о нажатии клавиш?
if (keyboardObserver.hasKeyEvents()) {
KeyEvent event = keyboardObserver.getEventFromTop();
//Если равно символу 'q' - выйти из игры.
if (event.getKeyChar() == 'q') return;
//Если "стрелка влево" - сдвинуть фигурку влево
if (event.getKeyCode() == KeyEvent.VK_LEFT)
snake.setDirection(SnakeDirection.LEFT);
//Если "стрелка вправо" - сдвинуть фигурку вправо
else if (event.getKeyCode() == KeyEvent.VK_RIGHT)
snake.setDirection(SnakeDirection.RIGHT);
//Если "стрелка вверх" - сдвинуть фигурку вверх
else if (event.getKeyCode() == KeyEvent.VK_UP)
snake.setDirection(SnakeDirection.UP);
//Если "стрелка вниз" - сдвинуть фигурку вниз
else if (event.getKeyCode() == KeyEvent.VK_DOWN)
snake.setDirection(SnakeDirection.DOWN);
}
snake.move(); //двигаем змею
print(); //отображаем текущее состояние игры
sleep(); //пауза между ходами
}
//Выводим сообщение "Game Over"
System.out.println("Game Over!");
}
/**
* Выводим на экран текущее состояние игры
*/
public void print() {
//Создаем массив, куда будем "рисовать" текущее состояние игры
int[][] matrix = new int[height][width];
//Рисуем все кусочки змеи
ArrayList<SnakeSection> sections = new ArrayList<SnakeSection>(snake.getSections());
for (SnakeSection snakeSection : sections) {
matrix[snakeSection.getY()][snakeSection.getX()] = 1;
}
//Рисуем голову змеи (4 - если змея мертвая)
matrix[snake.getY()][snake.getX()] = snake.isAlive() ? 2 : 4;
//Рисуем мышь
matrix[mouse.getY()][mouse.getX()] = 3;
//Выводим все это на экран
String[] symbols = {" . ", " x ", " X ", "^_^", "RIP"};
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
System.out.print(symbols[matrix[y][x]]);
}
System.out.println();
}
System.out.println();
System.out.println();
System.out.println();
}
/**
* Метод вызывается, когда мышь съели
*/
public void eatMouse() {
createMouse();
}
/**
* Создает новую мышь
*/
public void createMouse() {
int x = (int) (Math.random() * width);
int y = (int) (Math.random() * height);
mouse = new Mouse(x, y);
}
public static Room game;
public static void main(String[] args) {
game = new Room(20, 20, new Snake(10, 10));
game.snake.setDirection(SnakeDirection.DOWN);
game.createMouse();
game.run();
}
private int initialDelay = 520;
private int delayStep = 20;
/**
* Программа делает паузу, длинна которой зависит от длинны змеи.
*/
public void sleep() {
try {
int level = snake.getSections().size();
int delay = level < 15 ? (initialDelay - delayStep * level) : 200;
Thread.sleep(delay);
} catch (InterruptedException e) {
}
}
}
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;
}
}
}
Многим задача не понравилась, но у меня она тупо заканчивается из-за смерти змеи. Не работает управление вообще.ProstoHacker
31 уровень
А оно вообще должно работать?
Обсуждается
Комментарии (6)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Артем Divertitto Senior Android-разработчи в United Tech Master
10 июля 2019, 14:27
Возможно фокус находится не на консоли. Всё работает нормально
0
ProstoHacker
10 июля 2019, 14:30
ну видимо только у меня не работает, раз 30 запускал, где только не кликал, ноль реакции.
+1
Артем Divertitto Senior Android-разработчи в United Tech Master
10 июля 2019, 15:04
Прикрепи полный код, попробуем разобратся
0
ProstoHacker
10 июля 2019, 17:56
0
ProstoHacker
10 июля 2019, 17:57
0
Джошуа Сургутский
9 июля 2019, 18:36
пробелом кажись запускалась
0