Ошибки в тетрисе - Java
Формулировка задачи:
Добрый день, пытаюсь повторить код тетриса за автором.
1. как понять где я ошибся?
2 . почему мне пришлось обьявлять переменные в class Canvas. В оригинале они от куда то подтягиваются?
package by.javabegin.training.basicJava;
import java.awt.*;//библеотеки для внешних форм
import java.awt.event.*;//для обработки событий
import javax.swing.*;//для графических элементов
import java.util.*;//для генератора случайных чисел
class GameTetris {
final String TITLE_OF_PROGRAM = "Tetris";
final int BLOCK_SIZE = 25;
final int ARC_RADIUS = 6;//закругление краев падающих фигур
final int FIELD_WIDTH = 10;//ширина поля in block
final int FIELD_HEIGHT = 18; //высота
final int START_LOCATION = 180;//определяет начальное положение левого верхнего угла окна игры
final int FIELD_DX = 7;//для начального окна
final int FIELD_DY = 26;
final int LEFT =37;//коды клавиш
final int RIGHT = 39;
final int DOWN =40;
final int UP = 39;
final int SHOW_DELAY = 150;//задержка анимации
final int[][][] SHAPES = {
{{0,0,0,0}, {1,1,1,1}, {0,0,0,0}, {0,0,0,0}, {4, 0x00f0f0}}, // I длинная палка
{{0,0,0,0}, {0,1,1,0}, {0,1,1,0}, {0,0,0,0}, {4, 0xf0f000}}, // O квадратик
{{1,0,0,0}, {1,1,1,0}, {0,0,0,0}, {0,0,0,0}, {3, 0x0000f0}}, // J
{{0,0,1,0}, {1,1,1,0}, {0,0,0,0}, {0,0,0,0}, {3, 0xf0a000}}, // L
{{0,1,1,0}, {1,1,0,0}, {0,0,0,0}, {0,0,0,0}, {3, 0x00f000}}, // S
{{1,1,1,0}, {0,1,0,0}, {0,0,0,0}, {0,0,0,0}, {3, 0xa000f0}}, // T
{{1,1,0,0}, {0,1,1,0}, {0,0,0,0}, {0,0,0,0}, {3, 0xf00000}} // Z
};//трехмерный массив заготовок фигур. двоичная заготовка фигуры. каждая палка имеет свой буквенный эквивалент
//этот массив содержит внутренний размер фигурки, и цвет
final int[] SCORES = {100, 300, 700, 1500}; //массив очков чем больше исчезает строк в низу тем больше очков
int gameScores = 0;//переменная хронит очки
public int [][] mine = new int [FIELD_HEIGHT +1][FIELD_WIDTH];// для шахты он соответствует константам
JFrame frame;//переменная обьекта основного окна
Canvas canvasPanel = new Canvas();//панель на которой все будем рисовать
Random random = new Random();//генератор случайных чисел
Figure figure = new Figure();//обьявляем и создаем фигуры
boolean gameOver = false;//определяет игра закончена или нет
final int[][] GAME_OVER_MSG = {
{0,1,1,0,0,0,1,1,0,0,0,1,0,1,0,0,0,1,1,0},//обеспечивает красивый ресунок
{1,0,0,0,0,1,0,0,1,0,1,0,1,0,1,0,1,0,0,1},
{1,0,1,1,0,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1},
{1,0,0,1,0,1,0,0,1,0,1,0,1,0,1,0,1,0,0,0},
{0,1,1,0,0,1,0,0,1,0,1,0,1,0,1,0,0,1,1,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,1,1,0,0,1,0,0,1,0,0,1,1,0,0,1,1,1,0,0},
{1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0},
{1,0,0,1,0,1,0,1,0,0,1,1,1,1,0,1,1,1,0,0},
{1,0,0,1,0,1,1,0,0,0,1,0,0,0,0,1,0,0,1,0},
{0,1,1,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,1,0}};
public static void main (String[] args){
new GameTetris().go();//создаем обьект и вызываем его метод go
}
public void go(){
frame = new JFrame(TITLE_OF_PROGRAM);//создаем окошко
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//закрытие окна нажимая на крестик в углу с права
frame.setSize(FIELD_WIDTH*BLOCK_SIZE+FIELD_DX, FIELD_HEIGHT*BLOCK_SIZE+FIELD_DY); //ширину умножить на размер блока в пикселях
frame.setLocation(START_LOCATION,START_LOCATION );//определяем стартовую позицию окна
frame.setResizable(false); //окно нельзя менять в размерах
canvasPanel.setBackground(Color.black);//цвет поля
frame.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
if (!gameOver) {
if (e.getKeyCode() == DOWN) figure.drop();
if (e.getKeyCode() == UP) figure.rotate();
if (e.getKeyCode() == LEFT || e.getKeyCode() == RIGHT) figure.move(e.getKeyCode());
}
canvasPanel.repaint();
}
});
frame.getContentPane().add(BorderLayout.CENTER, canvasPanel);
frame.setVisible(true); //делаем окно видемым
Arrays.fill(mine[FIELD_HEIGHT],1);//иницеализируем дно стакана
//main loop of game
while(!gameOver){
try{
Thread.sleep(SHOW_DELAY);//задержка перед прорисовкой(через обработчик прерываний)
}
catch(Exception e) {e.printStackTrace();}
canvasPanel.repaint();//наше окно перерисовывается
if (figure.isTouchGround());{ //проверяем коснулась ли фигура земли
figure.leaveOnTheGround();//оставляем на земле
checkFilling();//проверяем наполняемость
figure = new Figure();//старая осталась валяться создаем новую фигуру
gameOver = figure.isCrossGround(); //проверяем не закончена ли наша игра ни пересиклась ли фигура с землей
}
figure.stepDown();//иначе фигура падает в низ
}
}
public void checkFilling(){ //проверка заполнения линий для оседания
}
public class Figure{
private ArrayList<Block> figure = new ArrayList <Block>();//массив обьектов
private int [][] shape = new int [4][4];//массив для вращения фигуры
private int type,size,color;// тип фигуры, размер матрици в которой находиться фигура, цвет
private int x=3, y=0;//стартовые координаты
Figure(){
type = random.nextInt(SHAPES.length);
size = SHAPES[type][4][0];//размеры взятые из массива
color = SHAPES[type][4][1];//цвет
if (size == 4)y = -1;//проверка
for(int i = 0; i<size;i++)//цикл заполняет массив shape кусочком из общей константы SHAPES
System.arraycopy(SHAPES[type][i],0,shape[i],0,SHAPES[type][i].length);
createFromShape();
}
public void createFromShape(){
for (int x = 0; x < size; x++);//двойной цикл проходит по массиву shape на основании этого массива создает фигуру
for (int y = 0; y < size; y++);
if (shape[y][x] == 1) figure.add(new Block(x + this.x, y + this.y));
}
public void stepDown(){
for (Block block : figure) block.setY(block.getY() + 1);//для каждого элемента в этом блоке устанавливаем новую координату Y
y++;
}
boolean isCrossGround(){ //при булевском значении обязательно нужно что -то вернуть
return false;
}
public void leaveOnTheGround(){
for (Block block : figure) mine[block.getY()][block.getY()] = color;//присваиваем массиву нашей шахты цвет фигуры
}
boolean isTouchGround(){
for (Block block : figure)if (mine[block.getY()+1][block.getY()]>0) return true;//проверяется условие и координаты
return false;
}
public void move(int direction){
}
public void drop(){
}
public void rotate(){
}
public void paint(Graphics g){
for (Block block : figure) block.paint(g, color);// он проходит по массиву блоков в фигуре
//при этом каждый обьект входящий в массив фигуры поподает в переменную block.paint и вызываем метод рисования для каждого блочка
}
}
// обеспечит работу с минимальной строительной единицей любой фигуры
class Block{
private int x,y;// блок имеет свои
public Block (int x, int y){//конструктор
setX (x);
setY (y);
}
public void setX (int x){this.x = x;}//зачем сетеры если нет логики? сразу this
public void setY (int y){this.y = y;}
public int getX(){return x;}
public int getY(){return y;}
public void paint (Graphics g, int color){//метод который рисует
g.setColor(new Color(color));//устанавливаем цвет
g.drawRoundRect(x*BLOCK_SIZE+1,y*BLOCK_SIZE+1,BLOCK_SIZE-2,BLOCK_SIZE-2,ARC_RADIUS,ARC_RADIUS);//рисуем прямоугольник
}
}
//обеспечивает процедуру рисования, в нем пишем код который будет рисовать
// будем перекрывать метод paint
public class Canvas extends JPanel{
int x,y;
@Override
public void paint (Graphics g){
super.paint(g);//вызывает родительский метод paint что бы прорисовало
for (int x=0;x<FIELD_WIDTH;x++);
for (int y=0;y<FIELD_HEIGHT;y++);
if(mine[y][x]>0){//прорисовка фигур лежащих на земле
g.setColor(new Color(mine[y][x]));//цвет соответствует числу которое записано
g.fill3DRect (x*BLOCK_SIZE+1,y*BLOCK_SIZE+1,BLOCK_SIZE-1,BLOCK_SIZE-1,true);//благодоря mineмассиву мы узнаем на сколько заполнена шахта
}
figure.paint(g);//добовляем рисование фигуры сюда
}
}
}Решение задачи: «Ошибки в тетрисе»
textual
Листинг программы
public class Canvas extends JPanel {
@Override
public void paint(Graphics g) {
super.paint(g);//вызывает родительский метод paint что бы прорисовало
for (int x = 0; x < FIELD_WIDTH; x++)
for (int y = 0; y < FIELD_HEIGHT; y++)
if (mine[y][x] > 0) {//прорисовка фигур лежащих на земле
g.setColor(new Color(mine[y][x]));//цвет соответствует числу которое записано
g.fill3DRect(x * BLOCK_SIZE + 1, y * BLOCK_SIZE + 1, BLOCK_SIZE - 1, BLOCK_SIZE - 1, true);//благодоря mineмассиву мы узнаем на сколько заполнена шахта
}
figure.paint(g);//добовляем рисование фигуры сюда
}
}