Примеры в этой статье делятся с вами конкретным кодом реализации Java Tetris для вашей ссылки. Конкретный контент заключается в следующем
Сохраните карту игры, используя 2D -массив:
// Game Map Grid, каждая сетка сохраняет один квадрат, массив записывает состояние карты частного состояния блока [] [] = новое состояние [строки] [Columns];
Инициализируйте все сетки на карте, чтобы опустошить перед игрой:
/* Инициализируйте все блоки, чтобы опустошить*/for (int i = 0; i <map.length; i ++) {for (int j = 0; j <map [i] .length; j ++) {map [i] [j] = state.empty; }}Во время игры мы можем увидеть блоки на интерфейсе, поэтому мы должны нарисовать все блоки на карте. Конечно, в дополнение к рисованию блоков, игровые точки и конец игры также необходимо нарисовать при необходимости:
/*** Нарисуйте содержимое формы, включая игровые блоки, игровые точки или конечную строку*/@overridepublic void paint (Graphics g) {super.paint (g); for (int i = 0; i <rows; i ++) {for (int j = 0; j <Columns; j ++) {if (map [i] [j] == vate.active) {// Нарисуйте активный блок g.setcolor (ActiveColor); g.fillroundrect (j * block_size, i * block_size + 25, block_size - 1, block_size - 1, block_size / 5, block_size / 5); } else if (map [i] [j] == state.stoped) {// Нарисуйте статический блок g.setcolor (stopedcolor); g.fillroundrect (j * block_size, i * block_size + 25, block_size - 1, block_size - 1, block_size / 5, block_size / 5); }}} /* Оценка печати* / g.setcolor (scoreColor); G.SetFont (новый шрифт («Times New Roman», Font.Bold, 30)); G.DrawString ("Оценка:" + TotalScore, 5, 70); // игра заканчивается, распечатайте конечную строку if (! Isgowon) {g.setcolor (color.red); G.SetFont (новый шрифт («Times New Roman», Font.Bold, 40)); g.drawstring ("game up!", this.getwidth () / 2 - 140, this.getheight () / 2); }}Несколько типов графики, состоящих из квадратов, генерируются случайными числами. Как правило, семь типов графики: бар, поле, обычное 7, реверс 7, Т-образный, Z-образный и обратный Z-образный, такие как генерирующие стержни:
MAP [0] [RANDPOS] = MAP [0] [RANDPOS - 1] = MAP [0] [RANDPOS + 1] = MAP [0] [RANDPOS + 2] = state.active;
После генерации графики реализовано местонахождение. Если вы столкнетесь с препятствиями, вы не можете продолжать падать:
ISfall = true; // может ли он упасть // проверить с текущей строки, остановите падение, если препятствие встречается для (int i = 0; i <blockrows; i ++) {for (int j = 0; j <Colorns; j ++) {// Если блок в строке является активным блоком, блок является статическим блоком, блокируется. i + 1] [j] == state.stoped) {isfall = false; // Остановить осенний перерыв; }} if (! isfall) break;}Если не возникает препятствия, блок -схема переместится вниз по одной линии в целом:
// График падает в строку для (int i = 0; i <blockrows; i ++) {for (int j = 0; j <Columns; j ++) {if (map [rowindex - i] [j] == state.active) {// Активный блок перемещает одну строку карту [rowindex - i] [j] = state.empty; // исходный активный блок становится пустой блок -картой [Rowindex - i + 1] [j] = state.active; // Следующая строка блока становится активным блоком}}}Аналогичная операция при движении влево и вправо:
/*** Идите налево*/private void Left () {// отмечать, существует ли препятствие на левом логическом хаслике = false; /* Проверьте, существует ли препятствие в левой*/ for (int i = 0; i <blockrows; i ++) {if (map [rowindex - i] [0] == state.active) {// Проверьте, является ли левый hasblock = true; перерыв; // Существует препятствие, не нужно цикл, чтобы судить о ряду} else {for (int j = 1; j <Columns; j ++) {// Проверьте, есть ли другие блоки в левой if (map [rowindex - i] [j] == state.active && map [rowindex - i] [j - 1] == stateStoped) {hasblock = true; перерыв; // Существует препятствие, нет необходимости переработать столбец суждения}} if (hasblock) break; // Существует препятствие, нет необходимости переработать суждественную строку}}/* Слева нет препятствия, переместите фигуру влево на расстояние блока*/ if (! Hasblock) {for (int i = 0; i <blockrows; i ++) {for (int j = 1; j <colunts; j ++) {if [rowintex - i] j; - i] [j - 1] = state.active;При движении вниз, это уменьшает интервал времени для каждого нормального состояния падает:
/*** Идите прямо вниз*/private void down () {// МАРКИ могут ускорить падение немедленно = true;}Как изменить направление графика, здесь используется только очень простой метод для достижения преобразования направления. Конечно, может быть лучший алгоритм для реализации операций трансформации направления. Вы можете изучить это самостоятельно:
/*** Поверните квадратную форму*/private void rotate () {try {if (shape == 4) {// квадрат, та же форма возвращается до и после вращения; } else if (shape == 0) {// strip // Временный массив, поместите фигуру после состояния вращения [] [] tmp = новое состояние [4] [4]; int startColumn = 0; // Найти первую квадратную позицию в начале рисунка для (int i = 0; i <Columns; i ++) {if (map [rowindex] [i] == vate.active) {startColumn = i; перерыв; }} // Узнайте, есть ли препятствие после вращения. Если есть препятствие, не поворачивайте для (int i = 0; i <4; i ++) {for (int j = 0; j <4; j ++) {if (map [rowindex - 3+i] [j+startcolumn] == state.stoped) {return; }}}} if (map [rowindex] [startColumn+1] == vate.active) {// горизонтальная планка, преобразование в вертикальную полосу для (int i = 0; i <4; i ++) {tmp [i] [0] = state.active; for (int j = 1; j <4; j ++) {tmp [i] [j] = state.empty; }} blockrows = 4; } else {// Вертикальная планка, преобразование в горизонтальную плату для (int j = 0; j <4; j ++) {tmp [3] [j] = state.active; for (int i = 0; i <3; i ++) {tmp [i] [j] = state.empty; }} blockrows = 1; } // Модифицируйте график в исходной карте на преобразованный график для (int i = 0; i <4; i ++) {for (int j = 0; j <4; j ++) {map [rowindex - 3+i] [startColumn+j] = tmp [i] [j]; }}} else {// Временный массив, поместите вращение состояния фигуры [] [] tmp = новое состояние [3] [3]; int startColumn = столбцы; // Найти позицию первого блока в начале рисунка для (int j = 0; j <3; j ++) {for (int i = 0; i <columns; i ++) {if (map [rowindex - j] [i] == vate.active) {startColumn = i <startColumn? я: startcolumn; }}} // определить, будут ли возникнуть препятствия после преобразования для (int i = 0; i <3; i ++) {for (int j = 0; j <3; j ++) {if (map [rowindex - 2+j] [startcolumn+2 - i] == statoped) return; }} // Преобразование для (int i = 0; i <3; i ++) {for (int j = 0; j <3; j ++) {tmp [2 - j] [i] = map [rowindex - 2+i] [startColumn+j]; }} // Модифицируйте график в исходной карте на преобразованный график для (int i = 0; i <3; i ++) {for (int j = 0; j <3; j ++) {map [rowindex - 2+i] [startColumn+j] = tmp [i] [j]; }} // Repaint Repaint (); // Удалить указатель строки для (int i = 0; i <3; i ++) {for (int j = 0; j <3; j ++) {if (map [rowindex - i] [startColumn+j]! = Null || map [rowindex - i] [startColumn+j]! = State.empty) {rowindex = rowindex - i; Blockrows = 3; возвращаться; }}}}}} catch (Exception e) {// Если встречается абонент массива, это означает, что форма графика не может быть изменена, и обработка не выполнена}}Когда фигура падает и останавливается, когда она сталкивается с препятствиями, нам нужно определить, есть ли определенная линия или несколько линий, которые можно устранить. В настоящее время мы можем сначала получить количество квадратов в каждой строке, а затем принять решение:
int [] blockScount = new int [Rows]; // Записывают количество столбцов с блоками на строку int elmiNatores = 0; // количество строк устранено/* Рассчитайте количество блоков на строку*/for (int i = 0; i <rows; i ++) {blockScount [i] = 0; for (int j = 0; j <Columns; j ++) {if (map [i] [j] == state.stoped) blockscount [i] ++; }}Если есть полный ряд блоков, ряд блоков будет устранена:
/* Реализуйте операцию удаления блока с полными строками*/for (int i = 0; i <rows; i ++) {if (blockscount [i] == Columns) {// очистить строку для (int m = i; m> = 0; m--) {for (int n = 0; n <columns; n ++) {map [m] [n] = (m == 0)? State.empty: map [m - 1] [n]; }} elmiNatores ++; // Записать количество исключенных строк}}Наконец, мы можем перекрасить очки и отобразить их.
Повторите вышеуказанные операции генерации графики, падения графики, перемещения влево и вправо, а также оценки линии ликвидации, и будет завершена простая тетриса.
Эффект бега:
Полный пример кода: тетрис
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.