Простейшая игра "движение в лабиринте"

#include //Подключаем графическую библиотеку
#include //Библиотека содержит функцию exit
//(см. GraphInit)
#include //Библиотека содержит функцию printf
//(см. GraphInit)
#include //Библиотека содержит функцию getch

Enum Direction {LEFT, UP, RIGHT, DOWN};
//Перечисляемый тип - направления движения

Const int Width = 15; //Ширина поля в клетках
const int Height = 15; //Высота поля в клетках
const int CellSize = 30; //Размер клетки в пикселах

Int Cell={ //Задаем массив клеток поля

{1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
{1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1},
{1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1},
{1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1},
{1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1},
{1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1},
{0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0},
{1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1},
{1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1},
{1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1},
{1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1},
{1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1},
{1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1},
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
}; //Ноль - клетка свободна, единица - клетка занята

Void DrawField() //Функция, рисующая поле
{
setcolor(WHITE); //Устанавливаем цвет линий
rectangle(0, 0, 30 * Width, 30 * Height); //Внешняя граница поля
for (int i = 1; i //Рисуем вертикальные линии сетки
line(i * CellSize, 1, i * CellSize, Height * CellSize);
for (i = 1; i line(1, i * CellSize, Width * CellSize, i * CellSize);
setfillstyle(1, WHITE); //Устанавливаем стиль заливки
for (i = 0; i for (int j = 0; j if (Cell[i][j] == 1) //Рисуем все занятые клетки
bar(i * CellSize, j * CellSize, (i + 1) * CellSize,
(j + 1) * CellSize);
}

Class CharacterClass //Класс "Персонажа"
{
int Radius; //Радиус круга
int X, Y; //Положение на поле
public:
CharacterClass(); //Конструктор класса
void Draw(); //Функция, рисующая "персонаж"
void Erase(); //Функция, стирающая "персонаж"
void Move(int Cell, Direction dir);
//Движение "персонажа". Аргументы - массив клеток поля и
//направление движения
};
CharacterClass::CharacterClass()
{
Radius = 15;
X = 7; Y = 0; //Устанавливаем начальные координаты -
//на одной из свободных клеток поля
}
void CharacterClass::Draw()
{
setcolor(BLUE); //Устанавливаем цвет линии окружности...
setfillstyle(1, BLUE); //...и цвет внутренней заливки
Radius); //Окружность с закрашенной внутренней областью
}
void CharacterClass::Erase()
{
setcolor(BLACK); //Устанавливаем цвета фона
setfillstyle(1, BLACK);
fillellipse((2 * X + 1) * Radius, (2 * Y + 1) * Radius, Radius,
Radius);
}
void CharacterClass::Move(int Cell, Direction dir)
{
Erase(); //Перед перемещением закрашиваем текущее положение
switch(dir) //В зависимости от направлении движения...
{ //...если клетка-цель пуста и не будет выхода за пределы поля,
//перемещаем "персонаж"
case LEFT: if ((X > 0) && Cell[Y] != 1) X--; break;
case UP: if (Y > 0 && Cell[X] != 1) Y--; break;
case RIGHT: if (X case DOWN: if (Y }
Draw(); //Рисуем в новом положении
}

Void main()
{
//Текст функции расположен по ссылке.
//Функция инициализирует графику

Int exitOk = 0; //Флаг, означающий выход из программы
char c; //Считываемый с клавиатуры символ

DrawField(); //Сначала рисуем поле

CharacterClass Character;
Character.Draw(); //Рисуем "персонаж"

While (!exitOk)
{
c = getch(); //Считываем с клавиатуры символ
switch (c) //Если была нажата клавиша-стрелка,..
{ //...перемещаем "персонаж"
case 27: exitOk = !0; //Выход по "Escape"
case 75: Character.Move(Cell, LEFT); break;
case 72: Character.Move(Cell, UP); break;
case 77: Character.Move(Cell, RIGHT); break;
case 80: Character.Move(Cell, DOWN); break;
}
DrawField(); //После перемещения вновь рисуем поле
}
closegraph();

Статьи по теме: