Всем Хай! Как я и обещал в прошлой статье, мы начнём делать игру «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;
}
}
}
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 #сишарп