Snake Game 1
Snake Game 1
java
package com.javarush.task.task23.task2312;
import javax.swing.*;
import java.awt.*;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Queue;
import java.util.concurrent.ArrayBlockingQueue;
@Override
public void run() {
frame = new JFrame("KeyPress Tester");
frame.setTitle("Transparent JFrame Demo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setUndecorated(true);
frame.setSize(400, 400);
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setLayout(new GridBagLayout());
frame.setOpacity(0.0f);
frame.setVisible(true);
frame.addFocusListener(new FocusListener() {
@Override
public void focusGained(FocusEvent e) {
//do nothing
}
@Override
public void focusLost(FocusEvent e) {
System.exit(0);
}
});
frame.addKeyListener(new KeyListener() {
Mouse.java
package com.javarush.task.task23.task2312;
Room.java
package com.javarush.task.task23.task2312;
import java.awt.event.KeyEvent;
import java.security.SecureRandom;
import java.util.ArrayList;
/**
* Основной класс программы.
*/
public class Room {
public static Room game;
private int width;
private int height;
private Snake snake;
private Mouse mouse;
private int initialDelay = 520;
private int delayStep = 20;
/**
* Основной цикл программы.
* Тут происходят все важные действия
*/
public void run() {
//Создаем объект "наблюдатель за клавиатурой" и стартуем его.
KeyboardObserver keyboardObserver = new KeyboardObserver();
keyboardObserver.start();
/**
* Выводим на экран текущее состояние игры
*/
public void print() {
//Создаем массив, куда будем "рисовать" текущее состояние игры
int[][] matrix = new int[height][width];
//Рисуем мышь
matrix[mouse.getY()][mouse.getX()] = 3;
/**
* Метод вызывается, когда мышь съели
*/
public void eatMouse() {
createMouse();
}
/**
* Создает новую мышь
*/
public void createMouse() {
int x = (int) (Math.random() * width);
int y = (int) (Math.random() * height);
Snake.java
package com.javarush.task.task23.task2312;
import java.util.ArrayList;
/**
* Класс змея
*/
public class Snake {
//Направление движения змеи
private SnakeDirection direction;
//Состояние - жива змея или нет.
private boolean isAlive;
//Список кусочков змеи.
private ArrayList<SnakeSection> 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);
/**
* Метод проверяет - находится ли новая голова в пределах комнаты
*/
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;
}
}
}
SnakeDirection.java
package com.javarush.task.task23.task2312;
snakegame.iml
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$" isTestSource="false"
packagePrefix="com.javarush.task.task23.task2312" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>
SnakeSection.java
package com.javarush.task.task23.task2312;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
return true;
}
@Override
public int hashCode() {
int result = x;
result = 31 * result + y;
return result;
}
}