Возникли проблемы с созданием pacman?
Редактировать: совершенно забыл упомянуть, что я пишу на Java
Мне очень трудно создать какую-то систему обнаружения или какой-то способ заставить моего спрайта / персонажа pacman плавно перемещаться по доске в игре. Я не сделал доску, это изображение.
Сначала я попробовал определение цвета, которое работало лучше всего, но было не совсем плавным и довольно изменчивым.
Затем я попытался вручную ввести координаты местоположения, которое нельзя вводить. This also did not work out so well.
I'm currently trying now to have the program use colour detection and check a separate unseen board to see if I'm still on the path. This has failed by far the most. It seems like it would be the smartest but the corners are just alful and hard to fix by adjusting the images.
I'm wondering what method you guys would suggest for such a task.
1 ответ
Типичный подход к хранению "старой школы" игровых досок заключается в использовании char
или же int
многомерный массив. Используя отличную небольшую графику Мэтта, вы можете видеть, что на доске 21 на 21 квадрат:
int board[21][21] = {{1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
{1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1},
{1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1},
/* ... and so on, for all 21 lines .. */ }};
Неважно, какое число вы выберете для стен и дорожек. Позиции "пути" изначально содержат код "содержит точку". Поскольку paccy потребляет точки, сохраните новое значение на доске в той позиции, которая указывает, что точка была использована, но она все еще является квадратом пути. Мэтт рекомендуется -1
для стен, 0
ни за что, и 1
для точки - это красивый план, поскольку он позволяет вашим процедурам "столкновения стен" просто искать
if (board[pac.x][pac.y] > 0) {
/* still in bounds */
} else {
/* collided against a wall */
}
Недостатком является -1
более неудобно смотреть в инициализаторе массива.
Если бы это было сделано в C, было бы достаточно просто "улучшить" это, используя char board[21][21]
вместо int board[21][21]
и сохраните игровое поле в виде строки C:
char board[21][21] = " XXXXXXXXXXXXXXXXXXX "
" X X X "
" X XX XXX X XXX XX X "
" X X "
" X XX X XXXXX X XX X "
" X X X X X "
" XXXX XXX X XXX XXXX "
" X X X X "
"XXXXX X XXXXX X XXXXX"
" X X "
"XXXXX X XXXXX X XXXXX"
" X X X X "
" XXXX X XXXXX X XXXX "
" X X X "
" X XX XXX X XXX XX X "
" X X X X "
" XX X X XXXXX X X XX "
" X X X X X "
" X XXXXXX X XXXXXX X "
" X X "
" XXXXXXXXXXXXXXXXXXX";
Это намного проще для чтения в исходном коде, занимает меньше памяти, и ваши процедуры нахождения на стене могут выглядеть следующим образом:
if (board[pac.x][pac.y] == 'X') {
/* collided with a wall */
} else {
/* still in bounds */
}
(Хотя трейлинг NUL
то, что компилятор вставит в конец строки, означает, что нижний правый квадрат никогда не может быть использован для дорожки или стены - немного больше усилий можно обойти, но это не так красиво.)
Я не помню достаточно Java, чтобы заставить это работать на Java - но я уверен, что вы можете что-то придумать, если это выглядит достаточно убедительно.