Источник статьи: csdn Автор: Чэнь Ванфэй
Об авторе
Чэнь Ванфэй, мужчина, получил степень бакалавра в области математики и программного обеспечения в Центральном Южном университете. Он был старшим программистом и системным аналитиком в компании Beijing Great Wall Software. Он имеет большой опыт разработки j2se и j2ee. В настоящее время работаю над исследованием j2me. С ним можно связаться по адресу [email protected].
краткое содержание
В этой статье представлен план разработки игры «Тетрис», основанной на MIDP1.0, а также полный исходный код реализации. Самая большая особенность игры — адаптируемость экрана. Независимо от размера экрана различных мобильных телефонов и КПК, в игре всегда можно получить наилучший эффект отображения. Игра тестировалась на четырёх эмуляторах беспроводного инструментария J2me версии 2.1.
Отказ от ответственности: этот код игры изначально был взят из японского проекта с открытым исходным кодом (см. ссылку 1) и был существенно изменен автором.
Вот несколько скриншотов игры:
дизайн
1. Процесс работы
Процесс работы этой игры очень прост. После того, как пользователь запускает мидлет, он попадает на главный экран игры, и на экране начинает отображаться экран приветствия. После того, как пользователь нажимает кнопку [Старт], он может начать игру. Когда пользователь хочет сделать паузу, он снова нажимает кнопку [Старт], и игра приостанавливается, если пользователь снова нажимает кнопку [Старт]. приостановлено, игра продолжает работать. При каждом нажатии кнопки [Выход] игра MIDlet будет завершена.
Блок-схема игрового экрана выглядит следующим образом:
2. Алгоритм
В игровом дизайне MIDP по существу используется поток или таймер для генерации событий перерисовки, а также потоки и пользовательский ввод для изменения состояния игры. Эта игра не исключение. После запуска мидлета сразу генерируется поток перерисовки, который прорисовывает экран каждые 50мс. Конечно, есть некоторые меры по оптимизации при перерисовке. Не все пиксели на экране нужно перерисовывать, но есть выделения, например те падающие объекты, которые были зафиксированы на игровом полотне (всего существует 7 типов падающих объектов). , состоящий из 4-х кубиков. Каждый падающий объект имеет фиксированный цвет и может вращаться вверх, вниз, влево и вправо, поэтому нет необходимости его перерисовывать. Игровое полотно представляет собой CommandListener, который может принимать команды пользователя с клавиатуры и управлять действиями влево, вправо, вниз и вращением падающего объекта. Управление потоком всей игры отражено в методе Paint() объекта игрового холста. Paint() рисует текущий экран игры на основе текущего состояния игры. Экран приветствия и экран окончания игры нарисовать довольно просто. Нарисовать экран паузы игры также довольно просто: достаточно установить флаг, чтобы при выполнении функции Paint() не было необходимости фактически выполнять действие перерисовки. Для отрисовки экрана во время игры падающий объект должен быть нарисован в текущей позиции падающего объекта. Прежде чем рисовать падающий объект, определите, может ли он упасть. Если он может упасть, дайте ему упасть на одно место, а затем нарисуйте его. Если падающий объект больше не может падать, определите, находится ли игра в состоянии Game Over. он находится в состоянии «Игра». Если игра находится в состоянии «Окончено», установите состояние игры в состояние «Игра окончена», чтобы при следующей перерисовке на холсте отображалось изображение «Игра окончена». Если игра не находится в состоянии «Игра окончена». , одновременно фиксируйте падающие объекты и проверяйте падающие объекты на игровом полотне. Проверьте все строки ниже текущей строки, чтобы узнать, требуется ли удаление строки. Если требуется удаление строки, очистите данные удаленной строки в игре. карту, а затем нарисуйте удаленную строку цветом фона. Затем инициализируйте новый падающий объект и нарисуйте этот новый падающий объект. Технологическая схема метода окраски выглядит следующим образом:
3. Структура данных
В этой игре используются следующие структуры данных.
игровая зона
Игровая область — это часть экрана мобильного телефона или КПК. Площадь представляет собой квадрат, длина стороны которого должна делиться без остатка на 16 (потому что русская игровая зона — это именно квадрат длиной 16 маленьких кирпичиков и 16 маленьких кирпичиков). широкий). Эта область должна располагаться по центру экрана как по горизонтали, так и по вертикали. Игровая область разделена на 2 части по горизонтали: одна часть шириной 12 маленьких кирпичиков для отображения игрового контейнера, а другая часть шириной 4 маленьких кирпичика для отображения следующего падающего объекта и очков.
маленькие кирпичи
Маленькие кубики являются частью дропа и игрового контейнера. Выглядит как квадрат, длина стороны которого составляет 1/16 длины стороны игровой зоны. Когда рисуется каждый маленький кирпичик, с четырех сторон остается по 1 пикселю, который рисуется белым или серым цветом, чтобы между кирпичиками оставался зазор. Каждый маленький кирпичик также имеет идентификатор от 1 до 8. Мы можем использовать цветовой массив (называемый в программе BRICK_COLORS) для хранения этих 8 цветов. Если идентификатор определенного маленького кирпичика равен 3, то цвет маленького кирпичика — BRICK_COLORS[3-1].
падающий объект
По сути, дроп представляет собой квадрат, составленный из 16 маленьких кубиков. Всего существует 7 видов падающих объектов, например, в форме «поля», в форме «L» и т. д. Для каждого падающего объекта предусмотрено 4 варианта вращения. Каждый падающий объект имеет идентификатор от 1 до 7. Потому что цвет падающего объекта фиксирован. Мы также можем использовать значение нижнего индекса этого цвета в массиве BRICK_COLORS плюс 1 в качестве идентификатора падающего объекта.
Например, падающий объект в форме буквы «L» имеет идентификатор 3, а его вариант:
Итак, какая структура данных используется для хранения падающего объекта. Давайте в качестве примера возьмем падающий объект в форме буквы «L»:
Поскольку каждый падающий объект имеет четыре состояния, мы можем рассмотреть возможность использования массива длиной 4 для хранения четырех состояний падающего объекта. Каждый элемент массива представляет состояние падающего объекта. Так что же следует использовать для представления определенного состояния падающего объекта? Как видно из приведенного выше рисунка, для хранения состояния падающего объекта наиболее целесообразно использовать двумерный массив 4X4. Там, где появляются цветные кубики, значение равно 1, а там, где есть только цвет фона и рисовать не нужно, значение равно 0. Следовательно, четыре состояния всего падающего объекта в форме буквы «L» можно представить в виде трехмерного массива:
protected int blockpattern3[][][] = {
{{0, 1, 0, 0}, {0, 1, 0, 0}, {0, 1, 1, 0}, {0, 0, 0, 0}},
{{0, 0, 0, 0}, {0, 1, 1, 1}, {0, 1, 0, 0}, {0, 0, 0, 0}},
{{0, 0, 0, 0}, {0, 1, 1, 0}, {0, 0, 1, 0}, {0, 0, 1, 0}},
{{0, 0, 0, 0}, {0, 0, 1, 0}, {1, 1, 1, 0}, {0, 0, 0, 0}}
};
карта игры
Игровая карта используется для хранения фиксированных плиток в игровом контейнере. Игровой контейнер имеет ширину 12 маленьких кубиков и высоту 16 маленьких кубиков, включая две левую и правую стенки и нижнюю часть контейнера ниже. Таким образом, двумерный массив 16X12 (в программе называемый «mapdata») используется для хранения фиксированных блоков. Если mapdata[i][j]=k(k!=0). Тогда это означает, что в строке i и столбце j игрового контейнера есть фиксированный маленький кубик, а значение цвета маленького кубика равно BRICK_COLORS[k]. -1]. Если k=0, это означает, что в строке i и столбце j нет кирпичей.
Таким образом, для следующего времени работы игры значение карты данных равно {{8,0,0,0,0,0,0,0,0,0,0,8}{8,0,0,0,0 , 0,0,0,0,0,0,8}{8,0,0,0,0,0,0,0,0,0,0,8}{8,0,0,0,0 , 0,0,0,0,0,0,8}{8,0,0,0,0,0,0,0,0,0,0,8}{8,0,0,0,0 , 0,0,0,0,0,0,8}
{8,0,0,0,0,0,0,0,0,0,0,8}{8,0,0,0,0,0,0,0,0,0,0,8} {}{8,0,0,0,0,0,0,0,0,0,0,8}{8,0,0,0,0,0,0,0,0,0,0, 8}
{8,0,0,0,0,0,0,0,0,1,1,8}{8,0,0,0,0,0,0,0,0,1,1,8} {8,0,0,0,0,0,7,7,5,1,1,8}{8,0,5,0,0,7,2,5,5,1,1,8}
{8,8,8,8,8,8,8,8,8,8,8,8}}
Исходный код и исполняемый код
Всего существует 3 файла: src.rar, ketrisgame.jad, ketrisgame.jar Примечание: src.rar содержит все исходные коды. Для работы программы в ketrisgame.jar также необходимы файлы ресурсов. После установки wtk2.1 поместите ketrisgame.jad и ketrisgame.jar в один и тот же каталог (обратите внимание, что путь к каталогу не может содержать китайские символы и пробелы), дважды щелкните файл. ketrisgame.jad, можно запустить игру в эмуляторе.
Ссылки
http://www.javadrive.jp/j2me/game/3/index.html
<j2me в двух словах>
<Введение в программирование мобильных телефонов/КПК на языке Java>