Ошибки в тетрисе - 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);//добовляем рисование фигуры сюда
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д