1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 |
//C++ 3.1 Листинг #1 MS-DOS Лабиринт #include <graphics.h> //Подключаем графическую библиотеку #include <stdlib.h> //Библиотека содержит функцию exit #include <stdio.h> //Библиотека содержит функцию printf #include <conio.h> //Библиотека содержит функцию getch enum Direction {LEFT, UP, RIGHT, DOWN}; //Перечисляемый тип - направления движения const int Width = 15; //Ширина поля в клетках const int Height = 15; //Высота поля в клетках const int CellSize = 30; //Размер клетки в пикселах int Cell[Width][Height]= //Задаем массив клеток поля { {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, {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 < (Width - 1); i++){ //Рисуем вертикальные линии сетки line(i * CellSize, 1, i * CellSize, Height * CellSize); } for (i = 1; i <= (Height - 1); i++){ //Горизонтальные линии line(1, i * CellSize, Width * CellSize, i * CellSize); } setfillstyle(1, WHITE); //Устанавливаем стиль заливки for (i = 0; i < Width; i++){ for (int j = 0; j < Height; 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[Width][Height], Direction dir); //Движение "персонажа". Аргументы - массив клеток поля и //направление движения }; CharacterClass::CharacterClass() { Radius = 15; X = 7; Y = 0; //Устанавливаем начальные координаты - //на одной из свободных клеток поля } void CharacterClass::Draw() { setcolor(BLUE); //Устанавливаем цвет линии окружности... setfillstyle(1, BLUE); //...и цвет внутренней заливки fillellipse((2 * X + 1) * Radius, (2 * Y + 1) * Radius, Radius, 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[Width][Height], Direction dir) { Erase(); //Перед перемещением закрашиваем текущее положение switch(dir) //В зависимости от направлении движения... { //...если клетка-цель пуста и не будет выхода за пределы поля, //перемещаем "персонаж" case LEFT: if ((X > 0) && Cell[X - 1][Y] != 1){ X--; } break; case UP: if (Y > 0 && Cell[X][Y - 1] != 1){ Y--; } break; case RIGHT: if (X < Width && Cell[X + 1][Y] != 1){ X++; } break; case DOWN: if (Y < Height && Cell[X][Y + 1] != 1){ Y++; } break; } Draw(); //Рисуем в новом положении } int main() { int gdriver = DETECT, gm; initgraph(&gdriver, &gm, ""); //Функция инициализирует графику 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(); } |
Что за библиотека <graphics.h>? И в каком IDE ви писали код?
В Borland C++ 3.1
Это очень старый компилятор. Современные компиляторы эту библиотеку не поддерживают. Некоторые, может, поддерживают, но смысла в том мало.