Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.08.2011, 10:13   #1
Gandfil
Пользователь
 
Регистрация: 17.08.2011
Сообщений: 17
По умолчанию Небольшая РПГ.

Вот сделал для тренировки и интереса небольшую РПГ.
Я всегда очень любил играть в РПГ и мне было интересно как же все таки устроена механика в подобных играх. Когда начал изучать програмирование в Паскале, а потом в Дельфи у меня появилась возможность попробывать.
Игра чисто консольная, в консоль выводиться сообщения о выборах действий и нанесенном уроне.
Смысл такой: есть 5 боев с разными монстрами. Между боями вы можете сходить магазин, купить оружие, или распределить очки опыта. Во время боя у вас есть возможность выстрелить или подлечиться. Бой идет пошагово. Сначала идете вы, потом монстр. Причем пошаговость у монстров разная. На некоторых монстров можно стрелять 2, а то и три раза, на один их ход. Некоторые монстры бьют первыми, в других можно всадить пару пуль пока они не добежали. Управление осуществляется цифрами на клавиатуре. В встроке выбора указанна цифра.
Справка.
В окне персонажа можно повысить хар-ки за очки опыта. Шоб повысить нужно ввести обозначеную рядом цифру.
Сила- чем больше сила тем большее оружие можно использовать. Оружие покупается за деньги в магазине. Требование к силе равно цифре оружия.
Ловкость- влияет на вероятность попасть из оружия по противнику и нанести крит урон, а так же защиты от них. При атаке пси существ на ловкость налагается штраф(собака и контролёр, читают мысли и уворачиваются). Атака контролёра штрафует ловкость. Влияет на лечение.
Выносливость- повышает здоровье.
Интеллект - влияет на вероятность попасть из оружия по противнику и нанести крит урон, а так же защиты от них. При атаке пси существ НЕ налагается штраф(собака и контролёр). Атака контролёра уязвима к интеллекту. Влияет на лечение, НО налагается штраф при лечении.
Что бы выйти из магазина и экрана перса нажмите ЛЮБУЮ другую цифру.
После победы над каждым монстром вы получаете деньги и опыт. Во время боя вводить другие цифры кроме 1 и 2 , не рекомендую. Победой считается победы над контролёром.
Особо не ругайте, т.к. я 7 -классник и ток-ток изучать начал. Если найдете баги, ошибки, скажите. Заранее спасибо.
Вложения
Тип файла: rar rpg-test.rar (30.7 Кб, 101 просмотров)
Если помог, жми на весы слева
Gandfil вне форума Ответить с цитированием
Старый 25.08.2011, 13:54   #2
ivannes
Пользователь
 
Аватар для ivannes
 
Регистрация: 16.06.2011
Сообщений: 42
По умолчанию

не плохо сделано
Помог? тогда жми на весы
Девушка что оператор мобильной связи, когда денег нет, то она не доступна ©Радио Маяк
ivannes вне форума Ответить с цитированием
Старый 25.08.2011, 17:09   #3
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию

игру не смотрел, но ваш пост написан очень неплохо для семиклассника!
грамотно и без ошибок. респект уже за это =)
xrob вне форума Ответить с цитированием
Старый 26.08.2011, 08:35   #4
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Пожалуй, начну с игры : сделано очень неплохо (при взгляде на игропроцесс) довольно просто и изящно при этом. Учитываем начальный уровень - очень качественный, рациональный подход. Мелочи в орфографии : "ВыберИте" ; нестабильная пунктуация: кое-где есть "!" а где-то в сходных фразах - нет(кстати, для чего экспрессия вида "Предмет куплен!" ?), не подумайте что придирки, просто сразу чувствуется явное качество и старание при отсутствии подобного.

Малость поиграл - прикольно, но до конца не стал ) что хочется - наличие в "главном меню" справки (тоже отдельной цифрой, и показывать примерно такой текст как у Вас в посте), хочется вменяемого выхода из персонажа и магазина, припишите 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.
phomm вне форума Ответить с цитированием
Старый 26.08.2011, 10:26   #5
Gandfil
Пользователь
 
Регистрация: 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.
Gandfil вне форума Ответить с цитированием
Старый 26.08.2011, 11:02   #6
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Закономерные они потому что надо вызывать 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 : подумай, что поймёт человек читая вот это :
Код:
  r:= (l+s[4])-monster[3, bo];
  y:= s[6];
что значат цифры 3,4,6 да и переменные мягко говоря - r,s,l,y - не сказать что они конкретно могут значить - надо глянуть код в др. месте - а это время, потеря внимания... понимаешь ?

Вот кстати напишу тебе пример:
твой код:
Код:
procedure Expraspredel;
label 1, 2;
begin
1:
writeln (probel);
for i:=1 to 8 do
  writeln (opis[i], s[i]);
readln (m);
If m < 1 then
   goto 2;
If m > 4 then
   goto 2;
If s[7] < 1 then
   begin
   writeln (' У вас не хватает очков опыта');
   goto 1;
   end;
s[m]:= s[m]+1; s[7]:= s[7]-1;
If m = 3 then s[5]:= s[5]+5; zdorov:= s[5];
goto 1;
2:
end;
а вот как я бы его написал (объявлен enumerated тип Stat ) :
Код:
type 
Stat = (Ssila=1, Slovk=2, Stelo=3, Sintel=4, Shp=5, Suron=6, Sexp=7, Smoney=8);

procedure Expraspredel; {процедура распределения очков опыта}
var inputkey, i : byte;  // заведем локальные перем.
begin
repeat
  writeln (probel);                // вот эти 3 строки вообще бы вынес в процедуру распечатки менюшек, 
  for i:=1 to StatsCnt do       // типа printpersmenu, такая только для меню перса, или даже printmenu (persmenu), она
    writeln (opis[i], stats[i]);  // гонит цикл и по переданному menutype печатает нужные строки разных меню
  readln (inputkey);
  If inputkey in [Ssila..Sintel] // введённое число соответствует статам от силы до интеллекта ?
    then begin                     // если да
    If stats[Sexp] = 0           // то проверим опыт
      then begin
      writeln (' У вас не хватает очков опыта');   
      continue;              // если не хватает - цикл заново
      end;    
    dec(stats[Sexp]);      // уменьшим опыт
    inc(stats[inputkey])   // прибавим нужную стату
    If inputkey = Stelo    // если это телосложение
      then inc(stats[Shp], hpadd); // до в хиты добавим нужную прибавку, hpadd это const hpadd = 5;
    end;                     // тут был zdorov, я бы сделал локальной переменной при работе процедуры боя, и там указывал zdorov := stats[Shp];
Until inputkey = 0       // цикл идёт пока юзер не ввел "0" - о выходе по нажатию 0 нужно написать в менюшке просмотра перса
end;
ну как ? лучше читается и понимается ?

Про просмотр кода - это было к разговору о константах (конкретного смысла фраза вне контекста не имеет). Насчёт антуража - просто хотя бы "вы стреляете" или "вас кусают" чтобы некая последовательность происходящего была, а не ощущение , что просто кинут кубик. Ну и "разную скорость" можно обыграть - например при скорости моба меньше , чем игрока написать в промежутке ходов - "собака готовится к прыжку", а если быстрее, то в промежутке ходов монстра что-нибудь "Вы не успеваете опомниться и вас кусают снова".
Цветной текст - код в принципе никуда не распухнет:
Код:
procedure ColorWrite(text:string; color : integer {или что-то др., не знаю в консольке типа цвета})
begin
settextcolor(color);
writeln(text);
end;

//вызов :
colorwrite('Вы умерли', {идентификатор_красного_цвета, его я не знаю, был бы дельфи - написал бы clred });

Последний раз редактировалось phomm; 26.08.2011 в 12:17.
phomm вне форума Ответить с цитированием
Старый 26.08.2011, 12:47   #7
Gandfil
Пользователь
 
Регистрация: 17.08.2011
Сообщений: 17
По умолчанию

Мда....много мне учить... Операторы....Ну циклы и условия я вроде хорошо знаю.
Код:
    dec(stats[Sexp]);      // уменьшим опыт
    inc(stats[inputkey])   // прибавим нужную стату
