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