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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.02.2008, 01:31   #1
[Smarik]
Веб-разработчик
Форумчанин
 
Аватар для [Smarik]
 
Регистрация: 16.01.2008
Сообщений: 451
По умолчанию Как высчитать опыт?

Делаю текстовую игру, сейчас попытаюсь максимально понятно обрисовать ситуацию =)
не могу продумать как автоматизировать процесс прибавления опыта требуемого для повышения следующего уровня =)
тоесть примерно так человек 1-ый уровень для 2-го уровня требуется 100 опыта, когда он получит 2-ой уровень ему для 3-го уровня потребуется 220 опыта (тобишь +120%) но как етот процесс автоматизировать?
Я ваш новый друг, смиритесь!
[Smarik] вне форума Ответить с цитированием
Старый 19.02.2008, 01:54   #2
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Чтобы не плодить множество условий можно, например, воспользоваться логарифмом (или, наоборот, какой-нибудь показательной функцией), смотря по конкретной задаче. Ну, или просто, держать для каждого объекта свою переменную "НадоДляПереходаНаСледующийУров ень" и при увеличении уровня умножать ее на Ваши 120%, т.е. на 1.2
B_N вне форума Ответить с цитированием
Старый 19.02.2008, 02:23   #3
[Smarik]
Веб-разработчик
Форумчанин
 
Аватар для [Smarik]
 
Регистрация: 16.01.2008
Сообщений: 451
По умолчанию

я так и сделал последним способом, но там куча других ошибок, наверное лучше посмотрите исходники
Код:
uses crt,graph;
var
name,surname,rassa,status:string;
level,exp,nextlvl,nextexp:integer;
GrDr,GrMd,Error:integer;
{name - имя героя, surname - фамилия, rassa - рассовая принадлежность,
status - статус зависящий от действий в игре, level - уровень героя, exp - опыт героя,
nextexp - когда следующий уровень, nextlvl - содержит данные сколько опыта требует следующий уровень}
begin
GrDr:=Detect;
InitGraph(GrDr,GrMd,'c:\bp\bin');
Error:=GraphResult;
if Error<>grOk then
begin
writeln(GraphErrorMSG(error));
Halt;
end;
SetTextStyle(4,0,7);
OutTextXY(50,130,'DUNE');
SetTextStyle(4,0,4);
OutTextXY(130,200,'Восстание');
readkey;
closegraph;
clrscr;
textcolor(red);
writeln('[menu]');
textcolor(green);
write('Введите имя: ');
readln(name);
write('Введите фамилию: ');
readln(surname);
clrscr;
textcolor(red);
writeln('[menu]');
textcolor(green);
rassa:='Человек';
status:='Нейтральный';
level:=0;
exp:=0;
nextlvl:=100;
if exp>=nextlvl then level:=level+1;
if exp>=nextlvl then nextlvl:=nextlvl+200;
writeln('Имя: ',name);
writeln('Фамилия: ',surname);
writeln('Расса: ',rassa);
writeln('Статус: ',status);
writeln('Уровень: ',level);
writeln('Опыт: ',exp);
writeln('До: ',level+1,' уровня ',nextlvl-exp, ' опыта');
readkey;
end.
если изначально exp присвоить 101 например...он нормально напишет вы 1 уровень и до 2 уровня осталось 199 опыта... но если написать например 10000 он ответит вы 2 уровень до 3 уровня осталось -7462 (ет к примеру) сейчас понять не могу как исправить.
Я ваш новый друг, смиритесь!

Последний раз редактировалось [Smarik]; 19.02.2008 в 02:28.
[Smarik] вне форума Ответить с цитированием
Старый 19.02.2008, 03:22   #4
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Честно говоря, не совсем понял, откуда всплывает 1000, но пишет оно, как Вы и просите: "level+1", "nextlvl-exp", чему тут удивляться? Предлагаю рассмотреть вот такой вариант:
Код:
type HeroRec = record
	Name					: string;
	SurName					: string;
	Race					: integer;
	Status					: string;		{ ????? }
	CurrentLevel			: cardinal;
	PromoteLevelMultiplier	: real;
	NextLevelExperience		: cardinal;
	CurrentExperience		: cardinal;
end;

procedure InitHero(var Hero : HeroRec);
begin
	Hero.Name					:= '???????';
	Hero.SurName				:= '???????';
	Hero.Race					:= 0;			{ ????? }
	Hero.Status					:= '???????';	{ ????? }

	Hero.PromoteLevelMultiplier	:= 1;
	Hero.NextLevelExperience	:= 100;
	Hero.CurrentExperience		:= 0;
	Hero.CurrentLevel			:= 1;
end;

procedure AddExperience(ExpToAdd : cardinal; var Hero : HeroRec);
begin
	while ExpToAdd > 0 do begin
		if ExpToAdd  + Hero.CurrentExperience > Hero.NextLevelExperience then begin
			ExpToAdd := ExpToAdd - (Hero.NextLevelExperience - Hero.CurrentExperience);
			Hero.CurrentExperience := Hero.NextLevelExperience;
			Hero.CurrentLevel := Hero.CurrentLevel + 1;
			PromoteLevelMultiplier := PromoteLevelMultiplier * 1.2;
			Hero.NextLevelExperience := Hero.NextLevelExperience + Hero.NextLevelExperience * PromoteLevelMultiplier;
{Здесь может быть какая-то другая формула нужна}
		end
		else begin
			Hero.CurrentExperience := Hero.CurrentExperience + ExpToAdd;
			ExpToAdd := 0;
		end;
	end;
end;
Проверьте, не напутал ли я чего, писал на ходу. Зато теперь, чтобы добавить опыта и автоматически провести все остальные действия достаточно вызвать AddExperience, а чтобы узнать, сколько до следующего уровня надо просто вычесть
Код:
Hero.NextLevelExperience - Hero.CurrentExperience
. Или я неправильно понял проблему?

Последний раз редактировалось B_N; 19.02.2008 в 04:02. Причина: Местами напутал-таки :)
B_N вне форума Ответить с цитированием
Старый 20.02.2008, 10:52   #5
[Smarik]
Веб-разработчик
Форумчанин
 
Аватар для [Smarik]
 
Регистрация: 16.01.2008
Сообщений: 451
По умолчанию

B_N ну у тебя пол задачи на делфи написано =) ладно вобщем, там возник ряд других проблем более сложных, буду пока ими заниматься.
Я ваш новый друг, смиритесь!
[Smarik] вне форума Ответить с цитированием
Старый 22.02.2008, 22:34   #6
nikleb
Форумчанин
 
Регистрация: 04.04.2007
Сообщений: 131
По умолчанию

Возможно проблема в том что тип переменных integer, поставь лучше real. А выводи так writeln(round(a));
Хотя нет, сам посчитай:
level:=0;
exp:=10000;
nextlvl:=100;
if exp>=nextlvl then level:=level+1; {10000>100 ==> level:=0+1 }
if exp>=nextlvl then nextlvl:=nextlvl+200; {10000>100 ==> nextlvl:=100+200=300}

writeln('Уровень: ',level); {Выводит 1}
writeln('Опыт: ',exp); {выводит 10000}
writeln('До: ',level+1,' уровня ',nextlvl-exp, ' опыта'); {выводит До: 2 уровня {300-10000} -9700 опыта}

И кстати пример выше от B_N написан на паскале , это записи называеться

Последний раз редактировалось nikleb; 22.02.2008 в 22:55.
nikleb вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Джентльмены, помогите, пжлст. каким оператором высчитать корень 5-ой степени числа? Osi@ Помощь студентам 32 03.10.2007 19:52