Это операторы сложения и вычитания? Я тут почитал в справочнике , что это процедура, которую нужно обьявлять, а что нужно прям ее алгоритм записывать?
Если нужно могу таблицу цифр и цветов скинуть у меня учебник паскаля есть рядом, ток школьный.
То есть после begin надо поставить randomize? и все нормик будет? Просто мне кажется что промахи, криты и попадания какие-то....цикличные.....Кажется будто они чередуются по какому-то циклу.
Еще вопросы : ты наверное заметил что процедуры расположенны "матрешкой", у меня почему то по другому процедуры друг от друга не вызываются. Пишет что не обьявленны. Это нормик? Или есть какой-то способ решения? И еще:
Код:
if bo = 1 then
        if l < 3 then l:=0
        else l:= l-3
else l:= s[2];
if bo = 5 then
        if l < 3 then l:=0
        else l:= l-3
Как обьединить их? Через "or" не получается.
Как сделать так что бы условия победы и поражения проверялись постоянно и автоматически?
Я до этого модифицировал "Сталкер" Через блокнот на языке С++))))))После этого уже ниче не страшно....
Если помог, жми на весы слева

Последний раз редактировалось Gandfil; 26.08.2011 в 13:03.
Gandfil вне форума Ответить с цитированием
Старый 26.08.2011, 15:57   #8
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Учить, да думаю, ещё много, но "дорогу осилит идущий" ! и кстати циклы, мне кажется тебе надо ещё вникнуть, недостаточна "вжились" они в тебя, а то с goto кое-где сделано у тебя , где надо было бы цикл, см мой пример хотя бы.

inc и dec - это стандартные процедуры, я точно не знаю в каком они модуле, смотреть надо, наверное в system или sysutils, их не надо никак объявлять, просто ипользуется.
ты же в дельфи пишешь - пользуйся справкой,там это всё описано, и другого очень много.
Да, после главного (программного ) begin ставь randomize, все непонятки со случайными числами исчезнут.
Чтобы объявлять процедуры/функции для вложения в другие процедуры, используй директиву forward после объявления процедуры, погугли delphibasics.ru насчет подобных вещей.
Через or не получается , случайно скобки не забыл ?? (bo=1) or (bo = 5) then
Насчет условий победы и поражения не знаю, надо смотреть код и понимать логику работы )) а времени особо сейчас нет )
Поработай пока над всем уже названным, там видно будет ))
phomm вне форума Ответить с цитированием
Старый 26.08.2011, 19:49   #9
Gandfil
Пользователь
 
Регистрация: 17.08.2011
Сообщений: 17
По умолчанию

А справка на английском - еле-еле разбираю. Ага, забыл. Ток вопрос: в твоем коде тип stat для ввода и повышения, а stats - сами характеристики? StatsCnt че значит?
И inputkey лучше взять глобальным, чтоб в разных процедурах использовать.
Если помог, жми на весы слева
Gandfil вне форума Ответить с цитированием
Старый 28.08.2011, 09:23   #10
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Да, Stat - это enum тип для обозначения конкретной характеристики, Stats - массив характеристик (объявление может быть таким Stats : array[low(Stat)..high(Stat)] of integer) StatsCnt - количество статов (константа, объявление - const StatsCnt = ord(high(Stat)) ; ), но можно и без неё, если в циклах сразу задавать
Код:
var StatIter : stat;
...
for StatIter := low(Stat) to high(Stat) do ...
тогда не надо заботиться нигде сколько у тебя статов и каких (как у тебя было до этого при меджик намберах) и т.п. - всё определяется только описанием типа Stat
Inputkey - как хочешь, можешь взять глобальным, но тогда ты должен обеспечить в логике программы запрет чтения из этой переменной раньше, чем получишь в неё данные (а то можешь не заметить и использовать лежащее ранее в ней значение, локальная переменная от этого тоже не застрахована, но для них хотя бы срабатывает рефлекс : объявил-> инициализируй)
phomm вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
РПГ игры на 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