Форум города Чаусы и Чаусского района

Здравствуйте, Гость ( Вход | Регистрация | Правила форума )



Сэкренский программинг

   
  > Сэкренский программинг : мои потуги, На коленке Лабс. Ко. Лтд.))    
Поиск в теме | Версия для печати
Sacren
> 8 февраля 2009 — 01:30
  [Id]
Модератор


Заслуженный рифмоплёт нашего Форума

Покинул форум
Сообщений всего: 1289
Дата рег-ции: Дек. 2007  
Откуда: =System.City.Orsha
Репутация: 23



Поскольку с некоторых пор я твёрдо и решительно перешёл с ковыряния на вижуал бейсике на ковыряние в Си плус плус и даже обзавёлся соответствующей печатной литературой, то здесь будут время от времени упиминаться и появляться как сами мои творения на программерской почве так и ссылки на них (когда листинги будут сильно большие).

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

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



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, поэтому теоретически должно работать и собранное под линухом. Ничего полезного оно не делает, но в следующей версии можно будет сражаться с простеньким АИ, и (мб, но не обещаю) попробую внедрить вместо/вместе со структурами классы и объекты. Данный пример использует структуры и функции(-ю).

-----

lastofavari.com | YouTube
top
Конституция Республики Беларусь:
"Статья 34. Гражданам Республики Беларусь гарантируется право на получение, хранение и распространение полной, достоверной и своевременной информации о деятельности государственных органов, общественных объединений, о политической, экономической, культурной и международной жизни, состоянии окружающей среды..."

Ray
> 9 февраля 2009 — 09:54
  [Id]
Пользователь


Форумчанин

Покинул форум
Сообщений всего: 259
Дата рег-ции: Окт. 2006  
Откуда: Belarus,Chausy
Репутация: 11



Если оно ничего не делает, зачем тогда нужно было приводить исходник?
Сражаться с простеньким АИ.. Из какой книжки пример будет, или свой придумаешь?

По-моему,return EXIT_SUCCESS'у лучше предпочесть return 0.

-----
We don't know the days that will change our lives... Stephen King. Dreamcatcher.
top
Sacren
> 9 февраля 2009 — 18:40
  [Id]
Модератор


Заслуженный рифмоплёт нашего Форума

Покинул форум
Сообщений всего: 1289
Дата рег-ции: Дек. 2007  
Откуда: =System.City.Orsha
Репутация: 23



Дык, традиция же - helloworldы писать!

АИ замучу свой.

-----

lastofavari.com | YouTube
top
Sacren
> 11 февраля 2009 — 20:20
  [Id]
Модератор


Заслуженный рифмоплёт нашего Форума

Покинул форум
Сообщений всего: 1289
Дата рег-ции: Дек. 2007  
Откуда: =System.City.Orsha
Репутация: 23



есть такой код
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://(для просмотра ссылки Вам необходимо авторизоваться) также в архиве скомпилированный вариант

-----

lastofavari.com | YouTube
top
m00nk
> 12 февраля 2009 — 02:18
  [Id]
Администратор


Ко-админ. Жестокий, но справедливый.

Покинул форум
Сообщений всего: 2884
Дата рег-ции: Янв. 2006  
Откуда: туташний я
Репутация: 32



вот этот цикл бесконечен, т.к. условие будет выполняться всегда (ты же внутри цикла не изменяешь величины, участвующие в условии) Подмигивание

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


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

CODE:
int getPowerRating (player tPlayer)
{
int tPowerRating = tPlayer.HP + tPlayer.HitDamage + tPlayer.Armour;
};


-----

...ла-ла-ла-ла-ла...
top
Sacren
> 12 февраля 2009 — 17:40
  [Id]
Модератор


Заслуженный рифмоплёт нашего Форума

Покинул форум
Сообщений всего: 1289
Дата рег-ции: Дек. 2007  
Откуда: =System.City.Orsha
Репутация: 23



thanx!!! после работы что-то мозг совсем отказал - не увидеть такую очевидность это да(
И к тому же я вяснил ещё один промах в ф-ции generatePlayer у меня хватило ума забыть вставить проверку текущего уровня генерируемого игрока в каждом проходе цикла. в результате не проходил выход по условию и прога "висла". Попробую успеть к воскресенью написать версию, где уже моно будет что-то делать. Ибо обещал)

-----

lastofavari.com | YouTube
top
Sacren
> 13 февраля 2009 — 16:47
  [Id]
Модератор


Заслуженный рифмоплёт нашего Форума

Покинул форум
Сообщений всего: 1289
Дата рег-ции: Дек. 2007  
Откуда: =System.City.Orsha
Репутация: 23



опять сломал мозг((


используемые структуры
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;
};


-----

lastofavari.com | YouTube
top
m00nk
> 14 февраля 2009 — 03:05
  [Id]
Администратор


Ко-админ. Жестокий, но справедливый.

Покинул форум
Сообщений всего: 2884
Дата рег-ции: Янв. 2006  
Откуда: туташний я
Репутация: 32



 Sacren пишет:
опять сломал мозг((

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

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

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

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

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

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

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

ЗЫ
А что это за тип такой не стандартный?
CODE:
chars Skill;


-----

...ла-ла-ла-ла-ла...
top
Sacren
> 14 февраля 2009 — 11:51
  [Id]
Модератор


Заслуженный рифмоплёт нашего Форума

Покинул форум
Сообщений всего: 1289
Дата рег-ции: Дек. 2007  
Откуда: =System.City.Orsha
Репутация: 23



да я ж вроде комментарий в коде забил на глючном месте
вот тут
>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++ под винды)

за совет пасибки!!

-----

lastofavari.com | YouTube
top
Sacren
> 14 февраля 2009 — 14:16
  [Id]
Модератор


Заслуженный рифмоплёт нашего Форума

Покинул форум
Сообщений всего: 1289
Дата рег-ции: Дек. 2007  
Откуда: =System.City.Orsha
Репутация: 23



Наконец-то!!! 90ый билд завершился успехом! Оно работает!!! Ха-ха

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

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

-----

lastofavari.com | YouTube
top
« Наше творчество тут! »
> Похожие темы: Сэкренский программинг
Темы Форум Информация о теме Обновление
Любительские фотографии
или потуги фоточайника :)
Наше творчество тут! Ответов: 89
Автор темы: Gane4ka
7 апреля 2015 — 01:49
Автор: Sacren
Сэкренский программинг
Продолжение темы моего программинга
Наше творчество тут! Ответов: 94
Автор темы: Admin
8 мая 2014 — 00:22
Автор: Sacren
 

 
  |  Метки: 
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0)
Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.


RSS 23.08.2017 - 07:27
[Script Execution time: 0.152]     [ Gzipped ]