0% found this document useful (0 votes)
14 views8 pages

Snake Game 1

The document describes code for a Snake game. It includes classes for a KeyboardObserver that detects key presses, a Room class that manages the game loop and drawing the game state, a Snake class that represents the snake and handles movement, and other classes like Mouse and SnakeSection. The Room class runs the main game loop, getting input from KeyboardObserver and updating and drawing the snake and mouse on each iteration.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
14 views8 pages

Snake Game 1

The document describes code for a Snake game. It includes classes for a KeyboardObserver that detects key presses, a Room class that manages the game loop and drawing the game state, a Snake class that represents the snake and handles movement, and other classes like Mouse and SnakeSection. The Room class runs the main game loop, getting input from KeyboardObserver and updating and drawing the snake and mouse on each iteration.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 8

KeyboardObserver.

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;

public class KeyboardObserver extends Thread {


private Queue<KeyEvent> keyEvents = new
ArrayBlockingQueue<KeyEvent>(100);

private JFrame frame;

@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() {

public void keyTyped(KeyEvent e) {


//do nothing
}

public void keyReleased(KeyEvent e) {


//do nothing
}

public void keyPressed(KeyEvent e) {


keyEvents.add(e);
}
});
}
public boolean hasKeyEvents() {
return !keyEvents.isEmpty();
}

public KeyEvent getEventFromTop() {


return keyEvents.poll();
}
}

Mouse.java
package com.javarush.task.task23.task2312;

public class Mouse {


private int x;
private int y;

public Mouse(int x, int y) {


this.x = x;
this.y = y;
}

public int getX() {


return x;
}

public int getY() {


return y;
}
}

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 Room(int width, int height, Snake snake) {


this.width = width;
this.height = height;
this.snake = snake;
game = this;
}

public static void main(String[] args) {


game = new Room(20, 20, new Snake(10, 10));
game.snake.setDirection(SnakeDirection.DOWN);
game.createMouse();
game.run();
}

public Snake getSnake() {


return snake;
}

public void setSnake(Snake snake) {


this.snake = snake;
}

public Mouse getMouse() {


return mouse;
}

public void setMouse(Mouse mouse) {


this.mouse = mouse;
}

public int getWidth() {


return width;
}

public void setWidth(int width) {


this.width = width;
}

public int getHeight() {


return height;
}

public void setHeight(int height) {


this.height = height;
}

/**
* Основной цикл программы.
* Тут происходят все важные действия
*/
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 void sleep() {
try {
int level = snake.getSections().size();
int delay = level < 15 ? (initialDelay - delayStep * level) :
200;
Thread.sleep(delay);
} catch (InterruptedException e) {
}
}
}

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;

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

SnakeDirection.java
package com.javarush.task.task23.task2312;

public enum SnakeDirection {


UP,
RIGHT,
DOWN,
LEFT
}

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;

public class SnakeSection {


private int x;
private int y;

public SnakeSection(int x, int y) {


this.x = x;
this.y = y;
}

public int getX() {


return x;
}

public int getY() {


return y;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;

SnakeSection that = (SnakeSection) o;

if (x != that.x) return false;


if (y != that.y) return false;

return true;
}

@Override
public int hashCode() {
int result = x;
result = 31 * result + y;
return result;
}
}

You might also like