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

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

Войти
Регистрация
Восстановить пароль
 
Uzer5
4 / 4 / 1
Регистрация: 22.09.2012
Сообщений: 11
#1

ИИ нехочет ходить куда надо - C++

28.06.2013, 18:05. Просмотров 301. Ответов 1
Метки нет (Все метки)

Доброго времени суток. Возникла проблема с ИИ, который никак не хочет корректно работать.
Если кто сможет помочь, заранее благодарю.

Дано: карта в виде массива 15х20. 1 - возможно движение, 0 - невозможно.
Объект размером 32х32 (1 клетка карты)
Логика:
Обьект движется. При появлении других вариантов двежиния (лево, право) - Если новых вариантов более 1-го, то выбираем направление случайным образом, если 1 вариант, а движение вперёд невозможно, сварачиваем, если нет никаких вариантов, в т.ч. и вперёд, по движемся назад.
Пишу на DevC++.

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
// функция проверки хода, передаём координаты объекта и массив карты
bool test (int x, int y, int map[20][15]){
     int tx1;                               
     int ty1;
     int tx2;
     int ty2;
     int tx3;                               
     int ty3;
     int tx4;
     int ty4;
     int x2=x+31;
     int y2=y;
     int x3=x;
     int y3=y+31;
     int x4=x2;
     int y4=y3;
     tx3 = ((x3-(x3%32))/32);
     ty3 = ((y3-(y3%32))/32);
     tx4 = ((x4-(x4%32))/32);
     ty4 = ((y4-(y4%32))/32);
     tx1 = ((x-(x%32))/32);
     ty1 = ((y-(y%32))/32);
     tx2 = ((x2-(x2%32))/32);
     ty2 = ((y2-(y2%32))/32);
     if(map[tx1][ty1]==1 && map[tx2][ty2]==1
                         && map[tx3][ty3]==1 && map[tx4][ty4]==1){
         return true;
     }else{
         return false;
     }     
}
 
            // функция генерации направления движения
            // передаём позицию бота, массив направления и карту
void moveVarriants(SDL_Rect botPosition, int bot[4], int map[20][15]){
    int x = botPosition.x;
    int y = botPosition.y;
    int bot2[]={0,0,0,0};              // возможные варрианты ходов
    int z = 0;                         // счётчик варриантов
    int f = 0;            
    int gg = 0;                        // случайное число           
    int ii = 0;
    
    //------------------- заполняем массив вариантов -----------------------   
    if (bot[1]==0 && test(x+1, y, map))
        {bot2[3]=1;} // вправо
       
    if (bot[3]==0 && test(x-1, y, map))
        {bot2[1]=1;} // влево
       
    if (bot[0]==0 && test(x, y+1, map))
        {bot2[2]=1;} // вниз
       
    if (bot[2]==0 && test(x, y-1, map))
        {bot2[0]=1;} // вверх
       
 
      
    // ----------------------- получаем количество новых варриантов --------
    for (int i = 0; i<4; ++i){
        if (bot2[i]==1) z++;       
    }
    // --- если новых вариантов больше одного, выбираем один случайным образом --
    if (z>1){
        srand(time(0));
        gg = rand()%(z+1);
        f=0;
        ii=-1;
        
        while(f!=gg){
            ++ii;
            if (bot2[ii]==1) ++f;
            
        }
        
        bot[0]=0;
        bot[1]=0;
        bot[2]=0;
        bot[3]=0;
        bot[f]=1;
    } 
    if(z==1) {
        bot[0]=bot2[0];
        bot[1]=bot2[1];
        bot[2]=bot2[2];
        bot[3]=bot2[3];
    }
        
    //----------------- если нет ни одного варианта, движемся назад
    if(z==0){
        bot2[0]=bot[0];
        bot2[1]=bot[1];
        bot2[2]=bot[2];
        bot2[3]=bot[3];
        bot[0]=bot2[2];
        bot[1]=bot2[3];
        bot[2]=bot2[0];
        bot[3]=bot2[1];               
    }
}
 
     //-------------------------------------- логика перемещения бота --------
   
    for(int i = 0; i<botSpeed; ++i){    
        moveVarriants(botPosition, bot, map);            // генерируем направление движения
             
        if(bot[0]==1){                                   // если нажата клавиша двигаем вверх
            set_rects(botRects, 96);                     // загружаем спрайты в массив
            botPosition.y--;
            if(!test(botPosition.x,botPosition.y, map)){ // если нельзя, то перемещаем
                botPosition.y++;                         // вниз, чтоб не застрять
            } 
        }
                
                
        if(bot[2]==1){                                  // если нажата клавиша двигаем вниз
            set_rects(botRects, 0);                     // загружаем спрайты в массив
            botPosition.y++;
            if(!test(botPosition.x,botPosition.y, map)){ // если нельзя, то перемещаем
                botPosition.y--;                        // вверх, чтоб не застрять
            } 
        }
                
                
        if(bot[1]==1){                                  // если нажата клавиша двигаем влево
            set_rects(botRects, 32);                    // загружаем спрайты в массив
            botPosition.x--;
            if(!test(botPosition.x,botPosition.y, map)){ // если нельзя, то перемещаем
                botPosition.x++;                        // вправо, чтоб не застрять
            } 
        }
                
                
        if(bot[3]==1){                                  // если нажата клавиша двигаем вправо
            set_rects(botRects, 64);                    // загружаем спрайты в массив
            botPosition.x++;
            if(!test(botPosition.x,botPosition.y, map)){ // если нельзя, то перемещаем
                botPosition.x--;                        // влево, чтоб не застрять
            } 
        }        
    
    }
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.06.2013, 18:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос ИИ нехочет ходить куда надо (C++):

