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


Уроки предназначены для тех, кто уже хорошо разбирается в C#. В основном искусственный интеллект (ИИ) сложен из операторов выбора. Основная задача интеллекта, это чаще всего поиск пути. И именно в этом уроке мы поговорим об этом.
Представим, что у нас есть монстр который должен подойти к игроку. Карта — это наш массив 10*10. Монстр отображается в массиве как буква М, а игрок Р. Для начала выберем консольный проект и создадим массив, расположим на нём игрока и монстра:
 
  char[,] map = new char[10, 10]; 
  int player_x = 10;
  int player_y = 10;
  int monst_x = 0;
  int monst_y = 1; 
  
—  
Создадим игровой цикл, и весь следующий код запишем в него:
 
  do
  {
  }while(1==1);
  
 
Ну вот, основа у нас готова, осталось сделать интеллект! Нужно сделать, чтобы монстр приблизился к игроку. Алгоритм простой: Если положение монстра по оси Х больше положения игрока по оси Х, то уменьшить положение монстра по Х на 1. Программа сравнивает положение монстра и игрока, и изменяет положение монстра.
 
  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] = ' ';
  
Всё, запустите программу и нажмите Enter для смены кадров. Исходный код проекта:
  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);
  }
  }
  }
  
— Преимущество этого интеллекта в том, что он может преследовать игрока, даже если игрок изменяет положение.
 
  • +1
  • amid
  • 23 июля 2010, 11:20

Вставка изображения

Комментарии (13)

rss свернуть / развернуть
Отлично, новый блог, посвященный ИИ открыт.
Ждем усложнения и новых рассматриваемых в уроках тем.

свернуть ветку
у клас =))
новый урок

выкинь саму прогу плз

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

Вот такая вот задачка на ИИ))) Анви)) шарящий тип — решай))))))

свернуть ветку
А если, робот выбрал направо и воткнулся в угол, в котором не возможно повернуть налево)))) И какое условие окончания программы, а то он так до утра ходить будет)))))

свернуть ветку
ну я ж говорю ограниченное количество точек)) если полностью обойдет все то заиипись) а если нет не найдет точек то все) пиндец) труба )

свернуть ветку
робот сам собой управляет?

свернуть ветку
автомат)

свернуть ветку
Он все соберёт.

свернуть ветку
не факт))) если точки по всей форме не лягут)) если в разных углах будут )) то нет) сам посуди ))

свернуть ветку
Это самый примитивный алгоритм, у него масса недостатков. Основной из недостатков — это неспособность NPC выбраться из U-образного препятствия.

свернуть ветку
Если есть желание, я могу попробовать подготовить статью по более менее достойному замещению этого алгоритма. Только вот не обещаю что для C#. Скорей или С\С++ или псевдокод.

свернуть ветку
Я сейчас делаю серию этих уроков.

свернуть ветку
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.