Форум города Чаусы и Чаусского района > Общение на форуме > Наше творчество тут! > Сэкренский программинг

Страниц (18)  1 2 3 4 5 6 7 8 9 ... » В конец
 

1. Sacren - 8 февраля 2009 — 01:30 - перейти к сообщению
Поскольку с некоторых пор я твёрдо и решительно перешёл с ковыряния на вижуал бейсике на ковыряние в Си плус плус и даже обзавёлся соответствующей печатной литературой, то здесь будут время от времени упиминаться и появляться как сами мои творения на программерской почве так и ссылки на них (когда листинги будут сильно большие).

Это я к тому, что креатив - не только литература и музыка. Мыслим ширше)

Итак, начинаем!



CODE:
#include <cstdlib>
#include <iostream>

using namespace std;

struct player
{
string Name;
int HP;
int HitPower;
int Armour;
int PowerRating;
};

void coutChars (player tPlayer)
{
cout << tPlayer.Name << "'s chars:" << endl;
cout << "HP " << tPlayer.HP << endl;
cout << "Damage " << tPlayer.HitPower << endl;
cout << "Armour " << tPlayer.Armour << endl;
cout << "Rating " << tPlayer.PowerRating << endl << endl;
};

int main(int argc, char *argv[])
{
player uPlayer = {"User player", 12, 4, 2, 0 };
player cPlayer = {"CPU controlled player", 10, 3, 3, 0};

uPlayer.PowerRating = uPlayer.HP + uPlayer.HitPower + uPlayer.Armour;
cPlayer.PowerRating = cPlayer.HP + cPlayer.HitPower + cPlayer.Armour;

cout << "A Game version 0.10 (C) MMIX Sacren" << endl << endl;

coutChars (uPlayer);
coutChars (cPlayer);

system("PAUSE");
return EXIT_SUCCESS;
}



Использовался компилятор minGW, поэтому теоретически должно работать и собранное под линухом. Ничего полезного оно не делает, но в следующей версии можно будет сражаться с простеньким АИ, и (мб, но не обещаю) попробую внедрить вместо/вместе со структурами классы и объекты. Данный пример использует структуры и функции(-ю).
2. Ray - 9 февраля 2009 — 09:54 - перейти к сообщению
Если оно ничего не делает, зачем тогда нужно было приводить исходник?
Сражаться с простеньким АИ.. Из какой книжки пример будет, или свой придумаешь?

По-моему,return EXIT_SUCCESS'у лучше предпочесть return 0.
3. Sacren - 9 февраля 2009 — 18:40 - перейти к сообщению
Дык, традиция же - helloworldы писать!

АИ замучу свой.
4. Sacren - 11 февраля 2009 — 20:20 - перейти к сообщению
есть такой код
CODE:

player generatePlayer (player tPlayer, int playerLvl)
//generate chars of a player with required PowerRating
//fails exit from inc (dec)
//ВОТ ЭТА ФУНКЦИЯ ВИСНЕТ((((

{
srand(rand());
tPlayer.HP = rand() % (playerLvl / 2);
tPlayer.HitDamage = rand() % (playerLvl / 2);
tPlayer.Armour = rand() % (playerLvl / 2);

int f = 0;
int tPowerRating = getPowerRating (tPlayer);
if (tPowerRating > playerLvl)
{
while (tPowerRating != playerLvl)
{
f++;
if (f==1) { tPlayer.HP--; }
if (f==2) { tPlayer.HitDamage--; }
if (f==3) { tPlayer.Armour--; }
if (f==3) { f=0; }
cout << "decreasing chars" << endl;//test of decreasing chars
cout << "f=" << f << " tPlayer.HP=" << tPlayer.HP << " tPlayer.HitDamage=" << tPlayer.HitDamage << " tPlayer.Armour=" << tPlayer.Armour << " tPowerRating=" << tPowerRating << "playerLvl" << playerLvl << endl;
}
}
if (tPowerRating < playerLvl)
{
while (tPowerRating != playerLvl)
{
f++;
if (f==1) { tPlayer.HP++; }
if (f==2) { tPlayer.HitDamage++; }
if (f==3) { tPlayer.Armour++; }
if (f==3) { f=0; }
cout << "increasing chars" << endl;//test of increasing chars
cout << "f=" << f << " tPlayer.HP=" << tPlayer.HP << " tPlayer.HitDamage=" << tPlayer.HitDamage << " tPlayer.Armour=" << tPlayer.Armour << " tPowerRating=" << tPowerRating << "playerLvl" << playerLvl << endl;
}
}

return tPlayer;
};

int getPowerRating (player tPlayer) //P.R. allows to define power of opponent
//эту функцию использует generatePlayer
{
int tPowerRating = tPlayer.HP + tPlayer.HitDamage + tPlayer.Armour;
};

///////////
//вот так она вызывается в main'е
while ((kbdRq=getche()) != 'q')
{
if (kbdRq == 'g')
{
generatePlayer (uPlayer, uPlayer.PowerRating);
coutStats (uPlayer);
}
cout << "Type \"g\" to generate character or \"q\" to quit - ";
}

функция generatePlayer по неизвестной мне причине виснет. Видимо, где-то в циклах, но я не понимаю почему. Она должна задавать переменные структуры, описывающей игрока следующим образом:
1. берём требуемый PowerRating и player
2. распределяем случайным образом основные характеристики (не более, чем половина от P.R.)
3. уравниваем по очереди параметры в большую или меньшую стороны так, чтобы их сумма равнялась P.R. (см. getPowerRating для подробностей)

Однако, как где-то в цикле while ф-ции generatePlayer я, видимо, туплю....
В силах ли кто-нибудь подсказать, где именно и что делать?...

