5 / 5 / 0
Регистрация: 16.05.2012
Сообщений: 93
|
||||||
1 | ||||||
Написать игру PacMan27.10.2012, 13:31. Показов 35876. Ответов 22
Метки нет (Все метки)
Получил задание на курсовую - написать игру на Pascal ABC. Жанр - PacMan. В интернете есть исходники для Turbo Pascal, но я хочу написать именно свою (на программиста пошёл ради того, чтобы научиться делать игры). Можете подсказать с чего начать программу?
И ещё вопрос: можете объяснить работу этой части процедуры
0
|
27.10.2012, 13:31 | |
Ответы с готовыми решениями:
22
Написать игру Pacman Написать игру типа Pacman Написать игру "Pacman" Написать игру... |
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
|
|
27.10.2012, 13:47 | 2 |
Так это скорее всего переменные типа запись, придуманные самим программистом, естественно их нет ни в каких справочниках.
0
|
5 / 5 / 0
Регистрация: 16.05.2012
Сообщений: 93
|
|
27.10.2012, 16:37 [ТС] | 3 |
0
|
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
|
|
27.10.2012, 16:54 | 4 |
0
|
Почетный модератор
7966 / 3937 / 2464
Регистрация: 30.10.2011
Сообщений: 5,377
|
|||||||||||||||||||||||||||||||||||||||||
28.10.2012, 13:25 | 5 | ||||||||||||||||||||||||||||||||||||||||
Сообщение было отмечено как решение
Решение
1. Определиться с размещением карт: будут ли они записаны в файл или генерироваться в игре?
пример файла с несимметричным лабиринтом
Код
------------------------------- | | | | | | | | | | | | |-------- -----| |--- ------| | | |------------ -------| |--| | | | | |--------------------| | | | | | | | | |--------------------| | | | | | |----------- --------| | | | | | | | | |------------ -------| | | | | | | | | | | | | | | | | | | | | | | |--------------------| | | | | | | | | | | | | | | | | |---------------- ---| | | | | | | ------------------------------- и процедура считывания схемы лабиринта из файла
чаще всего в ПэкМэне используется симметричный лабиринт
Код
------------------- | | | ------- -----| |- | | ----------- ----- | | ----------------- | | ---- ----- ------ здесь нужна несколько другая процедура считывания лабиринта из файла
2. На карте случайным образом появляются фрукты, следовательно, нам нужна процедура, генерирующая случайный фрукт в случайном месте, но не на стене
3. Теперь карту надо нарисовать процедура вывода карты в графическое окно
4. Пришло время написать обработчик движения пэкмэна по нажатию клавиш вперед, назад, вверх, вниз главное, ограничить его перемещения размерами лабиринта =)
5. В этой же процедуре следует описать реакцию на фрукты. О, кстати, мне вспоминается, что все пустые места в пэкмэне заполнены точечками, и пока он их не съест, не перейдет на следующий уровень... по сути, "поедание" как фруктов, так и точечек организуется примерно таким образом
6. Скорее всего, в вашей игре будет несколько уровней, поэтому имеет смысл организовать меню с выбором карты / сложности игры
Все, на что мне хватило терпения
15
|
5 / 5 / 0
Регистрация: 16.05.2012
Сообщений: 93
|
|
28.10.2012, 14:58 [ТС] | 6 |
Ох, спасибо большое - буду разбираться
0
|
5 / 5 / 0
Регистрация: 16.05.2012
Сообщений: 93
|
|
30.11.2012, 09:02 [ТС] | 7 |
А не подскажете, как реализовать противников? Я так понимаю, что нужно задать им рандомное движение, если игрока нет на линии обзора, а частоту движения с помощью таймера. Когда игрок появляется на линии обзора, то они устремляются к нему и гонятся, пока таймер не отсчитает определённое время после того, как игрок скрылся с линии. Или нужно как то по-другому?
0
|
Почетный модератор
7966 / 3937 / 2464
Регистрация: 30.10.2011
Сообщений: 5,377
|
||||||
30.11.2012, 12:00 | 8 | |||||
можно еще попробовать независимо от прямой видимости регулировать движение врагов (кажется, в пэкмене практически так). То есть: определить текущие координаты врага относительно пэксмена и соответственно определить направление нужного сдвига.
примерно так
jp и je - координаты пэкмена kdi и kdj - направление движения (можно и через условный оператор написать) а дальше добавить учет стен.. (правда, не знаю, будут ли у пэкмена шансы спастись=)
2
|
5 / 5 / 0
Регистрация: 16.05.2012
Сообщений: 93
|
|
22.12.2012, 13:32 [ТС] | 9 |
А можно ли здесь сделать так, чтобы программа произвольно вызвала одно из действий в keyDown, чтобы организовывать произвольное движение врагов? Просто запускал некоторые flash-версии Пакмана, в некоторых враги движутся произвольно и не стремятся "врезаться" в игрока. Вместо этого их добавляют на уровень в количестве 3-5 штук
0
|
Почетный модератор
7966 / 3937 / 2464
Регистрация: 30.10.2011
Сообщений: 5,377
|
||||||
22.12.2012, 13:58 | 10 | |||||
вполне возможно:
сформировать двумерный массив с координатами врагов генератор случайных чисел определяет направление движения провести проверку - совершилось ли движение (чтобы не топтались на месте) например, так
2
|
5 / 5 / 0
Регистрация: 16.05.2012
Сообщений: 93
|
|||||||||||
22.12.2012, 18:43 [ТС] | 11 | ||||||||||
Спасибо большое)
Добавлено через 4 часа 36 минут Можете посмотреть, где-то я ошибся. Программа работает, но противник все равно не двигается.
0
|
Почетный модератор
7966 / 3937 / 2464
Регистрация: 30.10.2011
Сообщений: 5,377
|
|
22.12.2012, 20:05 | 12 |
Адренс Аксидор, в настоящий момент вижу две "ошибки":
u:=random(4) - генерирует случайное число в диапазоне от 0 до 3, а cases у вас расписаны от 1 до 4 но более существенно то, что изменения, которые происходят с врагами внутри процедуры, не вносятся в генеральный массив данных о положении врагов, вот они и остаются на месте или прыгают по лабиринту=) (это я гипотетически предполагаю исходя из того кода, что вы дали) то есть прежде всего вам стоит создать процедуру генерации случайного положения врагов или изначально задать им некую одну исходную позицию (не забудьте проверить, чтобы в этой позиции не оказалась стена) причем у данной процедуры, (допустим, GenEnemy(var z: matr)) будет фактическая переменная, массив, в который записаны и будут изменяться данные о местоположении врагов а вот второй процедуре - процедуре движения врагов - нужно тоже эту переменную записать как фактическу, к тому же вы забыли и про проверку "ход сделан или нет" и немного не так организовали массив данных о положении врагов я к чему веду: вам недостаточно оперировать с массивом-картой, нужен отдельный массив (из 5 элементов, если у вас 5 врагов, для каждого i 2 числа: координаты по х и по у) изменения производятся с массивом врагов, после чего новые данные записываются в массив карты, а старые данные о положении врагов должны буть удалены с массива карты...
1
|
5 / 5 / 0
Регистрация: 16.05.2012
Сообщений: 93
|
|
22.12.2012, 20:49 [ТС] | 13 |
Я пока одному врагу координаты задал - он появляется в нужном месте. Что касается case, если начинал индексацию с 0, то выскакивала ошибка после создания лабиринта (уже в самой программе, а не при компиляции).
Что касается остальных замечаний - попробую переделать. Спасибо, что помогаете!
0
|
Почетный модератор
7966 / 3937 / 2464
Регистрация: 30.10.2011
Сообщений: 5,377
|
|
22.12.2012, 20:53 | 14 |
проблему с кейс можно разрешить так
u:=random(4)+1; =)
1
|
5 / 5 / 0
Регистрация: 16.05.2012
Сообщений: 93
|
||||||
22.12.2012, 21:20 [ТС] | 15 | |||||
Вот какая в общем получается у меня. С case все равно продолжается ошибка. Или поменять тип? У меня byte. pi,pj - игрок. gi,gj -враг
А вот в процедуре изменение case не вызывает ошибки.
0
|
Почетный модератор
7966 / 3937 / 2464
Регистрация: 30.10.2011
Сообщений: 5,377
|
||||||
22.12.2012, 21:40 | 16 | |||||
Сообщение было отмечено Памирыч как решение
Решение
примерно так
1
|
5 / 5 / 0
Регистрация: 16.05.2012
Сообщений: 93
|
||||||
23.12.2012, 10:44 [ТС] | 17 | |||||
Всё, немного переделал - прыгать перестал - это в версии с процедурой. Вот только перестал проверять для врага стенки. И как связать переход врага с нажатием клавиши? Ой, не увидел ваше последнее сообщение
Добавлено через 12 часов 35 минут В общем сделал так, и когда игрок выбирает любое действие в KeyDown вызывается эта процедура. Т.е. ход делает игрок - делает враг. А как теперь столкновения сделать? Просто pi и gi, pj и gi не приравняешь (ошибка вылетает).
Всё, прошу прощения, организовал столкновения. Большое спасибо за помощь в написании программы!!!
1
|
5 / 5 / 0
Регистрация: 16.05.2012
Сообщений: 93
|
||||||
25.12.2012, 09:49 [ТС] | 18 | |||||
Можно ещё небольшой вопрос задать? При тестирование программы порой появляется баг: игра засчитывает проигрыш, когда не нужно, хотя, когда нужно, срабатывает всегда. Можете подсказать, какое ещё условие нужно задать или изменить, чтобы не было бага? pi,pj - координаты пакмана, gi,gj -врага
0
|
Почетный модератор
7966 / 3937 / 2464
Регистрация: 30.10.2011
Сообщений: 5,377
|
|
25.12.2012, 12:37 | 19 |
не могу навскидку предположить - в чем может быть причина.. когда появляется такой баг - в начеле или в конце игры?
может быть, попробовать условие записать как if (pi=gi) and (pj=gj) then?
1
|
5 / 5 / 0
Регистрация: 16.05.2012
Сообщений: 93
|
|
25.12.2012, 19:46 [ТС] | 20 |
Спасибо, попробую. Ошибка после 20-го - 30го хода
Добавлено через 9 минут Это решение помогло, ещё раз спасибо. Теперь будут добавлять элементы ООП.
0
|
25.12.2012, 19:46 | |
25.12.2012, 19:46 | |
Помогаю со студенческими работами здесь
20
Написать игру Написать игру написать игру Написать игру Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |