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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.05.2011, 16:55   #1
БалаШагаЛ
Форумчанин
 
Регистрация: 11.02.2011
Сообщений: 131
По умолчанию Массивы обьектов

Задача:
Создать текстовую игру, в которой принимают участие пользователь и определённое количество ботов. Количество ботов задаётся в программе пользователем. При выстреле во врага у него должно отниматься случайное число от 1 до (атака*дальность)/(расстояние до врага*защита врага) жизни. У соседних с ним врагов должно отниматься от 1 до (атака*дальность)/(расстояние до врага*защита врага*5).
Уже при реализации этой функции возникли проблемы, хотя всё вроде бы несложно.
Вот файл объявления класса:
Код:
class Vrag
{
    public:
      Vrag () {ukr=0;smert=0;zhisn=100;ataka=1;zazhita=1;dalnost=1;}
      ~Vrag() {}
      float zhisn;
      float ataka;
      float zazhita;
      float dalnost;
      float ukr;
      int smert;
      void Ataka(int atVar);
      void Zazhita(int zaVar);
      void Granage(int grVar);
      void Iscel(int isVar);
      void PolZ(int poVar);
};

void Vrag::Ataka(int atVar)
{
    int at1=(ataka*l)/(dalnost*gerZazh);
    if (gerZh-at1<0)
    {
        at1=gerZh;
    }
    at1=rand()%at1+1;
    gerZh-=at1;
    if (gerZh<0)
    {
        gerZh=0;
    }
    std::cout << "Vrag #" << atVar << " vistrelil v vas i otn'yal " << at1 << "% zhizni.\n";
    std::cout << "U vas ostalos' " << gerZh << "% zhizni.\n";
    std::cout << "U vraga ostalos' " << zhisn << "% zhisni.\n";
    ukr=0;
}

void Vrag::Zazhita(int zaVar)
{
  if (ukr==0)
  {
    int za1=(gerAt*l)/(gerDal*zazhita);
    if (zhisn-za1<0)
    {
        za1=zhisn;
    }
    za1=rand()%za1+1;
    zhisn-=za1;
    if (zhisn<0)
    {
        zhisn=0;
    }
    ukr=1;
    std::cout << "Vrag #" << zaVar << " poteryal " << za1 << "% ot vashego vistrela.\n";
    if (zhisn!=0)
      std::cout << "U nego ostalos' " << zhisn << "% zhisni";
    else
      std::cout << "On m'ortv.\n";
      smert=1;
  }
  else
  {
    std::cout << "Vrag #" << zaVar << " sidit v ukritie. Vam ne udalos' popast' v nego.\n";
    std::cout << "U nego " << zhisn << "% zhisni.\n";
  }
}

void Vrag::Granage(int grVar)
{
    if (ukr=0)
    {
        gerAt=rand()%50+1;
    }
    else
    {
        gerAt=rand()%25+1;
    }
    if (zhisn-gerAt<0)
    {
        gerAt=zhisn;
    }
    zhisn-=gerAt;
    std::cout << "Vrag #" << grVar << " poteryal " << gerAt << "% ot vashei granati.\n";
    std::cout << "U nego ostalos' " << zhisn << "% zhisni.\n";
    ukr=1;
}

void Vrag::Iscel(int isVar)
{
    if (zhisn<95)
    {
        int isc;
        isc=rand()%5+1;
        zhisn+=isc;
        std::cout << "Vrag #" << isVar << " popolnil zhisn na " << isc << "%.\n";
        std::cout << "Teper' u nego " << zhisn << "% zhisni.\n";
    }
    if ((zhisn>=95)&&(zhisn!=100))
    {
        zhisn=100;
        std::cout << "Vrag #" << isVar << " polnost'yu vospolnil svoiy zhisn'.\n";
        std::cout << "Teper' u nego " << zhisn << "% zhisni.\n";
    }
    if (zhisn==100)
    {
        std::cout << "Vrag #" << isVar << " ne nuzhdaetsya v iscelenii.\n";
        std::cout << "U nego " << zhisn << " zhisni.\n";
    }
    ukr=0;
}

void Vrag::PolZ(int poVar)
{
  if (ukr!=1)
  {
    int za1=(gerAt*l)/(gerDal*zazhita);
    za1-=15;
    if (zhisn-za1<0)
    {
        za1=zhisn;
    }
    if (za1<0)
    {
        za1=0;
    }
    za1=rand()%za1+1;
    zhisn-=za1;
    if (zhisn<0)
    {
        zhisn=0;
    }
    std::cout << "Vrag #" << poVar << " poteryal " << za1 << "% ot vashego vistrela.\n";
    if (zhisn!=0)
      std::cout << "U nego ostalos' " << zhisn << "% zhisni";
    else
      std::cout << "On m'ortv.\n";
      smert=1;
  }
  else
  {
    std::cout << "Vrag #" << poVar << " sidit v ukritie. Vam ne udalos' popast' v nego.\n";
    std::cout << "U nego " << zhisn << "% zhisni.\n";
  }
}

Последний раз редактировалось БалаШагаЛ; 07.05.2011 в 12:37.
БалаШагаЛ вне форума Ответить с цитированием
Старый 06.05.2011, 16:56   #2
БалаШагаЛ
Форумчанин
 
Регистрация: 11.02.2011
Сообщений: 131
По умолчанию

Это файл "Массивы обьектов.hpp", который вставляется в основной код (проблемы только в нескольких строках, они выделены ниже):
Код:
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

int gerZh=100,l=10,gerAt=0,gerDal=0,gerZazh=0;

#include "Массивы обьектов.hpp"

int main()
{
    srand(time(NULL)*311);
    int kolgr=3;
    int oru;
    int bronya;
    int deis;
    std::cout << "NASTROIKI PERSONAZHA\n";
    std::cout << "Viberete oruzhie:\n";
    std::cout << "1) Pistolet - Yron 40  Dalnost 7\n";
    std::cout << "2) Avtomat  - Yron 35  Dalnost 8\n";
    std::cout << "3) Drobovik - Yron 50  Dalnost 5\n";
    std::cin >> oru;
    if (oru==1)
    {
        gerAt=40;
        gerDal=7;
    }
    if (oru==2)
    {
        gerAt=35;
        gerDal=8;
    }
    if (oru==3)
    {
        gerAt=50;
        gerDal=5;
    }
    std::cout << "\n";
    std::cout << "Kakaya bronya?\n";
    std::cout << "1) Prosteishaya - Zazhita 15  Dalnost' neizmenna\n";
    std::cout << "2) L'ogkaya     - Zazhita 30  Dalnost -1\n";
    std::cout << "3) Srednyaya    - Zazhita 40  Dalnost -2\n";
    std::cout << "4) Tyazhelaya   - Zazhita 60  Dalnost -4\n";
    std::cin >> bronya;
    if (bronya==1)
    {
        gerZazh=15;
    }
    if (bronya==2)
    {
        gerZazh=30;
        gerDal-=1;
    }
    if (bronya==3)
    {
        gerZazh=40;
        gerDal-=2;
    }
    if (bronya==4)
    {
        gerZazh=60;
        gerDal-=4;
    }
    std::cout << "\n\nVASHI POKAZATELI:\n";
    std::cout << "Ataka\t\t" << gerAt << "\n";
    std::cout << "Zazhita\t\t" << gerZazh << "\n";
    std::cout << "Dalnost\t\t" << gerDal << "\n";
    std::cout << "\n\n\n";
    int kolvo;
    std::cout << "Skol'ko vragov?\n";
    std::cin >> kolvo;
    Vrag vr[kolvo];
    for (int a=0;a<kolvo;a++)
    {
        vr[a].ataka=rand()%3+1;
        if (vr[a].ataka==1)
        {
            vr[a].ataka=40;
            vr[a].dalnost=7;
        }
        if (vr[a].ataka==2)
        {
            vr[a].ataka=35;
            vr[a].dalnost=8;
        }
        if (vr[a].ataka==3)
        {
            vr[a].ataka=50;
            vr[a].dalnost=5;
        }
    }
    for (int a=0;a<kolvo;a++)
    {
        vr[a].zazhita=rand()%4+1;
        if (vr[a].zazhita==1)
        {
            vr[a].zazhita=15;
        }
        if (vr[a].zazhita==2)
        {
            vr[a].zazhita=30;
            vr[a].dalnost-=1;
        }
        if (vr[a].zazhita==3)
        {
            vr[a].zazhita=40;
            vr[a].dalnost-=2;
        }
        if (vr[a].zazhita==4)
        {
            vr[a].zazhita=60;
            vr[a].dalnost-=4;
        }
    }
    int raund=1;
    int zhertva;
    while(1)
    {
        std::cout << "\n\n\nRAUND " << raund << "\n\n";
        std::cout << "Viberete deistvie:\n";
        std::cout << "1) Vistrelit' vo vraga\n";
        std::cout << "2) Brosit' granatu (ostalos' " << kolgr << ")\n";
        std::cout << "3) Podoiti na metr\n";
        std::cout << "4) Otoiti na metr\n";
        std::cout << "5) Spryatat'sya\n";
        std::cin >> deis;
        if (deis==1)
        {
            std::cout << "V kakogo vraga vi budete strelyat'?\n";
            std::cin >> zhertva;
            std::cout << "\n\n\n";
            for (int a=0;a<kolvo;a++)
            {
                if (vr[a].smert==0)
                {
                    if (a==zhertva)
                    {
                        vr[a].Zazhita(a+1);
                        std::cout << "\n";
                    }
                    if ((a+1==zhertva)||(a-1==zhertva))
                    {
                        vr[a].PolZ(a+1);
                        std::cout << "\n";
                    }
                    if ((a!=zhertva)&&(a-1!=zhertva)&&(a+1!=zhertva))
                    {
                        vr[a].Ataka(a+1);
                        std::cout << "\n";
                    }
                }
            }
        }
    }
    return 0;
}