Линковщик студии суёт нос не туда куда надо - C++
Хочу разбить код на .h и .cpp файл, но эта, самка собаки, линковщик студии начинает творить непотребства. Пока весь код в .h файлах всё...

Почему нехочет работать со степенью - C++
#include &quot;stdafx.h&quot; #include &quot;stdio.h&quot; #include &quot;conio.h&quot; #include &quot;math.h&quot; int _tmain(int argc, _TCHAR* argv) { int n; ...

Есть 4 потока. После осуществления блокировки барьером, 3 куда-то деваются, куда? (pthreads) - C++
Друзья! Как мог упростил код, вот суть В цикле создаются 4 вспомогательных потока, кадый из которых в цикле же 2 раза выводит свой...

Что и куда надо вставить? - HTML, CSS
Здравствуйте! Прошу объяснить. Что и куда надо вставить? В какую ячейку? Если код по этой ссылке скачать в файл с расширением...

В очередной раз залезли, куда не надо - Удаление вирусов
В очередной раз прошу Вас помощи. На ноутбуке сотрудницы, вылезли программы на китайском, залезла куда-то и что-то установила. Пытаюсь...

Запись идет не туда куда надо - Delphi
Хочу записать результат вычеслений a2;b2;c2;d2; в поля в вода с переменными a;b;c;d , результат: после нажатия на кнопку выходит...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Uzer5
4 / 4 / 1
Регистрация: 22.09.2012
Сообщений: 11
30.06.2013, 12:32  [ТС] #2
Напрягает 1 момент. Бот иногда вместо того, чтобы повернуть, идёт назад, хотя в проверке вариантов явно прописано:
C++
1
2
   if (bot[2]==0 && test(x, y-1, map))//если (бот не шёл вниз и возможно движение вверх)
        {bot2[0]=1;} // то добавляем вариант вверх.
Значит, если он движется вниз, вариант вверх вообще не может присутствовать, аналогично и по другим направлениям...
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.06.2013, 12:32
Привет! Вот еще темы с ответами:

Position: fixed залазит куда не надо - HTML, CSS
Подскажите, пожалуйста, зуммирую окно браузера и фиксированный блок налазит поверх всех элементов и смещается из левой стороны (где он...

Как загнать курсор куда мне надо? - Visual Basic
А вот еще одна проблема - как заставить курсор переходить в нужное текстовое окно по нажатию кнопки. Например, чтобы по клику кнопки...

Панель инструментов установилась не туда куда надо - Windows XP
Доброго всем времени суток ! Написал на C# панель инструментов для IE, с использованием SpicIE. Запустил bat файл для установки,...

Куда надо выставлять этот атрибут COLLATE ? - MySQL
Вот что мне надо ввести из мануала `name` varchar(30) COLLATE utf8_unicode_ci NOT NULL куда надо вводить этот COLLATE Проштудировал...


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

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

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