Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Van111
209 / 188 / 4
Регистрация: 03.08.2011
Сообщений: 2,598
Записей в блоге: 12
#1

нужны советы . ИИ - C++

22.06.2012, 10:43. Просмотров 305. Ответов 0
Метки нет (Все метки)

делаю одну игрушку(или не делаю), написал для неё элементарный код случайного движения объектов. .Андре Ламот писал что можно выделить три уровня ИИ : верхний , средний и нижний.
как я справился с организацией ИИ и какого быстродействие его выполнения ?
unit.h

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#ifndef __unit_h__
#define __unit_h__
#include <deque>
#include <vector>
using namespace std;
const int MAXHELF=100;
const int MAP_MAX_LEFT=1000;
const int MAP_MAX_HEIGHT=800;
enum Tstate{random_move=0,stop=1};
struct FPOINT
{
public:
    float   x;
    float   y;
};
 
struct Tunit
{
public :
int     team;
int     team_agricultural;
FPOINT  location;
FPOINT  moveLocation;
float   max_helf;
float   current_helf;
int     ID_cel; 
float   speed;
bool     pleyar;
Tstate state;
};
 
class game
{
private:
vector <int> counter_unit;
vector <int> ::iterator icounter_unit;
deque <Tunit> Unit;
deque <Tunit>::iterator iUnit;
int size_team;
void search(deque <Tunit>::iterator iUnit);//не готова
void random_choice_of_direction(int number_unit);
bool move(int number_unit);
void random_move(int number_unit);
void choice_state(int number_unit);
public:
game(int size_team, int begin_counter_);
inline float GetX(int number){return iUnit[number].location.x;}
inline float GetY(int number){return iUnit[number].location.y;}
inline void SetMoveLocation(float x,float y, int number){iUnit[number].moveLocation.x=x;iUnit[number].moveLocation.y=y;}
int GetCounterUnit();
void engine();
};
#endif

unit.cpp

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#ifndef __unit_cpp__
#define __unit_cpp__
#include "unit.h"
#include <deque>
#include <vector>
#include "global.h"
#include "time.h"
#include "math.h"
 
//не рабочая//
void game::search(deque <Tunit>::iterator nunit)
{
    int number=0,max=sqrt(pow(this->iUnit[0].location.x - nunit->location.x,2)
            +pow(this->iUnit[0].location.y - nunit->location.y,2));
    for(int i=0,distance;i< this->size_team;i++)
    {
        distance=sqrt(pow(this->iUnit[i].location.x - nunit->location.x,2)
            +pow(this->iUnit[i].location.y - nunit->location.y,2));
        if(  distance<max )
        {
            max=distance;
            nunit->ID_cel=i;
        }
 
    }
}
 
 
//функция инцилизации 
game::game(int size_team_, int begin_counter): size_team(size_team_) 
{
        srand(time(NULL));
        Tunit tempunit;
        for(int number_team=0;number_team < this->size_team  ;number_team++)
        {
            counter_unit.push_back(begin_counter);
            for(int number_unit=0;number_unit < begin_counter;number_unit++)
            {
                //временный объект заполняется новыми значениями и помещается в контейнер
                tempunit.location.x=((rand() %MAP_MAX_LEFT));
                tempunit.location.y=((rand() %MAP_MAX_HEIGHT));
                tempunit.current_helf=100;
                tempunit.max_helf=MAXHELF;
                tempunit.moveLocation.x=0;
                tempunit.moveLocation.y=0;
                tempunit.speed=((rand() % 100) /2000 +0.15);
                tempunit.team=number_team;
                tempunit.ID_cel=-1;
                tempunit.state=Tstate::stop;
                if(number_team==this->size_team-1)
                    tempunit.team_agricultural=0;
                else
                    tempunit.team_agricultural=number_team+1;
                Unit.push_back(tempunit);// помещение объекта в контейнер
            }
        }
        //иницилизируем итераторы
        icounter_unit=this->counter_unit.begin();
        iUnit=this->Unit.begin();
        return;
}
//функция получения количества объектов
int game::GetCounterUnit()
{
    int counter=0;
    for(int i=0;i<size_team;i++)
            counter+=icounter_unit[i];
    return counter;
 
}
 
//функция движения и проверки на достижение точки
bool game::move(int number_unit)
{
    //сравнение координат по оси х
    
    
    if(this->iUnit[number_unit].location.x < this->iUnit[number_unit].moveLocation.x)
        this->iUnit[number_unit].location.x+=this->iUnit[number_unit].speed;
    if(this->iUnit[number_unit].location.x > this->iUnit[number_unit].moveLocation.x)
        this->iUnit[number_unit].location.x-=this->iUnit[number_unit].speed;
    //сравнение координат по оси y
    if(this->iUnit[number_unit].location.y < this->iUnit[number_unit].moveLocation.y)
        this->iUnit[number_unit].location.y+=this->iUnit[number_unit].speed;
    if(this->iUnit[number_unit].location.y > this->iUnit[number_unit].moveLocation.y)
        this->iUnit[number_unit].location.y-=this->iUnit[number_unit].speed;
 
    
    //проверка координат на совподение
    if((((this->iUnit[number_unit].location.x  >= this->iUnit[number_unit].moveLocation.x - this->iUnit[number_unit].speed ) &&
    (this->iUnit[number_unit].location.x  <= this->iUnit[number_unit].moveLocation.x + this->iUnit[number_unit].speed)) 
    &&
    ((this->iUnit[number_unit].location.y  >= this->iUnit[number_unit].moveLocation.y - this->iUnit[number_unit].speed ) &&
    (this->iUnit[number_unit].location.y  <= this->iUnit[number_unit].moveLocation.y + this->iUnit[number_unit].speed)) ))
    {
        this->iUnit[number_unit].location.x=this->iUnit[number_unit].moveLocation.x;
        this->iUnit[number_unit].location.y=this->iUnit[number_unit].moveLocation.y;
        return 1;
    }
    return 0;
    
    
}
 
 
//функция выбора точки для случайного движения
void game::random_choice_of_direction(int number_unit)
{
    this->iUnit[number_unit].moveLocation.x=rand() % MAP_MAX_LEFT;
    this->iUnit[number_unit].moveLocation.y=rand() % MAP_MAX_HEIGHT;
}
 
//функция выбора состояния
void game::choice_state(int number_unit)
{
    if(this->iUnit[number_unit].state==Tstate::stop)
    {
        random_choice_of_direction(number_unit);
        this->iUnit[number_unit].state=Tstate::random_move;
    }
 
}
//функция реакция на состояние
void game::engine()
{
    
    Tstate tmp;
    int len=this->GetCounterUnit();
    for(int number_unit=0;number_unit<len;number_unit++)
    {
        choice_state(number_unit);
        switch (this->iUnit[number_unit].state)
        {
        case Tstate::random_move:
            random_move(number_unit);
            break;
        }
    }
    return;
 
}
void game::random_move(int number_unit)
{
    if(this->move(number_unit))
        this->iUnit[number_unit].state=Tstate::stop;
 
 
}
#endif
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.06.2012, 10:43
Здравствуйте! Я подобрал для вас темы с ответами на вопрос нужны советы . ИИ (C++):

Нужны советы по задачам - C++
У меня при написании программ возникли проблемы. 1)в программе где я работаю со списками: #include &lt;conio.h&gt; #include &lt;stdio.h&gt; ...

Класс редактирования данных. Нужны советы по реализации - C++
Есть задача: написать класс, позволяющий редактировать данные в памяти. Указатель на данные и их начальный размер передаются в конструктор....

Нужны советы как реализовать сложение, вычитание, умножение полиномов/многочленов и деление на число - C++
Всем здравствуйте! надеюсь написать с вашей помощью программку для сложения, вычитания и умножения полиномов, а также деления на число....

Структура "Сканер". Нужны советы профессионалов по программе - C++
Программа ПОЧТИ работает, очень все сырое, код мне кажется мог быть и короче. Прошу Вас, эксперты, указать явные недоработки и как было бы...

Какие значения нужны нужны циклу while? - C++
#include &lt;algorithm&gt; #include &lt;iostream&gt; #include &lt;vector&gt; using namespace std; int main(void) { int A={1,2,3,4,49,100,49};...

Советы - C++
Привет всем! Я начинающий программист (и довольно молодой :D), и недавно написал &quot;игру&quot; как бы с помощью &quot;классов&quot;, по типу tic-tac-toe, и...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.06.2012, 10:43
Привет! Вот еще темы с ответами:

Советы - C++
Добрый день, сделал с горем пополам калькулятор, но необходимы советы о написании программ на примере того же калькулятора, так как было...

Советы начинающему - C++
Здравствуйте дорогие форумчане, отнедавна решил воплотить мечту своего детства и попробовать стать программистом, осенью на первый курс...

Советы новичку - C++
Ребята, добрый день! Помогите в написании кода, не могу все собрать вместе. Нужно чтобы пользователь указал с клавиатуры длину массива...

Советы по освоению материала - C++
Добрый день! Заканчиваю вуз в этом году и, соответственно, задумался о работе. У меня техническое образование, но специально...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.