Ошибки в тетрисе - Java

Узнай цену своей работы

Формулировка задачи:

Добрый день, пытаюсь повторить код тетриса за автором. 1. как понять где я ошибся? 2 . почему мне пришлось обьявлять переменные в class Canvas. В оригинале они от куда то подтягиваются?
Листинг программы
  1. package by.javabegin.training.basicJava;
  2. import java.awt.*;//библеотеки для внешних форм
  3. import java.awt.event.*;//для обработки событий
  4. import javax.swing.*;//для графических элементов
  5. import java.util.*;//для генератора случайных чисел
  6.  
  7. class GameTetris {
  8. final String TITLE_OF_PROGRAM = "Tetris";
  9. final int BLOCK_SIZE = 25;
  10. final int ARC_RADIUS = 6;//закругление краев падающих фигур
  11. final int FIELD_WIDTH = 10;//ширина поля in block
  12. final int FIELD_HEIGHT = 18; //высота
  13. final int START_LOCATION = 180;//определяет начальное положение левого верхнего угла окна игры
  14. final int FIELD_DX = 7;//для начального окна
  15. final int FIELD_DY = 26;
  16. final int LEFT =37;//коды клавиш
  17. final int RIGHT = 39;
  18. final int DOWN =40;
  19. final int UP = 39;
  20. final int SHOW_DELAY = 150;//задержка анимации
  21. final int[][][] SHAPES = {
  22. {{0,0,0,0}, {1,1,1,1}, {0,0,0,0}, {0,0,0,0}, {4, 0x00f0f0}}, // I длинная палка
  23. {{0,0,0,0}, {0,1,1,0}, {0,1,1,0}, {0,0,0,0}, {4, 0xf0f000}}, // O квадратик
  24. {{1,0,0,0}, {1,1,1,0}, {0,0,0,0}, {0,0,0,0}, {3, 0x0000f0}}, // J
  25. {{0,0,1,0}, {1,1,1,0}, {0,0,0,0}, {0,0,0,0}, {3, 0xf0a000}}, // L
  26. {{0,1,1,0}, {1,1,0,0}, {0,0,0,0}, {0,0,0,0}, {3, 0x00f000}}, // S
  27. {{1,1,1,0}, {0,1,0,0}, {0,0,0,0}, {0,0,0,0}, {3, 0xa000f0}}, // T
  28. {{1,1,0,0}, {0,1,1,0}, {0,0,0,0}, {0,0,0,0}, {3, 0xf00000}} // Z
  29. };//трехмерный массив заготовок фигур. двоичная заготовка фигуры. каждая палка имеет свой буквенный эквивалент
  30. //этот массив содержит внутренний размер фигурки, и цвет
  31. final int[] SCORES = {100, 300, 700, 1500}; //массив очков чем больше исчезает строк в низу тем больше очков
  32. int gameScores = 0;//переменная хронит очки
  33. public int [][] mine = new int [FIELD_HEIGHT +1][FIELD_WIDTH];// для шахты он соответствует константам
  34. JFrame frame;//переменная обьекта основного окна
  35. Canvas canvasPanel = new Canvas();//панель на которой все будем рисовать
  36. Random random = new Random();//генератор случайных чисел
  37. Figure figure = new Figure();//обьявляем и создаем фигуры
  38. boolean gameOver = false;//определяет игра закончена или нет
  39. final int[][] GAME_OVER_MSG = {
  40. {0,1,1,0,0,0,1,1,0,0,0,1,0,1,0,0,0,1,1,0},//обеспечивает красивый ресунок
  41. {1,0,0,0,0,1,0,0,1,0,1,0,1,0,1,0,1,0,0,1},
  42. {1,0,1,1,0,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1},
  43. {1,0,0,1,0,1,0,0,1,0,1,0,1,0,1,0,1,0,0,0},
  44. {0,1,1,0,0,1,0,0,1,0,1,0,1,0,1,0,0,1,1,0},
  45. {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  46. {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
  47. {0,1,1,0,0,1,0,0,1,0,0,1,1,0,0,1,1,1,0,0},
  48. {1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0},
  49. {1,0,0,1,0,1,0,1,0,0,1,1,1,1,0,1,1,1,0,0},
  50. {1,0,0,1,0,1,1,0,0,0,1,0,0,0,0,1,0,0,1,0},
  51. {0,1,1,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,1,0}};
  52. public static void main (String[] args){
  53. new GameTetris().go();//создаем обьект и вызываем его метод go
  54. }
  55. public void go(){
  56. frame = new JFrame(TITLE_OF_PROGRAM);//создаем окошко
  57. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//закрытие окна нажимая на крестик в углу с права
  58. frame.setSize(FIELD_WIDTH*BLOCK_SIZE+FIELD_DX, FIELD_HEIGHT*BLOCK_SIZE+FIELD_DY); //ширину умножить на размер блока в пикселях
  59. frame.setLocation(START_LOCATION,START_LOCATION );//определяем стартовую позицию окна
  60. frame.setResizable(false); //окно нельзя менять в размерах
  61. canvasPanel.setBackground(Color.black);//цвет поля
  62. frame.addKeyListener(new KeyAdapter() {
  63. public void keyPressed(KeyEvent e) {
  64. if (!gameOver) {
  65. if (e.getKeyCode() == DOWN) figure.drop();
  66. if (e.getKeyCode() == UP) figure.rotate();
  67. if (e.getKeyCode() == LEFT || e.getKeyCode() == RIGHT) figure.move(e.getKeyCode());
  68. }
  69. canvasPanel.repaint();
  70. }
  71. });
  72. frame.getContentPane().add(BorderLayout.CENTER, canvasPanel);
  73. frame.setVisible(true); //делаем окно видемым
  74. Arrays.fill(mine[FIELD_HEIGHT],1);//иницеализируем дно стакана
  75. //main loop of game
  76. while(!gameOver){
  77. try{
  78. Thread.sleep(SHOW_DELAY);//задержка перед прорисовкой(через обработчик прерываний)
  79. }
  80. catch(Exception e) {e.printStackTrace();}
  81. canvasPanel.repaint();//наше окно перерисовывается
  82. if (figure.isTouchGround());{ //проверяем коснулась ли фигура земли
  83. figure.leaveOnTheGround();//оставляем на земле
  84. checkFilling();//проверяем наполняемость
  85. figure = new Figure();//старая осталась валяться создаем новую фигуру
  86. gameOver = figure.isCrossGround(); //проверяем не закончена ли наша игра ни пересиклась ли фигура с землей
  87.  
  88. }
  89. figure.stepDown();//иначе фигура падает в низ
  90. }
  91. }
  92. public void checkFilling(){ //проверка заполнения линий для оседания
  93. }
  94. public class Figure{
  95. private ArrayList<Block> figure = new ArrayList <Block>();//массив обьектов
  96. private int [][] shape = new int [4][4];//массив для вращения фигуры
  97. private int type,size,color;// тип фигуры, размер матрици в которой находиться фигура, цвет
  98. private int x=3, y=0;//стартовые координаты
  99. Figure(){
  100. type = random.nextInt(SHAPES.length);
  101. size = SHAPES[type][4][0];//размеры взятые из массива
  102. color = SHAPES[type][4][1];//цвет
  103. if (size == 4)y = -1;//проверка
  104. for(int i = 0; i<size;i++)//цикл заполняет массив shape кусочком из общей константы SHAPES
  105. System.arraycopy(SHAPES[type][i],0,shape[i],0,SHAPES[type][i].length);
  106. createFromShape();
  107. }
  108. public void createFromShape(){
  109. for (int x = 0; x < size; x++);//двойной цикл проходит по массиву shape на основании этого массива создает фигуру
  110. for (int y = 0; y < size; y++);
  111. if (shape[y][x] == 1) figure.add(new Block(x + this.x, y + this.y));
  112.  
  113. }
  114.  
  115. public void stepDown(){
  116. for (Block block : figure) block.setY(block.getY() + 1);//для каждого элемента в этом блоке устанавливаем новую координату Y
  117. y++;
  118. }
  119. boolean isCrossGround(){ //при булевском значении обязательно нужно что -то вернуть
  120. return false;
  121. }
  122. public void leaveOnTheGround(){
  123. for (Block block : figure) mine[block.getY()][block.getY()] = color;//присваиваем массиву нашей шахты цвет фигуры
  124. }
  125.  
  126. boolean isTouchGround(){
  127. for (Block block : figure)if (mine[block.getY()+1][block.getY()]>0) return true;//проверяется условие и координаты
  128. return false;
  129. }
  130. public void move(int direction){
  131. }
  132. public void drop(){
  133. }
  134. public void rotate(){
  135. }
  136. public void paint(Graphics g){
  137. for (Block block : figure) block.paint(g, color);// он проходит по массиву блоков в фигуре
  138. //при этом каждый обьект входящий в массив фигуры поподает в переменную block.paint и вызываем метод рисования для каждого блочка
  139. }
  140. }
  141. // обеспечит работу с минимальной строительной единицей любой фигуры
  142. class Block{
  143. private int x,y;// блок имеет свои
  144. public Block (int x, int y){//конструктор
  145. setX (x);
  146. setY (y);
  147. }
  148. public void setX (int x){this.x = x;}//зачем сетеры если нет логики? сразу this
  149. public void setY (int y){this.y = y;}
  150. public int getX(){return x;}
  151. public int getY(){return y;}
  152. public void paint (Graphics g, int color){//метод который рисует
  153. g.setColor(new Color(color));//устанавливаем цвет
  154. g.drawRoundRect(x*BLOCK_SIZE+1,y*BLOCK_SIZE+1,BLOCK_SIZE-2,BLOCK_SIZE-2,ARC_RADIUS,ARC_RADIUS);//рисуем прямоугольник
  155. }
  156. }
  157. //обеспечивает процедуру рисования, в нем пишем код который будет рисовать
  158. // будем перекрывать метод paint
  159. public class Canvas extends JPanel{
  160. int x,y;
  161. @Override
  162. public void paint (Graphics g){
  163. super.paint(g);//вызывает родительский метод paint что бы прорисовало
  164. for (int x=0;x<FIELD_WIDTH;x++);
  165. for (int y=0;y<FIELD_HEIGHT;y++);
  166. if(mine[y][x]>0){//прорисовка фигур лежащих на земле
  167. g.setColor(new Color(mine[y][x]));//цвет соответствует числу которое записано
  168. g.fill3DRect (x*BLOCK_SIZE+1,y*BLOCK_SIZE+1,BLOCK_SIZE-1,BLOCK_SIZE-1,true);//благодоря mineмассиву мы узнаем на сколько заполнена шахта
  169. }
  170. figure.paint(g);//добовляем рисование фигуры сюда
  171. }
  172. }
  173. }

Решение задачи: «Ошибки в тетрисе»

textual
Листинг программы
  1.     public class Canvas extends JPanel {
  2.         @Override
  3.         public void paint(Graphics g) {
  4.             super.paint(g);//вызывает родительский метод paint что бы прорисовало
  5.             for (int x = 0; x < FIELD_WIDTH; x++)
  6.                 for (int y = 0; y < FIELD_HEIGHT; y++)
  7.                     if (mine[y][x] > 0) {//прорисовка фигур лежащих на земле
  8.                         g.setColor(new Color(mine[y][x]));//цвет соответствует числу которое записано
  9.                         g.fill3DRect(x * BLOCK_SIZE + 1, y * BLOCK_SIZE + 1, BLOCK_SIZE - 1, BLOCK_SIZE - 1, true);//благодоря mineмассиву мы узнаем на сколько заполнена шахта
  10.                     }
  11.             figure.paint(g);//добовляем рисование фигуры сюда
  12.         }
  13.     }

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


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

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

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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут