С#: Искуственный интелект в играх. Поиск пути
Уроки предназначены для тех, кто уже хорошо разбирается в C#. В основном искусственный интеллект (ИИ) сложен из операторов выбора. Основная задача интеллекта, это чаще всего поиск пути. И именно в этом уроке мы поговорим об этом.[spoiler]
Представим, что у нас есть монстр который должен подойти к игроку. Карта — это наш массив 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>
---------------------------------------------------------- Преимущество этого интеллекта в том, что он может преследовать игрока, даже если игрок изменяет положение.
Представим, что у нас есть монстр который должен подойти к игроку. Карта — это наш массив 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.0). Затем выберает направление толи налево, толи направо. Затем дошев до новой точки меняет положение на обратное (т.е. если выбрал налево, то теперь идет направо и наоборот). Определить пройдет ли робот все точки. Если не пройдет то сколько именно.
Вот такая вот задачка на ИИ))) Анви)) шарящий тип — решай))))))