Последний раз редактировалось БалаШагаЛ; 07.05.2011 в 12:36.
БалаШагаЛ вне форума Ответить с цитированием
Старый 06.05.2011, 16:56   #3
БалаШагаЛ
Форумчанин
 
Регистрация: 11.02.2011
Сообщений: 131
По умолчанию

Вобщем-то весь код работает нормально, но проблемы возникают на участке
Код:
            for (int a=0;a<kolvo;a++)
            {
                if (vr[a].smert==0)
                {
                    if (a==zhertva)
                    {
                        vr[a].Zazhita(a+1);
                        std::cout << "\n";
                    }
                    if ((a+1==zhertva)||(a-1==zhertva))
                    {
                        vr[a].PolZ(a+1);
                        std::cout << "\n";
                    }
                    if ((a!=zhertva)&&(a-1!=zhertva)&&(a+1!=zhertva))
                    {
                        vr[a].Ataka(a+1);
                        std::cout << "\n";
                    }
                }
            }
Когда переменная a доходит до значения zhertva программа завершает работу. Более того, когда a=zhertva-1 программа не проводит атаку врага, хотя должна.
Сделано в Code::Blocks.

Последний раз редактировалось БалаШагаЛ; 07.05.2011 в 12:36.
БалаШагаЛ вне форума Ответить с цитированием
Старый 06.05.2011, 17:23   #4
Mandrivnyk
Software Developer
Участник клуба
 
Аватар для Mandrivnyk
 
Регистрация: 01.03.2011
Сообщений: 1,098
По умолчанию

Не сочти за труд -- оформи правильно код. Он нечитабелен.
Для этого используется не (QUOTE), а (CODE) -- кнопочка с решеткой.
Болтовня ничего не стоит. Покажите мне код. (c) Linus Torvalds
Помог ответ? -- Поставьте отзыв.
Выражения особой благодарности в рублевом эквиваленте отправлять сюда --> R269634919062
Mandrivnyk вне форума Ответить с цитированием
Старый 06.05.2011, 22:09   #5
БалаШагаЛ
Форумчанин
 
Регистрация: 11.02.2011
Сообщений: 131
По умолчанию

Ой, действительно нехорошо получилось, простите. Вот файл "Массивы обьектов.hpp":
Код:
class Vrag
{
    public:
      Vrag () {ukr=0;smert=0;zhisn=100;ataka=1;zazhita=1;dalnost=1;}
      ~Vrag() {}
      float zhisn;
      float ataka;
      float zazhita;
      float dalnost;
      float ukr;
      int smert;
      void Ataka(int atVar);
      void Zazhita(int zaVar);
      void Granage(int grVar);
      void Iscel(int isVar);
      void PolZ(int poVar);
};

void Vrag::Ataka(int atVar)
{
    int at1=(ataka*l)/(dalnost*gerZazh);
    if (gerZh-at1<0)
    {
        at1=gerZh;
    }
    at1=rand()%at1+1;
    gerZh-=at1;
    if (gerZh<0)
    {
        gerZh=0;
    }
    std::cout << "Vrag #" << atVar << " vistrelil v vas i otn'yal " << at1 << "% zhizni.\n";
    std::cout << "U vas ostalos' " << gerZh << "% zhizni.\n";
    std::cout << "U vraga ostalos' " << zhisn << "% zhisni.\n";
    ukr=0;
}

