С#: Искуственный интелект в играх. Поиск пути

Уроки предназначены для тех, кто уже хорошо разбирается в C#. В основном искусственный интеллект (ИИ) сложен из операторов выбора. Основная задача интеллекта, это чаще всего поиск пути. И именно в этом уроке мы поговорим об этом.
Представим, что у нас есть монстр который должен подойти к игроку. Карта — это наш массив 10*10. Монстр отображается в массиве как буква М, а игрок Р. Для начала выберем консольный проект и создадим массив, расположим на нём игрока и монстра:

<pre class="prettyprint">
char[,] map = new char[10, 10];
int player_x = 10;
int player_y = 10;
int monst_x = 0;
int monst_y = 1;
</pre>
-------------------------------------------

Создадим игровой цикл, и весь следующий код запишем в него:

<pre class="prettyprint">
do
{
}while(1==1);
</pre>

Ну вот, основа у нас готова, осталось сделать интеллект! Нужно сделать, чтобы монстр приблизился к игроку. Алгоритм простой: Если положение монстра по оси Х больше положения игрока по оси Х, то уменьшить положение монстра по Х на 1. Программа сравнивает положение монстра и игрока, и изменяет положение монстра.

<pre class="prettyprint">
if (monst_x > player_x) { monst_x--; }
if (monst_x < player_x) { monst_x++; }
if (monst_y > player_y) { monst_y--; }
if (monst_y < player_y) { monst_y++; }
</pre>
----------------------------------------------- Нарисуем игрока и монстра:
<pre class="prettyprint">
map[player_x, player_y] = 'P';
map[monst_x, monst_y] = 'M';
</pre>
------------------------------------------- Теперь нам нужно вывести карту на экран:


<pre class="prettyprint">
for (int x = 0; x <= 9; x++)
{
for (int y = 0; y <= 9; y++)
{
Console.Write(map[x, y]);
}
Console.WriteLine("");
}
Console.WriteLine("----------------------------------------------------");
Console.ReadLine();
</pre>
------------------------------------------ Удалим игрока и монстра:
<pre class="prettyprint">
map[player_x, player_y] = ' ';
map[monst_x, monst_y] = ' ';
</pre>
Всё, запустите программу и нажмите Enter для смены кадров. Исходный код проекта:
<pre class="prettyprint">
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
char[,] map = new char[10, 10];
int player_x = 9;
int player_y = 9;
int monst_x = 2;
int monst_y = 1;
do
{
if (monst_x > player_x) { monst_x--; }
if (monst_x < player_x) { monst_x++; }
if (monst_y > player_y) { monst_y--; }
if (monst_y < player_y) { monst_y++; }
map[player_x, player_y] = 'P';
map[monst_x, monst_y] = 'M';
for (int x = 0; x <= 9; x++)
{
for (int y = 0; y <= 9; y++)
{
Console.Write(map[x, y]);
}
Console.WriteLine("");
}
Console.WriteLine("----------------------------------------------------");
Console.ReadLine();
map[player_x, player_y] = ' ';
map[monst_x, monst_y] = ' ';
} while (2 == 2);
}
}
}
</pre>
---------------------------------------------------------- Преимущество этого интеллекта в том, что он может преследовать игрока, даже если игрок изменяет положение.
0       1825        23.07.2010        13

0  
23.07.2010 00:00:00
Отлично, новый блог, посвященный ИИ открыт.
Ждем усложнения и новых рассматриваемых в уроках тем.
0  
23.07.2010 00:00:00
у клас =))
новый урок

выкинь саму прогу плз
0  
23.07.2010 00:00:00
0  
23.07.2010 00:00:00
есть предложение, сам не брался за него но:
условие:
есть какое-то множество точек на поле. Робот идет к ближайшей(например, от верхнего левого угла, там обычно как по координатам то — 0.0). Затем выберает направление толи налево, толи направо. Затем дошев до новой точки меняет положение на обратное (т.е. если выбрал налево, то теперь идет направо и наоборот). Определить пройдет ли робот все точки. Если не пройдет то сколько именно.

Вот такая вот задачка на ИИ))) Анви)) шарящий тип — решай))))))
0  
23.07.2010 00:00:00
А если, робот выбрал направо и воткнулся в угол, в котором не возможно повернуть налево)))) И какое условие окончания программы, а то он так до утра ходить будет)))))
0  
23.07.2010 00:00:00
ну я ж говорю ограниченное количество точек)) если полностью обойдет все то заиипись) а если нет не найдет точек то все) пиндец) труба )
0  
23.07.2010 00:00:00
робот сам собой управляет?
0  
23.07.2010 00:00:00
автомат)
0  
23.07.2010 00:00:00
Он все соберёт.
0  
23.07.2010 00:00:00
не факт))) если точки по всей форме не лягут)) если в разных углах будут )) то нет) сам посуди ))
0  
22.01.2011 00:00:00
Это самый примитивный алгоритм, у него масса недостатков. Основной из недостатков — это неспособность NPC выбраться из U-образного препятствия.
0  
22.01.2011 00:00:00
Если есть желание, я могу попробовать подготовить статью по более менее достойному замещению этого алгоритма. Только вот не обещаю что для C#. Скорей или С\С++ или псевдокод.
0  
23.01.2011 00:00:00
Я сейчас делаю серию этих уроков.
^