Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.86/21: Рейтинг темы: голосов - 21, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 14.04.2018
Сообщений: 26

Передвижение пакмана в игре

16.07.2018, 11:50. Показов 5179. Ответов 37
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здраствуйте,нужна помощь!Я програмирую игру пакман в питоне.Не знаю как реализовать управление пакманом как в оригинальной части.Саму логику понять не могу...
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.07.2018, 11:50
Ответы с готовыми решениями:

Передвижение объекта в игре
В моей игре объект(бот) передвигаеться с помощью таймера(pygame.time.set_timer()) каждые 10 милисекунд со скоростью 1 пиксель.Передвижение...

Передвижение объектов в игре одновременно
Столкнулся вот с такой проблемой - в игре есть 2 объекта и 2 обработчика событий KeyDown. Нажатие кнопок завязано не на самих объектах а...

Нахождение кратчайшего пути по матрице, или передвижение привидений в игре Пакмен
Подскажите пожалуйста как правильно реализовать? Имеются координаты x,y пакмана и приведения. Я использую такой алгоритм: void...

37
Модератор
Эксперт функциональных языков программирования
3140 / 2288 / 469
Регистрация: 26.03.2015
Сообщений: 8,910
25.07.2018, 13:31
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Ruslan_Glazkov Посмотреть сообщение
Какие координаты надо разделять, центра пакмена?
Левого верхнего угла (если ноль у Вас в той стороне). При этом надо смотреть на остаток от деления. Если он не равен нулю, то Ваш пакман находится сразу в двух клетках и, если нажата соответствующая стрелка, проверять надо обе соседние.

Цитата Сообщение от Ruslan_Glazkov Посмотреть сообщение
А он тогда будет калично передвигаться, иногда по 4 пикс, иногда с другой скоростью.Рисовать спрайты заново будет долго .
У Вас есть начальная (текущая) точка и конечная (следующая) точка. Если конечная точка расположена не на 4 пикселя вправо, а на 3 пикселя вправо и 1 пиксель вверх, то что принципиально изменится в скорости и хаотичности движения?
0
0 / 0 / 0
Регистрация: 14.04.2018
Сообщений: 26
25.07.2018, 14:13  [ТС]
Цитата Сообщение от Shamil1
Левого верхнего угла (если ноль у Вас в той стороне). При этом надо смотреть на остаток от деления. Если он не равен нулю, то Ваш пакман находится сразу в двух клетках и, если нажата соответствующая стрелка, проверять надо обе соседние.
Проверять обе соседние это, к примеру, если клавиша вверх нажата,то проверять клетки У-1 и У-2?
0
Модератор
Эксперт функциональных языков программирования
3140 / 2288 / 469
Регистрация: 26.03.2015
Сообщений: 8,910
25.07.2018, 14:43
Пусть Пакман находится в двух соседних по горизонтали клетках. Если нажата клавиша вверх, то проверять клетки над обеими.
0
0 / 0 / 0
Регистрация: 14.04.2018
Сообщений: 26
25.07.2018, 15:20  [ТС]
Shamil1, а как исправить проблему что когда пакман находиться в двух соседних клетках по горизонтали и считает что он находиться в левой клетке еще левее которой стена, и из-за этого он влево больше не передвигаеться
0
Модератор
Эксперт функциональных языков программирования
3140 / 2288 / 469
Регистрация: 26.03.2015
Сообщений: 8,910
25.07.2018, 15:48
Цитата Сообщение от Ruslan_Glazkov Посмотреть сообщение
как исправить проблему что когда пакман находиться в двух соседних клетках по горизонтали и считает что он находиться в левой клетке
Заменить пакмана на другого, более умного. Который понимает, что находится в двух клетках.
0
294 / 265 / 48
Регистрация: 09.04.2013
Сообщений: 1,038
25.07.2018, 20:36
Сейчас специально скачал и потыкал NES версию пакмена
Пакмен движется в заданном направлении пока ему не скажут двигается в противоположном либо если нажали на кнопку движения в перпендикулярном направлении и в то же время пакмен находится в центре клетки и в заданном направлении есть проход.
Т.е. если, например, движемся влево, а нажали вверх, и пакмен находится между клетками, и в одной из верхних клеток стена - то игнорим кнопку и продолжаем двигаться куда двигались.
Таким образом должна быть следующая модель поведения пакмена:
- у него есть вектор движения который каждый шаг изменяет координаты, если только пакмен не уперся в стенку
- изменение вектора движения возможно только на противоположный, либо на перпендикулярный если в момент прохода через центр клетки (1) нажата соответствующая клавиша и (2) в соответствующей соседней клетке есть проход

