|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
25.08.2011, 10:13 | #1 |
Пользователь
Регистрация: 17.08.2011
Сообщений: 17
|
Небольшая РПГ.
Вот сделал для тренировки и интереса небольшую РПГ.
Я всегда очень любил играть в РПГ и мне было интересно как же все таки устроена механика в подобных играх. Когда начал изучать програмирование в Паскале, а потом в Дельфи у меня появилась возможность попробывать. Игра чисто консольная, в консоль выводиться сообщения о выборах действий и нанесенном уроне. Смысл такой: есть 5 боев с разными монстрами. Между боями вы можете сходить магазин, купить оружие, или распределить очки опыта. Во время боя у вас есть возможность выстрелить или подлечиться. Бой идет пошагово. Сначала идете вы, потом монстр. Причем пошаговость у монстров разная. На некоторых монстров можно стрелять 2, а то и три раза, на один их ход. Некоторые монстры бьют первыми, в других можно всадить пару пуль пока они не добежали. Управление осуществляется цифрами на клавиатуре. В встроке выбора указанна цифра. Справка. В окне персонажа можно повысить хар-ки за очки опыта. Шоб повысить нужно ввести обозначеную рядом цифру. Сила- чем больше сила тем большее оружие можно использовать. Оружие покупается за деньги в магазине. Требование к силе равно цифре оружия. Ловкость- влияет на вероятность попасть из оружия по противнику и нанести крит урон, а так же защиты от них. При атаке пси существ на ловкость налагается штраф(собака и контролёр, читают мысли и уворачиваются). Атака контролёра штрафует ловкость. Влияет на лечение. Выносливость- повышает здоровье. Интеллект - влияет на вероятность попасть из оружия по противнику и нанести крит урон, а так же защиты от них. При атаке пси существ НЕ налагается штраф(собака и контролёр). Атака контролёра уязвима к интеллекту. Влияет на лечение, НО налагается штраф при лечении. Что бы выйти из магазина и экрана перса нажмите ЛЮБУЮ другую цифру. После победы над каждым монстром вы получаете деньги и опыт. Во время боя вводить другие цифры кроме 1 и 2 , не рекомендую. Победой считается победы над контролёром. Особо не ругайте, т.к. я 7 -классник и ток-ток изучать начал. Если найдете баги, ошибки, скажите. Заранее спасибо.
Если помог, жми на весы слева
|
25.08.2011, 13:54 | #2 |
Пользователь
Регистрация: 16.06.2011
Сообщений: 42
|
не плохо сделано
Помог? тогда жми на весы
Девушка что оператор мобильной связи, когда денег нет, то она не доступна ©Радио Маяк |
25.08.2011, 17:09 | #3 |
Форумчанин
Регистрация: 18.10.2010
Сообщений: 419
|
игру не смотрел, но ваш пост написан очень неплохо для семиклассника!
грамотно и без ошибок. респект уже за это =) |
26.08.2011, 08:35 | #4 |
personality
Старожил
Регистрация: 28.04.2009
Сообщений: 2,885
|
Пожалуй, начну с игры : сделано очень неплохо (при взгляде на игропроцесс) довольно просто и изящно при этом. Учитываем начальный уровень - очень качественный, рациональный подход. Мелочи в орфографии : "ВыберИте" ; нестабильная пунктуация: кое-где есть "!" а где-то в сходных фразах - нет(кстати, для чего экспрессия вида "Предмет куплен!" ?), не подумайте что придирки, просто сразу чувствуется явное качество и старание при отсутствии подобного.
Малость поиграл - прикольно, но до конца не стал ) что хочется - наличие в "главном меню" справки (тоже отдельной цифрой, и показывать примерно такой текст как у Вас в посте), хочется вменяемого выхода из персонажа и магазина, припишите 0 - выход и всё. Полагаться на юзера в вопросах ненажатия чего-либо не стоит - он точно нажмёт сделайте для неверного ввода обработку - мол "не верный ввод" и тут же показ меню снова. Нашёл и косяк - треснул кого-то до 0 жизней, а он не помер (думаю, всё дело в обработке в этой строке If monster[2, bo] < 0 then goto 11; ) Также хочется поантуражней - описать процесс удара (а то сейчас только результат), не видно ничего , что говорило бы о действии монстра - тоже только результат. Предлагаю ещё поиспользовать Textcolor - будут строки/символы разного цвета - гораздо лучше смотреться будет ! )) А теперь переходим к главному - к коду. Тут уже хвалы особо не будет... хотя есконсоль говорит в Вашу пользу )) Так вот , код - некая GOTOвасия, думаю, не лишним будет почитать известную статью о конечных автоматах http://delphiworld.narod.ru/base/algo_chg_algo.html . Потом - слишком фиксированный подход - (все значения заданы в программе), а не лучше ли было сделать что-то хранимым в файлах - будет, например, возможность один и тот же "сценарий игры" сделать с разной сложностью - записать несколько файлов с разными характеристиками монстров. Третье - малая структурированность - во многих местах отлично смотрелись бы record'ы (почитайте о записях, уверен, понравится). Ну и последнее - обилие "magic numbers" - многие числа лучше вынести в константы и в коде использовать именно их - так возрастёт читаемость и ясность кода, а также возрастёт гибкость - меняем саму константу(ну, число, для каких-либо целей) и заботиться больше ни о чем не надо - везде в расчеты попадет наша циферка, и не надо смотреть код - "а где ещё у нас циферка не поменяна?" , да и label'ы лучше иметь с говорящими именами - проще вникать в код будет , даже Вам самому. Ну и подсказочка - в Вашем случае неверный ввод (и прочее подобное) легко обрабатывать веткой else в соответствующем case проверки. Далеко пойдёте, удачи! Последний раз редактировалось phomm; 26.08.2011 в 08:40. |
26.08.2011, 10:26 | #5 |
Пользователь
Регистрация: 17.08.2011
Сообщений: 17
|
Спасибо за расширенный ответ.))
1. Пострараюсь исправить пунктуацию и орфографию. 2. Справку сделаю 3. Хм...Даже не знаю. Нажатие любой неописанной клавиши выводит из экрана перса и магазина и так, а из меню - закрывает прогу(думую исправить). А в бою тогда сделаю 0- пропуск хода(....но еще один goto), другие цифры - "неверный вод" и показ меню действий(и опять goto!!!) 4. Баг с 0 исправлю. Насчет антуража, ты имел ввиду сообщения типа: "Вы выстрелили по собаке, но она прочитала ваши мысли и в мгновение увернулась". Я хотел это сделать, но тогда бы получилась путаница. Опять же из-за ограниченности моих знаний. 5. А вот с этим я не согласен. Во-первых : дополнительный модуль(хотя при 160 гб это не страшно), возможно будет не удобно читать и вредить глазам(разве что перегородки другого цвета делать), задавать цвет придется постоянно перед изменениями.....мда....код распухнет... 6. Есконсоль мне посоветовали в другой теме и я долго не мог понять, как же ее подключить)). 7. Честно: я вообще знаю мало операторов. Замены гоуту я не знаю. Статью почитаю. 8. Файлы буду изучать. Я так понимаю можно будет делать что-то типо редактора и пользовательских модулей(как в обливион)? 9.Почитаю. 10. Насчет "magic numbers" не понял. ТЫ имеешь ввиду переменные bo, m, i ? Так они мне нравяться, это я бы сказал, самое оптимизированное в моем коде)). И насчет просчмотра кода не понял. Поясни плз. 11. Спасибо. Еще кое-что: кто тестирует игру(да, назовём это так) не обращали внимание что криты и промахи какие-то...закономерные?
Если помог, жми на весы слева
Последний раз редактировалось Gandfil; 26.08.2011 в 10:30. |
26.08.2011, 11:02 | #6 |
personality
Старожил
Регистрация: 28.04.2009
Сообщений: 2,885
|
Закономерные они потому что надо вызывать Randomize; после главного begin (будет инициализация генератора случайных чисел, без неё числа случайные числа не будут изменяться при каждом новом старте программы).
Magic numbers - это когда существуют в логике программы какие-то числа (это numbers) и они что-то определяют в ходе программы (а это их magic), их проблема в том, что после какой-то критической массы таких чисел, понять что они значат и как ИМЕННО влияют на программу становится дико тяжело (особенно стороннему человеку). Их лучше заменять на "говорящие константы", на сеты(sets) и енумы(enumerated types), разбивать код на более мелкие куски (обычно "говорящие" процедуры, они внутри себя скрадывают загогулины алгоритма). Для ухода от goto прочитай про все циклы (3 штуки), псевдофункции типа continue, break, exit. Разберись четко в if-then-else и case-of-else. Про bo, m,i - не стоит особо так использовать глобальные переменные и тем более так их называть, подумай по логике программы - может где-то можно обойтись локальными переменными или параметрами процедур вместо них, ну и имена нормальные лучше взять, типа MobNum - номер монстра и т.п. Кстати, о record - с ними легче в файлы писать структурированную информацию (достаточно объявить Tmyrecord и file of Tmyrecord и можно работать довольно удобно с данными). Когда освоишься со всем этим добром (все операторы, рекорды, функции , процедуры)- можешь начать изучать ООП - там можно добиться ещё более поразительной мощи при меньшем коде (но для оного желательно грамотное проектирование) И ещё - советую определиться с отступами - они у тебя скачут. Ну и конечно комментов побольше. И кстати, лучше иметь английские названия всего, а то всякие boi смотрятся не очень... (да, я знаю, что ты начинающий, но всё же ) и про magic numbers : подумай, что поймёт человек читая вот это : Код:
Вот кстати напишу тебе пример: твой код: Код:
Код:
Про просмотр кода - это было к разговору о константах (конкретного смысла фраза вне контекста не имеет). Насчёт антуража - просто хотя бы "вы стреляете" или "вас кусают" чтобы некая последовательность происходящего была, а не ощущение , что просто кинут кубик. Ну и "разную скорость" можно обыграть - например при скорости моба меньше , чем игрока написать в промежутке ходов - "собака готовится к прыжку", а если быстрее, то в промежутке ходов монстра что-нибудь "Вы не успеваете опомниться и вас кусают снова". Цветной текст - код в принципе никуда не распухнет: Код:
Последний раз редактировалось phomm; 26.08.2011 в 12:17. |
26.08.2011, 12:47 | #7 |
Пользователь
Регистрация: 17.08.2011
Сообщений: 17
|
Мда....много мне учить... Операторы....Ну циклы и условия я вроде хорошо знаю.
Код:
Если нужно могу таблицу цифр и цветов скинуть у меня учебник паскаля есть рядом, ток школьный. То есть после begin надо поставить randomize? и все нормик будет? Просто мне кажется что промахи, криты и попадания какие-то....цикличные.....Кажется будто они чередуются по какому-то циклу. Еще вопросы : ты наверное заметил что процедуры расположенны "матрешкой", у меня почему то по другому процедуры друг от друга не вызываются. Пишет что не обьявленны. Это нормик? Или есть какой-то способ решения? И еще: Код:
Как сделать так что бы условия победы и поражения проверялись постоянно и автоматически? Я до этого модифицировал "Сталкер" Через блокнот на языке С++))))))После этого уже ниче не страшно....
Если помог, жми на весы слева
Последний раз редактировалось Gandfil; 26.08.2011 в 13:03. |
26.08.2011, 15:57 | #8 |
personality
Старожил
Регистрация: 28.04.2009
Сообщений: 2,885
|
Учить, да думаю, ещё много, но "дорогу осилит идущий" ! и кстати циклы, мне кажется тебе надо ещё вникнуть, недостаточна "вжились" они в тебя, а то с goto кое-где сделано у тебя , где надо было бы цикл, см мой пример хотя бы.
inc и dec - это стандартные процедуры, я точно не знаю в каком они модуле, смотреть надо, наверное в system или sysutils, их не надо никак объявлять, просто ипользуется. ты же в дельфи пишешь - пользуйся справкой,там это всё описано, и другого очень много. Да, после главного (программного ) begin ставь randomize, все непонятки со случайными числами исчезнут. Чтобы объявлять процедуры/функции для вложения в другие процедуры, используй директиву forward после объявления процедуры, погугли delphibasics.ru насчет подобных вещей. Через or не получается , случайно скобки не забыл ?? (bo=1) or (bo = 5) then Насчет условий победы и поражения не знаю, надо смотреть код и понимать логику работы )) а времени особо сейчас нет ) Поработай пока над всем уже названным, там видно будет )) |
26.08.2011, 19:49 | #9 |
Пользователь
Регистрация: 17.08.2011
Сообщений: 17
|
А справка на английском - еле-еле разбираю. Ага, забыл. Ток вопрос: в твоем коде тип stat для ввода и повышения, а stats - сами характеристики? StatsCnt че значит?
И inputkey лучше взять глобальным, чтоб в разных процедурах использовать.
Если помог, жми на весы слева
|
28.08.2011, 09:23 | #10 |
personality
Старожил
Регистрация: 28.04.2009
Сообщений: 2,885
|
Да, Stat - это enum тип для обозначения конкретной характеристики, Stats - массив характеристик (объявление может быть таким Stats : array[low(Stat)..high(Stat)] of integer) StatsCnt - количество статов (константа, объявление - const StatsCnt = ord(high(Stat)) ; ), но можно и без неё, если в циклах сразу задавать
Код:
Inputkey - как хочешь, можешь взять глобальным, но тогда ты должен обеспечить в логике программы запрет чтения из этой переменной раньше, чем получишь в неё данные (а то можешь не заметить и использовать лежащее ранее в ней значение, локальная переменная от этого тоже не застрахована, но для них хотя бы срабатывает рефлекс : объявил-> инициализируй) |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
РПГ игры на WebMoney. | VintProg | Свободное общение | 28 | 07.07.2010 06:22 |
Структура классов для РПГ | NikSa | Gamedev - cоздание игр: Unity, OpenGL, DirectX | 10 | 22.06.2010 06:38 |
Игра врде РПГ | ZBEP | Gamedev - cоздание игр: Unity, OpenGL, DirectX | 13 | 13.05.2010 06:47 |
Реализация РПГ... | Shadow_1329 | Gamedev - cоздание игр: Unity, OpenGL, DirectX | 20 | 16.08.2009 18:40 |
РПГ игра | Принц | Gamedev - cоздание игр: Unity, OpenGL, DirectX | 4 | 10.06.2008 15:57 |