void Vrag::Zazhita(int zaVar)
{
  if (ukr==0)
  {
    int za1=(gerAt*l)/(gerDal*zazhita);
    if (zhisn-za1<0)
    {
        za1=zhisn;
    }
    za1=rand()%za1+1;
    zhisn-=za1;
    if (zhisn<0)
    {
        zhisn=0;
    }
    ukr=1;
    std::cout << "Vrag #" << zaVar << " poteryal " << za1 << "% ot vashego vistrela.\n";
    if (zhisn!=0)
      std::cout << "U nego ostalos' " << zhisn << "% zhisni";
    else
      std::cout << "On m'ortv.\n";
      smert=1;
  }
  else
  {
    std::cout << "Vrag #" << zaVar << " sidit v ukritie. Vam ne udalos' popast' v nego.\n";
    std::cout << "U nego " << zhisn << "% zhisni.\n";
  }
}

void Vrag::Granage(int grVar)
{
    if (ukr=0)
    {
        gerAt=rand()%50+1;
    }
    else
    {
        gerAt=rand()%25+1;
    }
    if (zhisn-gerAt<0)
    {
        gerAt=zhisn;
    }
    zhisn-=gerAt;
    std::cout << "Vrag #" << grVar << " poteryal " << gerAt << "% ot vashei granati.\n";
    std::cout << "U nego ostalos' " << zhisn << "% zhisni.\n";
    ukr=1;
}

void Vrag::Iscel(int isVar)
{
    if (zhisn<95)
    {
        int isc;
        isc=rand()%5+1;
        zhisn+=isc;
        std::cout << "Vrag #" << isVar << " popolnil zhisn na " << isc << "%.\n";
        std::cout << "Teper' u nego " << zhisn << "% zhisni.\n";
    }
    if ((zhisn>=95)&&(zhisn!=100))
    {
        zhisn=100;
        std::cout << "Vrag #" << isVar << " polnost'yu vospolnil svoiy zhisn'.\n";
        std::cout << "Teper' u nego " << zhisn << "% zhisni.\n";
    }
    if (zhisn==100)
    {
        std::cout << "Vrag #" << isVar << " ne nuzhdaetsya v iscelenii.\n";
        std::cout << "U nego " << zhisn << " zhisni.\n";
    }
    ukr=0;
}

void Vrag::PolZ(int poVar)
{
  if (ukr!=1)
  {
    int za1=(gerAt*l)/(gerDal*zazhita);
    za1-=15;
    if (zhisn-za1<0)
    {
        za1=zhisn;
    }
    if (za1<0)
    {
        za1=0;
    }
    za1=rand()%za1+1;
    zhisn-=za1;
    if (zhisn<0)
    {
        zhisn=0;
    }
    std::cout << "Vrag #" << poVar << " poteryal " << za1 << "% ot vashego vistrela.\n";
    if (zhisn!=0)
      std::cout << "U nego ostalos' " << zhisn << "% zhisni";
    else
      std::cout << "On m'ortv.\n";
      smert=1;
  }
  else
  {
    std::cout << "Vrag #" << poVar << " sidit v ukritie. Vam ne udalos' popast' v nego.\n";
    std::cout << "U nego " << zhisn << "% zhisni.\n";
  }
}
БалаШагаЛ вне форума Ответить с цитированием
Старый 06.05.2011, 22:10   #6
БалаШагаЛ
Форумчанин
 
Регистрация: 11.02.2011
Сообщений: 131
По умолчанию

Вот основной файл:
Код:
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

int gerZh=100,l=10,gerAt=0,gerDal=0,gerZazh=0;

#include "Массивы обьектов.hpp"