Добавлено через 29 минут
Признаки прохода через центр клетки:
а) остаток от деления координат top-left на 25 ровно равен 0
б) перед совершением шага число (top-left / 25) отличается от того что будет после совершения шага
0
0 / 0 / 0
Регистрация: 14.04.2018
Сообщений: 26
25.07.2018, 22:17  [ТС]
wingblack, это я уже понял,прошу почитай мое прошлое сообщение со скрином и..
Пакмен движется в заданном направлении пока ему не скажут двигается в противоположном либо если нажали на кнопку движения в перпендикулярном направлении и в то же время пакмен находится в центре клетки и в заданном направлении есть проход.
Т.е. если, например, движемся влево, а нажали вверх, и пакмен находится между клетками, и в одной из верхних клеток стена - то игнорим кнопку и продолжаем двигаться куда двигались.
Кнопка не игнориться, а запомниаеться что бы при первой возможности когда пакман будет в центре клетки и клетка выше будет '0' свернуть вверх.
0
294 / 265 / 48
Регистрация: 09.04.2013
Сообщений: 1,038
26.07.2018, 09:07
Цитата Сообщение от Ruslan_Glazkov Посмотреть сообщение
Кнопка не игнориться, а запомниаеться что бы при первой возможности когда пакман будет в центре клетки и клетка выше будет '0' свернуть вверх.
В NES версии именно что игнорится и не запоминается. Изменение направления происходит только если (1) можно пройти (2) вот прямо сейчас нажата кнопка.

Впрочем, в своей версии ты можешь делать как захочешь
0
0 / 0 / 0
Регистрация: 14.04.2018
Сообщений: 26
26.07.2018, 12:08  [ТС]
wingblack, почитай мой комент со скрином который я писал раньше,
0
Модератор
Эксперт функциональных языков программирования
3140 / 2288 / 469
Регистрация: 26.03.2015
Сообщений: 8,910
26.07.2018, 14:13
Ruslan_Glazkov,
Вы напишите, что конкретно вызывает проблему. Вы не можете определить положение пакмана на поле? Или не можете определить, есть ли препятствие в заданном направлении? Или не можете определить, где будет пакман, если сдвинется на 4 пикселя? Или что-то другое не можете определить?
0
431 / 302 / 90
Регистрация: 03.12.2015
Сообщений: 741
27.07.2018, 09:53
Цитата Сообщение от Ruslan_Glazkov Посмотреть сообщение
а как исправить проблему что когда пакман находиться в двух соседних клетках по горизонтали и считает что он находиться в левой клетке еще левее которой стена, и из-за этого он влево больше не передвигаеться
1. Считайте координаты пакмана в вещественных числах, а не в целых.
Например, если коордианата пакмана будет 5.25, это значит что он стоит между 5 и 6 клетками на карте.

2. Обозначьте скорость пакмана тоже через вещественные числа, а не пиксели. Например, если пакман проходит полную клетку за 6 тиков, то скорость будет 1/6.

3. В любой момент для пакмана храните: направление (вертикальное/горизонтальное), текущие координаты X,Y и текущее изменение координат dx, dy (зависит от направления и скорости)

4. Каждый тик вычисляется новое положение пакмана. Сразу после этого, определяете находится ли уже пакман в центре клетки или еще не дошел. Не забывайте, что работаете с вещественными числами, поэтому пакман не попадет прямо в центр клетки. Например, если скорость 1/3 = 0,3333333333, то через три тика его координата будет 0,9999999999, а не ровно единица. Поэтому вещественные числа сравниваем через допустимую погрешность eps (достаточно маленькой должна быть, например 1e-5).
Code
1
2
3
x = x + dx
if abs(округление(x) - x) < eps:
  x = округление(x)
Тем самым Вы гарантируете, что каждый раз когда пакман проходит клетку карты, его координаты будут точно совпадать с центром клетки (и указывать на координаты этой клетки)

5. Если пакман еще не дошел до центра клетки, просто двигаемся дальше (переходим к следующему тику). А вот если дошел, то в этот момент пытаемся как раз и пытаемся поменять его направление движения. Новое направление будет зависеть от хотелок пользователя (например, идти вверх) и от возможностей пакмана (есть ли на карте свободная клетка в данном направлении).

6. Как видно, хотелки пользователя срабатывают не сразу, а только когда пакман дошел до центра какой-нибудь клетки. Значит нам надо куда-то сохранить команду пользователя - последнюю нажатую кнопку для направления пакмана.
Поэтому, при обработке тика, проверяешь:
- пользователь нажал кнопку в том же направлении в каком идет пакман - ничего не делаешь
- пользователь нажал кнопку в противоположном направлении - сразу разворачиваешь пакмана
- пользователь нажал кнопку в перпендикулярном направлении - запоминаешь выбор для последующего анализа (когда пакман придет в центр следующей клетки)

7. Превращение вещественных координат в пиксели должно происходить в самом конец обработки тика, только при непосредственном рисовании. Координаты пикселей будут вычисляться очень лекго, если координаты карты и координаты пакмана считать с 0:
Code
1
2
3
4
5
6
cell_size = 25  # ширина клетки в пикселях
offset = # координаты левого верхнего угла карты на экране в пикселях
pacman_circle_x = packman_x * cell_size + offset
pacman_circle_y = packman_x * cell_size + offset
pacman_radius = cellsize - 2
show_circle(pacman_circle_x, pacman_circle_y, pacman_radius)
0
0 / 0 / 0
Регистрация: 14.04.2018
Сообщений: 26
27.07.2018, 18:30  [ТС]
vrm2, спасибо, а таймер делать через pygame.time.set_timer ()? И можно по подробнее про тики?

