![]() |
![]() |
Lazzy |
![]() ![]()
Сообщение
#1
|
![]() Группа: Пользователи Сообщений: 9 Пол: Мужской Реальное имя: тьома Репутация: ![]() ![]() ![]() |
Привета!
Задача формулировалась преподом довольно размыто, поэтому может присутствовать некоторая вольность в выполнении, что не может не радовать. Смысл в том, чтоб написать на Pascal (к сожалению) игру, в которой есть кораблики, соревнующиеся между собой Препод седой уже, кстати. Он хотел там видеть возможность выбора направления ветра и хода корабликов галсами при встречном ветре, но реализовать управление парусами, по-моему, слишком сложно, а как без этого галсами ходить? Поэтому реализация мне видится так: вид сверху на остров либо замкнутый кольцевой канал, один кораблик с мотором, цель игры - управляя корабликом стрелками пройти дистанцию за наименьшее время. Если у кого-то возникнет желание помочь или вдруг есть какие-то наработки, буду очень признателен. Вот код: program MAPA3M;Тут нарисованы берега "лагуны" с островом посередине, вид сверху. Кораблик обозначен коричневой точкой и управляется с клавиатуры, это пока все =/ Как видите, нету навыка работы с процедурами, пишется сложно =/ Что конкретно неясно как реализовать: Как сделать чтоб кораблик при нажатиии клавиши начинал двигаться в направлении нажатой стрелки и не прекращал движение? Сейчас он двигается только, когда стрелка нажата. Можно ли сделать движение по диагонали? Сейчас судно движется только в четырех направлениях. Как реализовать крушение кораблика при столкновении с берегом? (Видимо, нужно написать функцию, возвращающую значение цвета пикселов вокруг кораблика, и если эти значения равны значению цвету берега - корабль тонет) Как с помощью Pascal реализовать счетчик времени? Ведь цель игры - пройти дистанцию за наименьшее время. Искал в учебниках, а там работа только с временем системы. Как сделать, чтоб игрок вводил свое имя и результаты записывались в текстовый файл? Как сделать скорость кораблика независимой от тактовой частоты? Ведь delay зависит, если не ошибаюсь, от этого параметра, значит на разных компьютерах игра с этой процедурой будет иметь разную скорость? Заранее спасибо. Файл pas в аттаче. Прикрепленные файлы ![]() |
![]() ![]() |
Lazzy |
![]() ![]()
Сообщение
#2
|
![]() Группа: Пользователи Сообщений: 9 Пол: Мужской Реальное имя: тьома Репутация: ![]() ![]() ![]() |
andriano, спасибо за обстоятельный ответ.
Я попробовал сделать движение без постоянного удержания клавиши, и реализовать столкновение с берегом. Насчет системы движения: корабль должен двигаться непрерывно, не останавливаясь, есть возможность только менять направление движения, поэтому переменных для описания состояния движения не вводил. Однако, я совсем запутался даже здесь. case ch of Для непрерывности движени ввел цикл, а для крушения, как видно, проверку цвета пикселей вокруг корабля. Но корабль двигаеся непрерывно именно до столкновения с берегом, то есть, движение прерывается только при выполнении условия цикла while, а дожен вроде бы и при нажатии клавиши (условие цикла repeat). Да и в столкновении с берегом ошибка - корабль наталкивается на берег, потом делает еще одно перемещение - уже по берегу, а только после этого движение прекращается. Еще и надпись 'Game over. Press Enter, then Esc to exit.' не выводится - поставил временно фигурные скобки, потому что программа не работает без них, не смог обнаружить ошибку. Цитата - целесообразно внутри case выполнять только минимум действий: в данном случае лишь вычисление приращений координат, а всю остальную работу делать в одном месте (чтобы при изменении способа отображения корабля не пришлось менять код в 4-х местах одновременно). Хорошо бы, но я не знаю как. Подскажи, если не затруднит.Цитата - насколько я понял, при нажатии Esc у тебя происходит мгновенный выход из программы в обход конца цикла и восстановления режима. Да. А как нужно? |
![]() ![]() |
![]() |
Текстовая версия | 6.08.2025 15:13 |