int main()
{
    srand(time(NULL)*311);
    int kolgr=3;
    int oru;
    int bronya;
    int deis;
    std::cout << "NASTROIKI PERSONAZHA\n";
    std::cout << "Viberete oruzhie:\n";
    std::cout << "1) Pistolet - Yron 40  Dalnost 7\n";
    std::cout << "2) Avtomat  - Yron 35  Dalnost 8\n";
    std::cout << "3) Drobovik - Yron 50  Dalnost 5\n";
    std::cin >> oru;
    if (oru==1)
    {
        gerAt=40;
        gerDal=7;
    }
    if (oru==2)
    {
        gerAt=35;
        gerDal=8;
    }
    if (oru==3)
    {
        gerAt=50;
        gerDal=5;
    }
    std::cout << "\n";
    std::cout << "Kakaya bronya?\n";
    std::cout << "1) Prosteishaya - Zazhita 15  Dalnost' neizmenna\n";
    std::cout << "2) L'ogkaya     - Zazhita 30  Dalnost -1\n";
    std::cout << "3) Srednyaya    - Zazhita 40  Dalnost -2\n";
    std::cout << "4) Tyazhelaya   - Zazhita 60  Dalnost -4\n";
    std::cin >> bronya;
    if (bronya==1)
    {
        gerZazh=15;
    }
    if (bronya==2)
    {
        gerZazh=30;
        gerDal-=1;
    }
    if (bronya==3)
    {
        gerZazh=40;
        gerDal-=2;
    }
    if (bronya==4)
    {
        gerZazh=60;
        gerDal-=4;
    }
    std::cout << "\n\nVASHI POKAZATELI:\n";
    std::cout << "Ataka\t\t" << gerAt << "\n";
    std::cout << "Zazhita\t\t" << gerZazh << "\n";
    std::cout << "Dalnost\t\t" << gerDal << "\n";
    std::cout << "\n\n\n";
    int kolvo;
    std::cout << "Skol'ko vragov?\n";
    std::cin >> kolvo;
    Vrag vr[kolvo];
    for (int a=0;a<kolvo;a++)
    {
        vr[a].ataka=rand()%3+1;
        if (vr[a].ataka==1)
        {
            vr[a].ataka=40;
            vr[a].dalnost=7;
        }
        if (vr[a].ataka==2)
        {
            vr[a].ataka=35;
            vr[a].dalnost=8;
        }
        if (vr[a].ataka==3)
        {
            vr[a].ataka=50;
            vr[a].dalnost=5;
        }
    }
    for (int a=0;a<kolvo;a++)
    {
        vr[a].zazhita=rand()%4+1;
        if (vr[a].zazhita==1)
        {
            vr[a].zazhita=15;
        }
        if (vr[a].zazhita==2)
        {
            vr[a].zazhita=30;
            vr[a].dalnost-=1;
        }
        if (vr[a].zazhita==3)
        {
            vr[a].zazhita=40;
            vr[a].dalnost-=2;
        }
        if (vr[a].zazhita==4)
        {
            vr[a].zazhita=60;
            vr[a].dalnost-=4;
        }
    }
    int raund=1;
    int zhertva;
    while(1)
    {
        std::cout << "\n\n\nRAUND " << raund << "\n\n";
        std::cout << "Viberete deistvie:\n";
        std::cout << "1) Vistrelit' vo vraga\n";
        std::cout << "2) Brosit' granatu (ostalos' " << kolgr << ")\n";
        std::cout << "3) Podoiti na metr\n";
        std::cout << "4) Otoiti na metr\n";
        std::cout << "5) Spryatat'sya\n";
        std::cin >> deis;
        if (deis==1)
        {
            std::cout << "V kakogo vraga vi budete strelyat'?\n";
            std::cin >> zhertva;
            std::cout << "\n\n\n";
            for (int a=0;a<kolvo;a++)
            {
                if (vr[a].smert==0)
                {
                    if (a==zhertva)
                    {
                        vr[a].Zazhita(a+1);
                        std::cout << "\n";
                    }
                    if ((a+1==zhertva)||(a-1==zhertva))
                    {
                        vr[a].PolZ(a+1);
                        std::cout << "\n";
                    }
                    if ((a!=zhertva)&&(a-1!=zhertva)&&(a+1!=zhertva))
                    {
                        vr[a].Ataka(a+1);
                        std::cout << "\n";
                    }
                }
            }
        }
    }
    return 0;
}
БалаШагаЛ вне форума Ответить с цитированием
Старый 06.05.2011, 22:11   #7
БалаШагаЛ
Форумчанин
 
Регистрация: 11.02.2011
Сообщений: 131
По умолчанию

Вобщем-то весь код работает нормально, но проблемы возникают на участке
Код:
            for (int a=0;a<kolvo;a++)
            {
                if (vr[a].smert==0)
                {
                    if (a==zhertva)
                    {
                        vr[a].Zazhita(a+1);
                        std::cout << "\n";
                    }
                    if ((a+1==zhertva)||(a-1==zhertva))
                    {
                        vr[a].PolZ(a+1);
                        std::cout << "\n";
                    }
                    if ((a!=zhertva)&&(a-1!=zhertva)&&(a+1!=zhertva))
                    {
                        vr[a].Ataka(a+1);
                        std::cout << "\n";
                    }
                }
            }
Когда переменная a доходит до значения zhertva программа завершает работу. Более того, когда a=zhertva-1 программа не проводит атаку врага, хотя должна.
Сделано в Code::Blocks 10.05
БалаШагаЛ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Распознавание обьектов aly-lucenko Фриланс 3 12.04.2011 18:17
OpenGL движение обьектов Krechet Мультимедиа в Delphi 8 31.01.2010 21:10
Движение ДВУХ ОБЬЕКТОВ Wi1D Помощь студентам 4 15.05.2009 08:57
Использование обьектов UberStas Помощь студентам 2 13.06.2008 18:55
Перетаскивание обьектов Witaliy Общие вопросы Delphi 6 27.04.2008 19:22