Prevod ot Paskal kam Delfi
Здравейте,
един приятел ми препоръча този форум да получа малко помощ. Написал съм един алгоритам за калкулация на битки от една онлайн игра ... на Паскал (разбира се кода си има проблеми) ... може ли някой да преведе кода на Делфи в по-добър вид?
Тази програмка е малко предизвикателство за мен, защото се опитвам да накарам компютъра да прекара 999 на степен 6 цикала с сметки и да изкара минимална стойност, един вид античен начин да изкарам минимум и максимум на сложна функция. Но как ще се отрази това на сметките, нямам идея. Един калкулатор на време да доварши сметките би бил от полза кам този калкулатор, че задачата за компа не е лесна :)
Ако някой прояви желание да го направи, ще съм му много благодарен ...
Филип
Re: Prevod ot Paskal kam Delfi
просто ползвай "copy-paste" в делфито и пробвай да компилираш ....
после - само оправяш синтактичните грешки и voila :)
Re: Prevod ot Paskal kam Delfi
Драги neverman,
999 на степен 6 е едно меко казано големичко число,а именно (10 на 18) - 1.
Лично аз като знам че (10 на 9) цъкъла с извикване на празна функция се смята на semptron 2300+ за около 6 секунди бих се изненадал въпросната програма със (999 на ст 6) цикъла да се изпълни в обозримо време(спред мен при тази скорост ще се смята около 190,258751903 години :) ).
Мисля че е добра идея още веднъж да се погледне какво точно прави кода на deplphi.
Цитат:
Първоначално публикувано от Zaphod B
просто ползвай "copy-paste" в делфито и пробвай да компилираш ....
после - само оправяш синтактичните грешки и voila :)
А това просто няма да го коментирам ...
Re: Prevod ot Paskal kam Delfi
Кажи каква е горе-долу задачата, за да оптимизираме първо самия алгоритъм.
Re: Prevod ot Paskal kam Delfi
Цитат:
Първоначално публикувано от klamer
А това просто няма да го коментирам ...
аз нямам решение, но поне давам насока...
ако си спец :
- go, go !
:)
Re: Prevod ot Paskal kam Delfi
играта е Ферион (Ferion.com), където България има сериозно присъствие :)
задачата е, да се намери оптимален дизайн на боен космически кораб (или флота), при определено ниво на развити технологии - отделно се развиват двигатели, щит, оръжие, ремонт (repair).
целта - флотата да стане по-силна от противниковата.
тъй като цената и издръжката са определящи, не може просто да се трупа неограничено количество флота ;)
п.с. Филип е от Варна, може да посети следващата сбирка, надявам се и аз :)
Re: Prevod ot Paskal kam Delfi
Нещо ми се губи все още модела на задачата, но ми звучи като стандартен проблем от Математическо оптимиране.
Искам да кажа, че съм почти сигурна, че методът на пълното изчерпване е излишен в случая!
Потърсете сорсове, реализиращи т.нар. задача MiniMax, подозирам, че това ще ви свърши работа (минимум пари и максимум ефективност).
Re: Prevod ot Paskal kam Delfi
ще се опитам да обясня по-подробно задачата и ще гледам да ви дам линк към кода на програмката.
В играта има 3 вида бойни единици: малки кораби (до 10 К унитс), големи кораби (над 10 унитс) и планети (сграда на планета представляваща планетарна защита).
Против всеки вид единица има оражия (лазери против малки кораби, фазери, против големи кораби и бомби, против планети), всяка единица си има като характеристика и щит, унитс (демек колко е голяма бойната единица), респективно цена на кораба (малките са по-евтини, но по-неефективни, големите по-скъпи).
един прост дизайн на кораб е горе долу това лазер/фазер/бомби-щит-унитс .. или пример 0/1500/0-200-9716 ... малак кораб.
така, формулата за смятане на битките е направена като процедура, защото е много сложна, да не се повтаря. Дал съм като отделни процедури възможни варианти на дизайни на кораби и планети.
Ето и примерна ситуация която трябва да смята програмата:
имаме вражеска флота с сила 10 000/15 000/50 000-80 000-1 800 000 направена само от големи кораби. Аз искам да направя флота за да спра дадената с съотношение на сила минимум 2:1 за мен. Задачата на програмата е да ми изкара правилно съотношение на малки и големи кораби, така че да мога да спра тази флота с това съотношение, както и да е най-евтиния вариант. Програмата е направена да смята 2 вида битки, битка в защита на планета (включваща планетарна защита - голям бонус в много случаи) и директна атака по вражеската флота, т.е. без планета.
Алгоритама въобще не е елементарен да се създаде ... но програмно, паскала не иска да ми подкара 6 вложени цикала до 999. Подкарва само 6 вложени цикала до 50. За улеснение съм направил това число 999 да е избираемо от потребитела за да се намали времето на смятане.
Име 3 основни причини да искам това под Делфи:
- графичния изглед за въвеждане на данни;
- невъзможността да подкарам 6 вложени цикала над 50;
- възможност за процедура която да пресмята остатъка от време за сметки на дадената ситуация.
След последната поправка на кода, имам и проблеми с правилния препис на процедурите, за което също бил приел помощ ... позабравил съм ги и не съм убеден че е възможен вариант на вложени процедури.
давам ви линк към кода, дано имате достъп:
http://ferion-bg.hit.bg/optimizator-v1.1.pas
Ако Ви трябват пояснения на кода, само кажете.
Благодаря предварително за отзивчивостта,
Филип
Re: Prevod ot Paskal kam Delfi
алгоритъмът си е чисто линейно програмиране мен ако питаш, никакви цикли не ти трябват.
Re: Prevod ot Paskal kam Delfi
Цитат:
Първоначално публикувано от neverman
Име 3 основни причини да искам това под Делфи:
- графичния изглед за въвеждане на данни;
- невъзможността да подкарам 6 вложени цикала над 50;
- възможност за процедура която да пресмята остатъка от време за сметки на дадената ситуация.
- относно графичния изглед съм съгласен
- не ми се вярва и Delphi да се справи (причините ги написах вече)
- а това не го рабрах за съжаление
Цитат:
Първоначално публикувано от neverman
По кода имам два въпроса :
1. Това за какъв компилатор е (защото под fpc не се компилира по ред причини)
2. къде е обявена променливата Battle и какъв тип е ?
Re: Prevod ot Paskal kam Delfi
под fpc се опитвах да го компилирам.
относно battle,имаш право, тип integer ... тази променлива получава стойност само от 1 до 4.
Третото нещо което съм обяснил лошо, това е нуждата от таймер, който да показва оставащо време до приключване на сметките и до даване на крайния резултат. Нямам идея как да направя такава добавка.
Re: Prevod ot Paskal kam Delfi
Цитат:
Първоначално публикувано от neverman
Третото нещо което съм обяснил лошо, това е нуждата от таймер, който да показва оставащо време до приключване на сметките и до даване на крайния резултат. Нямам идея как да направя такава добавка.
Например нещо от рода на:
Код:
var
TotalIterations: integer;
CurrentIteration: integer;
StartTime: TDateTime;
TotalTimeEstimated: TDateTime;
TimeLeftEstimated: TDateTime;
begin
....
StartTime:=Now;
CurrentIteration:=0;
for.... begin
...
//следващото е по-добре да се прави от време на време - например през няколко цикъла или през известно време
// например: if CurrentIteration mod 100 = 0 then...
// или: if Now-LastCheckTime > 1/SecsPerDay then... ... LastCheckTime:=Now....
if CurrentIteration/TotalIterations>0.01 then begin
TotalTimeEstimated:= (Now-StartTime)*TotalIterations/CurrentIterration;
TimeLeftEstimated:=TotalTimeEstimated-(Now-StartTime);
DisplayTimes...
end;
Inc(CurrentIteration);
...
end;
end;
Но ако искаш да може програмата да се "движи" все пак (т.е. да се опреснява екрана и ползващият я да може да я прекъсне, е по-добре цялата ти сметка да се извършва в отделна нишка, а показването на време, таймери и др. подобни да става в основната нишка на програмата, където разбира се сметките могат и да се прекъснат.
Re: Prevod ot Paskal kam Delfi
Предполага, че недописаният FOR е цикала който ще минава със сметки (или вложените цикли със сметки) ?