Найти в Дзене

Делаем игру Пакман в консоли. Часть 1.

Всем Хай! Как я и обещал в прошлой статье, мы начнём делать игру «Pacman». Если кто не знает, то смысл игры съесть все точки и не попасться врагу. Игра старая, но в какой-то мере залипательная. Создание игры будет разбито на 3 этапа. И каждый этап будет описан в отдельной статье. Карта. Для начала давайте посмотрим на кусочек кода к сегодняшней статье. internal class Program { static void Main(string[] args) { int pacmanX, pacmanY; char[,] map = ReadMap("map", out pacmanX, out pacmanY); DrawMap(map); Console.SetCursorPosition(pacmanY, pacmanX); Console.WriteLine("@"); Console.SetCursorPosition(0, 25); } static char[,] ReadMap(string mapName, out int positionX, out int positionY) { positionX = 0; positionY = 0; string[] line = File.ReadAllLines($"Maps/{mapName}.txt"); char[,] result = new char[line.Length, line[0].Length]; for (int i = 0; i < line.Length; i++) { for (int j = 0; j < line[0].Length; j++) { result[i, j] = line[i][j]; if (result[i, j] == '@') { positionX = i; positionY = j
Оглавление
Рисуем и загружам карту
Рисуем и загружам карту

Всем Хай! Как я и обещал в прошлой статье, мы начнём делать игру «Pacman». Если кто не знает, то смысл игры съесть все точки и не попасться врагу. Игра старая, но в какой-то мере залипательная.

Создание игры будет разбито на 3 этапа. И каждый этап будет описан в отдельной статье.

  1. Чтение и загрузка карты из файла.
  2. Механика передвижения Пакмана.
  3. Отрисовка Врага и механика передвижения.

Карта.

Для начала давайте посмотрим на кусочек кода к сегодняшней статье.

internal class Program
{
static void Main(string[] args)
{
int pacmanX, pacmanY;
char[,] map = ReadMap("map", out pacmanX, out pacmanY);
DrawMap(map);
Console.SetCursorPosition(pacmanY, pacmanX);
Console.WriteLine("@");
Console.SetCursorPosition(0, 25);
}
static char[,] ReadMap(string mapName, out int positionX, out int positionY)
{
positionX = 0;
positionY = 0;
string[] line = File.ReadAllLines($"Maps/{mapName}.txt");
char[,] result = new char[line.Length, line[0].Length];
for (int i = 0; i < line.Length; i++)
{
for (int j = 0; j < line[0].Length; j++)
{
result[i, j] = line[i][j];
if (result[i, j] == '@')
{
positionX = i;
positionY = j;
}
}
}
return result;
}
static void DrawMap(char[,] map)
{
for (int i = 0; i < map.GetLength(0); i++)
{
for (int j = 0; j < map.GetLength(1); j++)
{
Console.Write(map[i, j]);
}
Console.WriteLine();
}
}
}

Он не большой, но для лучшего понимания советую скопировать его в Visual Studio.

Здесь мы добавляем к основной функции «Main» функцию «ReadMap», чтение карты и функцию «DrawMap», отрисовка карты.

Чтение файла.

Давайте сначала отвлечёмся от основной функции «Main» и от всего, что в ней написано. И посмотрим, как реализовано чтение карты из файла в функции «ReadMap».

static char[,] ReadMap(string mapName, out int positionX, out int positionY)
{
positionX = 0;
positionY = 0;
string[] line = File.ReadAllLines($"Maps/{mapName}.txt");
char[,] result = new char[line.Length, line[0].Length];
for (int i = 0; i < line.Length; i++)
{
for (int j = 0; j < line[0].Length; j++)
{
result[i, j] = line[i][j];
if (result[i, j] == '@')
{
positionX = i;
positionY = j;
}
}
}
return result;
}

Как видите, у нас будет возвращаемая функция, так как у нас тип функции это двумерный массив «char[,]». То есть мы должны вернуть в код прочитанный двумерный массив. То есть нашу карту. В скобках мы пишем с чем мы будем работать.

  • string mapName – имя файла в нашей папке.
  • out int positionX, out int positionY – позиция нашего героя при загрузке карты.

Приставка «out» к типу переменной, говорит функции, что точных значение этой переменной нет и она сама должна определить эти значения.

Чтобы не было ошибки нам сразу нужно определить дефолтные значения позиции нашего Пакмана. После чтения карты они поменяются.

positionX = 0;
positionY = 0;

Чтение файла происходит посторочно поэтому, чтобы считать строку мы будем использовать одномерный массив «string[] line» и равняться он будет методу, который показывает путь к файлу, который нужно прочитать.

string[] line = File.ReadAllLines($"Maps/{mapName}.txt")

Теперь по поводу самой карты и места где она хранится. Карту я рисовал в текстовом редакторе при помощи символов.

Карта Пакмана
Карта Пакмана

И оставить карту нужно в корневой директории нашей программы. Чтобы узнать, где это директория находится у вас, щёлкаем правой кнопкой мыши по имени нашей программы и открываем папку с нашим исполняющим файлом. Как показано на скриншоте ниже.

Путь к директории.
Путь к директории.

Потом переходим по папкам bin -> Debug -> net6.0 и в ней создаём нашу папку «Maps». Туда кидаем наш файл с картой.

Корнеевая директория программы
Корнеевая директория программы

Теперь осталось указать этот путь в коде программы. Указываем не весь путь а только название созданной папки и имя файла «($"Maps/{mapName}.txt")».

Теперь, когда считали строки нам нужно перевести их в символы. Для этого нужно создать двумерный массив, где «line.Length» будет количество строк в массиве, а «line[0].Length» количество столбцов.

char[,] result = new char[line.Length, line[0].Length]

Теперь при помощи двойного цикла переносим всю информации в этот массив.

result[i, j] = line[i][j]

  • [i] - это номер строки.
  • [j] – это символ в этой строке.

Осталось найти нашего Пакмана на карте и считать его координаты. Это довольно просто. Как только при переборе каждого символа мы натыкаемся на него, то тут же записываем его координаты в переменные.

if (result[i, j] == '@')
{
positionX = i;
positionY = j;
}

Осталось отрисовать нашу карту с персонажем.

Выводим карту в консоль.

Для этого тоже создадим отдельную, коротенькую и невозвращаемую функцию «DrawMap».

static void DrawMap(char[,] map)
{
for (int i = 0; i < map.GetLength(0); i++)
{
for (int j = 0; j < map.GetLength(1); j++)
{
Console.Write(map[i, j]);
}
Console.WriteLine();
}
}

По идее здесь вопросов не должно возникнуть. Мы просто выводим наш двумерный массив в консоли.

Функция «Main»

Осталось всё прописать в функции «Main». Тут будет несколько строчек. Ведь основной код мы написали в двух функциях.

int pacmanX, pacmanY;
char[,] map = ReadMap("map0", out pacmanX, out pacmanY);
DrawMap(map);
Console.SetCursorPosition(pacmanY, pacmanX);
Console.WriteLine("@");
Console.SetCursorPosition(0, 25);

Сначала мы вводим две переменные, в которые будут записываться координаты Пакмана.

int pacmanX, pacmanY

Потом создаём двумерный массив, который равняется тому, что выдаёт наша функция чтения карты из файла «ReadMap». В скобках пишем имя карты и координаты Пакмана, которые тоже определит наша функция благодаря приставке «out».

char[,] map = ReadMap("map0", out pacmanX, out pacmanY)

Дальше, благодаря функции «DrawMap» мы выводим нашу карту в консоли «DrawMap(map)». Затем ставим курсор на координаты где должен стоять пакман и рисуем его там. Координаты ранее уже определила наша прошлая функция «ReadMap».

Всё. Последняя строчка смысловой нагрузки не несёт, и в следующей статье мы её удалим. Если вам интересно за что она отвечает, то запустите код без неё, что получится напишите в комментариях.

На этом я с вами прощаюсь до послезавтра. Постарайтесь разобраться в том, что я написал, дальше будет сложнее. По традиции ставим лайк, подписываемся и пишем вопросы в комментариях. Всем пока!

#it #разработкаигр #программированиеснуля #программированиедляначинающих #какстатьпрограммистом #csharp #сишарп