Если требуется, полные исходники здесь -
h_tt_p://(для просмотра ссылки Вам необходимо авторизоваться) также в архиве скомпилированный вариант
5. m00nk - 12 февраля 2009 — 02:18 - перейти к сообщению
вот этот цикл бесконечен, т.к. условие будет выполняться всегда (ты же внутри цикла не изменяешь величины, участвующие в условии) Подмигивание

CODE:
while (tPowerRating != playerLvl)
{
f++;
if (f==1) { tPlayer.HP--; }
...
}


далее, вот на это компилятор должен ругаться матом - отсутствует возврат значения (команда return)

CODE:
int getPowerRating (player tPlayer)
{
int tPowerRating = tPlayer.HP + tPlayer.HitDamage + tPlayer.Armour;
};
6. Sacren - 12 февраля 2009 — 17:40 - перейти к сообщению
thanx!!! после работы что-то мозг совсем отказал - не увидеть такую очевидность это да(
И к тому же я вяснил ещё один промах в ф-ции generatePlayer у меня хватило ума забыть вставить проверку текущего уровня генерируемого игрока в каждом проходе цикла. в результате не проходил выход по условию и прога "висла". Попробую успеть к воскресенью написать версию, где уже моно будет что-то делать. Ибо обещал)
7. Sacren - 13 февраля 2009 — 16:47 - перейти к сообщению
опять сломал мозг((


используемые структуры
CODE:

struct chars
{
int Strength;
int Agility;
int Intellect;
};

struct player
{
string Name;
chars Skill;
int HP;
int HitDamage;
int Armour;
int PowerRating;
int Experience;
int Gold;
};

глючная функция
CODE:

///////////////////////////////////////////////////////
int inflictDamage (player tAttacker, player tDefender)
{
int tDefArmour = tDefender.Armour;
if (tDefArmour == 0) { tDefArmour = 1; }

float NonBlockedDamage = 0.0;
float taPlayerHit = 0.0;

NonBlockedDamage = tDefender.HP / tDefArmour;////<<<<<< bug here
//опытным путём выяснено, что если tDefender.HP < tDefArmour (результат больше 0
//меньше 1), то NonBlockedDamage даром что он float становится 0. А не 0.6 к примеру.
//И на выходе получается нулевой урон.

taPlayerHit = tAttacker.HitDamage * NonBlockedDamage;

if ((taPlayerHit < 1.0) && (taPlayerHit > 0.0)) { taPlayerHit = 1.0; }

int itaPlayerHit = static_cast<int>(taPlayerHit);

cout << "[!] " << tAttacker.Name << " strikes " << tDefender.Name << " (physical damage " << itaPlayerHit << " HP)" << endl;
///////// [debug info]
cout << "[#] ORIGINAL DAMAGE IS " << taPlayerHit << endl;
cout << "[#] NON-BLOCKED DAMAGE IS " << NonBlockedDamage << endl;
cout << "[#] inst N-B DAMAGE is " << (tdPlayer.HP / tdPArmour) << endl;
cout << "[#] DEF.ARMOUR is " << tdPArmour << " | DEF.HP is " << tDefender.HP << endl;
cout << "[#] ATK.DAMAGE is " << tAttacker.HitDamage << endl;
///////// [/debug info]

return itaPlayerHit;
};
8. m00nk - 14 февраля 2009 — 03:05 - перейти к сообщению
 Sacren пишет:
опять сломал мозг((

теперь хочешь, чтоб и мы сломали? Подмигивание
 Sacren пишет:
глючная функция

ну, блин! А описать, что именно глючит уже влом? Совсем пообленели.... Хм

Если ты про это:
CODE:
NonBlockedDamage = tDefender.HP / tDefArmour;

то сделай, например так:
CODE:
NonBlockedDamage = (float)tDefender.HP / tDefArmour;

тут поведение сильно зависит от компилятора и его режима оптимизации.

В моей практике бывали случаи, когда отлично работающая в debug-mode программа, творила фолты пачками после компиляции в release... Подмигивание

Кстати, а не проще в структурах использовать сразу float'ы? Кому память экономить пытаешься? Сейчас на дворе уже не 1992 - памяти у всех выше крыши, так что не жадничай! Подмигивание

ЗЫ
А что это за тип такой не стандартный?
CODE:
chars Skill;
9. Sacren - 14 февраля 2009 — 11:51 - перейти к сообщению
да я ж вроде комментарий в коде забил на глючном месте
вот тут
>NonBlockedDamage = tDefender.HP / tDefArmour;////<<<<<< bug here
>//опытным путём выяснено, что если tDefender.HP < tDefArmour (результат больше 0
>//меньше 1), то NonBlockedDamage даром что он float становится 0. А не 0.6 к примеру.
>//И на выходе получается нулевой урон.

Как сказали мне на одном другом форуме, надо tDefArmour сделать float'ом изначально. Я полагал что float = float / int конечно даст результат типа float, тем более что он прописывается именно в такую переменную.
А компилятор у меня minGW (GNU C++ под винды)

за совет пасибки!!
10. Sacren - 14 февраля 2009 — 14:16 - перейти к сообщению
Наконец-то!!! 90ый билд завершился успехом! Оно работает!!! Ха-ха

Размер 136 кб. Желающим качать отсюда:
h_tt_p://(для просмотра ссылки Вам необходимо авторизоваться)
0.2.1.90 )

что хочу внедрить как-нибудь потом:
* скиллы
* магию
* предметы (броня, оружие, напитки, и т.п.)


[Script Execution time: 0.011]     [ Gzipped ]