package com.javarush.task.task22.task2213;
/**
* Created by misha on 16.09.2017.
*/
public class Field {
private int height,width;
private int[][] matrix;
public Field(int width, int height) {
this.height = height;
this.width = width;
matrix = new int[height][width];
}
public int getHeight() {
return height;
}
public int getWidth() {
return width;
}
public int[][] getMatrix() {
return matrix;
}
public void print() {
int[][] canvas = new int[height][width];
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
canvas[i][j] = matrix[i][j];
}
}
int left = Tetris.game.getFigure().getX();
int top = Tetris.game.getFigure().getY();
int[][] brickMatrix = Tetris.game.getFigure().getMatrix();
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (top + i >= height || left + j >= width) continue;
if (brickMatrix[i][j] == 1)
canvas[top + i][left + j] = 2;
}
}
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
int index = canvas[i][j];
if (index == 0)
System.out.print(".");
else if (index == 1)
System.out.print("X");
else if (index == 2)
System.out.print("X");
else
System.out.print("???");
}
System.out.println();
}
System.out.println();
System.out.println();
}
public void removeFullLines(){}
public Integer getValue(int x, int y){
return null;
}
public void setValue(int x, int y, int value){
}
}
package com.javarush.task.task22.task2213;
/**
* Created by misha on 16.09.2017.
*/
public class Figure {
private int x,y;
private int[][] matrix;
public Figure(int x, int y, int[][] matrix) {
this.x = x;
this.y = y;
this.matrix = matrix;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public int[][] getMatrix() {
return matrix;
}
public void left(){}
public void right() {}
public void down() {}
public void up(){}
public void rotate(){}
public void downMaximum(){}
public boolean isCurrentPositionAvailable(){return true;}
public void landed(){}
}
package com.javarush.task.task22.task2213;
/**
* Класс FigureFactory отвечает за создание объектов-фигурок.
*/
public class FigureFactory {
/**
* Набор из шести шаблонов для фигурок
*/
public static final int[][][] BRICKS = {{
{1, 1, 0}, // X X
{0, 1, 1}, // X X
{0, 0, 0}}, { //
{1, 0, 0}, // X
{1, 1, 0}, // X X
{0, 1, 0}}, { // X
{0, 1, 0}, // X
{0, 1, 0}, // X
{0, 0, 0}}, { // X
{1, 1, 0}, // X X
{1, 1, 0}, // X X
{0, 0, 0}}, { //
{1, 1, 1}, // X X X
{0, 1, 0}, // X
{0, 0, 0}}, { //
{1, 1, 1}, // X X X
{1, 1, 1}, // X X X
{0, 0, 0}} //
};
/**
* Метод выбирает случайный шаблон и создает с ним новую фигурку.
*/
public static Figure createRandomFigure(int x, int y) {
int index = (int) (Math.random() * 6);
return new Figure(x, y, BRICKS[index]);
}
}
package com.javarush.task.task22.task2213;
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;
import javax.swing.*;
import java.awt.*;
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();
}
}
package com.javarush.task.task22.task2213;
import java.awt.event.KeyEvent;
/**
* Класс Tetris - содержит основной функционал игры.
*/
public class Tetris {
private Field field; //Поле с клетками
private Figure figure; //Фигурка
private boolean isGameOver; //Игра Окончена?
public Tetris(int width, int height) {
field = new Field(width, height);
figure = null;
}
/**
* Геттер переменной field.
*/
public Field getField() {
return field;
}
/**
* Геттер переменной figure.
*/
public Figure getFigure() {
return figure;
}
/**
* Основной цикл программы.
* Тут происходят все важные действия
*/
public void run() throws Exception {
//Создаем объект "наблюдатель за клавиатурой" и стартуем его.
KeyboardObserver keyboardObserver = new KeyboardObserver();
keyboardObserver.start();
//выставляем начальное значение переменной "игра окончена" в ЛОЖЬ
isGameOver = false;
//создаем первую фигурку посередине сверху: x - половина ширины, y - 0.
figure = FigureFactory.createRandomFigure(field.getWidth() / 2, 0);
//пока игра не окончена
while (!isGameOver) {
//"наблюдатель" содержит события о нажатии клавиш?
if (keyboardObserver.hasKeyEvents()) {
//получить самое первое событие из очереди
KeyEvent event = keyboardObserver.getEventFromTop();
//Если равно символу 'q' - выйти из игры.
if (event.getKeyChar() == 'q') return;
//Если "стрелка влево" - сдвинуть фигурку влево
if (event.getKeyCode() == KeyEvent.VK_LEFT)
figure.left();
//Если "стрелка вправо" - сдвинуть фигурку вправо
else if (event.getKeyCode() == KeyEvent.VK_RIGHT)
figure.right();
//Если код клавиши равен 12 ("цифра 5 на доп. клавиатуре") - повернуть фигурку
else if (event.getKeyCode() == 12)
figure.rotate();
//Если "пробел" - фигурка падает вниз на максимум
else if (event.getKeyCode() == KeyEvent.VK_SPACE)
figure.downMaximum();
}
step(); //делаем очередной шаг
field.print(); //печатаем состояние "поля"
Thread.sleep(300); //пауза 300 миллисекунд - 1/3 секунды
}
//Выводим сообщение "Game Over"
System.out.println("Game Over");
}
/**
* Один шаг игры
*/
public void step() {
//опускам фигурку вниз
//если разместить фигурку на текущем месте невозможно:
//поднимаем обратно
//приземляем
//если фигурка приземлилась на самом верху - игра окончена
//удаляем заполненные линии
//создаем новую фигурку
}
/**
* Сеттер для figure
*/
public void setFigure(Figure figure) {
this.figure = figure;
}
/**
* Сеттер для field
*/
public void setField(Field field) {
this.field = field;
}
public static Tetris game;
public static void main(String[] args) throws Exception {
game = new Tetris(10, 20);
game.run();
}
}
package com.javarush.task.task22.task2213;
import java.awt.event.KeyEvent;
/**
* Класс Tetris - содержит основной функционал игры.
*/
public class Tetris {
private Field field; //Поле с клетками
private Figure figure; //Фигурка
private boolean isGameOver; //Игра Окончена?
public Tetris(int width, int height) {
field = new Field(width, height);
figure = null;
}
/**
* Геттер переменной field.
*/
public Field getField() {
return field;
}
/**
* Геттер переменной figure.
*/
public Figure getFigure() {
return figure;
}
/**
* Основной цикл программы.
* Тут происходят все важные действия
*/
public void run() throws Exception {
//Создаем объект "наблюдатель за клавиатурой" и стартуем его.
KeyboardObserver keyboardObserver = new KeyboardObserver();
keyboardObserver.start();
//выставляем начальное значение переменной "игра окончена" в ЛОЖЬ
isGameOver = false;
//создаем первую фигурку посередине сверху: x - половина ширины, y - 0.
figure = FigureFactory.createRandomFigure(field.getWidth() / 2, 0);
//пока игра не окончена
while (!isGameOver) {
//"наблюдатель" содержит события о нажатии клавиш?
if (keyboardObserver.hasKeyEvents()) {
//получить самое первое событие из очереди
KeyEvent event = keyboardObserver.getEventFromTop();
//Если равно символу 'q' - выйти из игры.
if (event.getKeyChar() == 'q') return;
//Если "стрелка влево" - сдвинуть фигурку влево
if (event.getKeyCode() == KeyEvent.VK_LEFT)
figure.left();
//Если "стрелка вправо" - сдвинуть фигурку вправо
else if (event.getKeyCode() == KeyEvent.VK_RIGHT)
figure.right();
//Если код клавиши равен 12 ("цифра 5 на доп. клавиатуре") - повернуть фигурку
else if (event.getKeyCode() == 12)
figure.rotate();
//Если "пробел" - фигурка падает вниз на максимум
else if (event.getKeyCode() == KeyEvent.VK_SPACE)
figure.downMaximum();
}
step(); //делаем очередной шаг
field.print(); //печатаем состояние "поля"
Thread.sleep(300); //пауза 300 миллисекунд - 1/3 секунды
}
//Выводим сообщение "Game Over"
System.out.println("Game Over");
}
/**
* Один шаг игры
*/
public void step() {
//опускам фигурку вниз
//если разместить фигурку на текущем месте невозможно:
//поднимаем обратно
//приземляем
//если фигурка приземлилась на самом верху - игра окончена
//удаляем заполненные линии
//создаем новую фигурку
}
/**
* Сеттер для figure
*/
public void setFigure(Figure figure) {
this.figure = figure;
}
/**
* Сеттер для field
*/
public void setField(Field field) {
this.field = field;
}
public static Tetris game;
public static void main(String[] args) throws Exception {
game = new Tetris(10, 20);
game.run();
}
}