Добавлено через 11 минут
Shamil1, припустим скорость пакмана 5пикс.Считать глобальные коорды пакмана будем в левой верхней точке.Припустим что стена стоит на глобальной координате по Х 0 (на координате в матрице тоже 0), а пакман 45 (в матрице 1).Он сможет пойти влево только если левее от него клетка в матрице на равна '1'(стена), но так как (45/25) округляеться к 1 (в сторону к 0), то пакман думает что его соседняя клетка слева от него стена,поэтому не ходит туда,хоть места там еще есть для хода.Думаю может окгруглять в таких моментах в сторону противоположную от 0, или можна как-то по лучше сделать?
0
431 / 302 / 90
Регистрация: 03.12.2015
Сообщений: 741
27.07.2018, 19:38
Цитата Сообщение от Ruslan_Glazkov Посмотреть сообщение
а таймер делать через pygame.time.set_timer ()? И можно по подробнее про тики?
Тики - это промежутки времени, через которые ты обсчитываешь игру (обрабатываешь ввод пользователей, перемещаешь персонажей и т.п.). Обычно вызывается с помощью таймера через фиксированные промежутки времени, допустим 50 раз в секунду. Про таймер в pygame не знаю
0
0 / 0 / 0
Регистрация: 14.04.2018
Сообщений: 26
28.07.2018, 12:22  [ТС]
vrm2, ну к примеру каждую 1 секунду считать координаты пакмана и перемещать его на 1 ход?Тогда это поидее таймер должен быть.И возмодно ли в питоне перемещать спрайт на вещественное колво пикселей?
0
Модератор
Эксперт функциональных языков программирования
3140 / 2288 / 469
Регистрация: 26.03.2015
Сообщений: 8,910
28.07.2018, 13:34
Цитата Сообщение от Ruslan_Glazkov Посмотреть сообщение
Думаю может окгруглять в таких моментах в сторону противоположную от 0, или можна как-то по лучше сделать?
В какую бы сторону Вы не округляли, Вы потеряете информацию. Для принятия решения Вам нужно два числа - результат деления и остаток от деления.
0
431 / 302 / 90
Регистрация: 03.12.2015
Сообщений: 741
28.07.2018, 14:46
Цитата Сообщение от Ruslan_Glazkov Посмотреть сообщение
ну к примеру каждую 1 секунду считать координаты пакмана и перемещать его на 1 ход?Тогда это поидее таймер должен быть.И возмодно ли в питоне перемещать спрайт на вещественное колво пикселей?
Не понимаю вопрос. Решаешь для себя, что обрабатывать информацию надо 10 раз в секунду, заводишь таймер на срабатывание каждые 1/10 секунды. При срабатывании таймера передвигаешь пакмана и делаешь другие полезные вещи.

Как работает все в pygame - таймеры, спрайты - я не знаю. Думаю, что координаты пикселей должны быть все де целочисленными. Поэтому внутренние вещественные координаты на сетке надо будет преобразовать в целочисленные координаты на экране, но делать нужно это только непосредственно при выводе картинки (спрайтов) на экран.
0
0 / 0 / 0
Регистрация: 14.04.2018
Сообщений: 26
28.07.2018, 15:27  [ТС]
vrm2, только что попробовал рисовать спрайт по вещественным координатам, работает
0
0 / 0 / 0
Регистрация: 14.04.2018
Сообщений: 26
29.07.2018, 13:19  [ТС]
Все, победа! Всем спасибо, работает отлично🎉🎉
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.07.2018, 13:19

[LibGDX] Передвижение камешков в игре "три в ряд"
Пишу игру при помощи фреймворка libgdx. Не могу придумать, как сделать перемещение камешков. Помогите пожалуйста!

Ошибка 0x000000101 , при игре 10 минутной игре в Dota 2, CS:GO
Имя события проблемы: BlueScreen Версия ОС: 6.1.7600.2.0.0.256.48 Код языка: 1049 Дополнительные сведения об этой проблеме: ...

Как отлавливать нажатия клавиш в игре? Как их виртуально нажимать в игре?
Всем привет. Где-то месяц назад прочитал статью об каком-то парне, что сделал самообучающую программу для игр на Нинтендо. Но это вроде...

Передвижение
Ребята помогите понять как в Xamarin передвигать объекты , на пример меняя координаты в переменной картинка стала в другом месте ,...

Передвижение
Не знаю была уже такая тема или нет, но все-таки создан заново. Хотелось бы спросить, может кто-нить помочь с кодом, на основе...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
38
Ответ Создать тему
Новые блоги и статьи
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru