Ошибки в тетрисе - 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);//добовляем рисование фигуры сюда
        }
    }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.875 из 5