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

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

Восстановить пароль Регистрация
 
Uzer5
 Аватар для Uzer5
4 / 4 / 1
Регистрация: 22.09.2012
Сообщений: 11
28.06.2013, 18:05     ИИ нехочет ходить куда надо #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--;                        // влево, чтоб не застрять
            } 
        }        
    
    }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.06.2013, 18:05     ИИ нехочет ходить куда надо
Посмотрите здесь:

Почему нехочет работать со степенью C++
C++ надо что то добавить!!прога просто выводит список групп,учеников и первых 3 оценок.надо чтобы прога в конце показывала по убыванию средего балла
C++ надо разобрать программу.очень надо. тема Классы
C++ Линковщик студии суёт нос не туда куда надо
C++ с Клавиатуры надо ввести имена 5 человек , надо найти сколько гласных букв в каждом имени человека
Куда дальше? C++
C++ Надо сделать задание (надо найти среднее геометрическое)
Люди добрые очень надо, кто что может, к экзамену надо C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Uzer5
 Аватар для 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;} // то добавляем вариант вверх.
Значит, если он движется вниз, вариант вверх вообще не может присутствовать, аналогично и по другим направлениям...
Yandex
Объявления
30.06.2013, 12:32     ИИ нехочет ходить куда надо
Ответ Создать тему
Опции темы

Текущее время: 12:41. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru