Файл: Курсовая работа по дисциплине Основы программирования систем управления (наименование дисциплины).docx
Добавлен: 04.12.2023
Просмотров: 35
Скачиваний: 2
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
| | |
МИНОБРНАУКИ РОССИИ | ||
Федеральное государственное бюджетное образовательное учреждение высшего образования «МИРЭА – Российский технологический университет» РТУ МИРЭА | ||
Институт искусственного интеллекта | ||
(наименование института, филиала) | ||
Кафедра проблем управления | ||
(наименование кафедры) |
КУРСОВАЯ РАБОТА |
по дисциплине «Основы программирования систем управления»
(наименование дисциплины)
Тема курсовой работы: «Разработка программы компьютерной игры TETRIS»
Студент группы КВБО-09-21 Шпиталь Максим Игоревич _____________________
(учебная группа, фамилия, имя, отчество студента) (подпись студента)
Руководитель курсовой работы: Морозов Александр Александрович
_______________________
(подпись руководителя)
Работа представлена к защите «___» _______________2023 г.
Допущен к защите «___» _______________ 2023 г.
Москва 2023 г.
| | |
МИНОБРНАУКИ РОССИИ | ||
Федеральное государственное бюджетное образовательное учреждение высшего образования «МИРЭА – Российский технологический университет» РТУ МИРЭА | ||
Институт искусственного интеллекта | ||
(наименование института, филиала) | ||
Кафедра проблем управления | ||
(наименование кафедры) |
| Утверждаю |
| Заведующий кафедрой ПУ _________________ /Романов М.П./ подпись ФИО |
| «___» ____________ 2022 г. |
ЗАДАНИЕ | |
на выполнение курсовой работы по дисциплине «Основы программирования систем управления» |
Студент Шпиталь Максим Игоревич Группа КВБО-09-21
Тема «Разработка программы компьютерной игры TETRIS»
Исходные данные:
-
Язык программирования C++ -
Использование средств машинной графики -
Правила игры TETRIS
Перечень вопросов, подлежащих обработке, и обязательного графического материала:
-
Блок-схема алгоритма работы программы -
Результаты тестирования и отладки
Срок представления к защите курсовой работы: до «___»_______________ 2023 г. |
|
Задание на выполнение курсовой работы выдал ____________________ (Морозов А.А.) подпись руководителя Ф.И.О. руководителя |
«___» _______________ 2023 г.
Задание на курсовую работу получи __________________ (Шпиталь М.И.)
подпись обучающегося Ф.И.О. исполнителя
СОДЕРЖАНИЕ
ВВЕДЕНИЕ 4 | 4 |
Основная часть 5 | 5 |
1. Подготовка программы 5 | 5 |
2. Стартовое окно 8 | 8 |
3. Основной алгоритм 9 | 9 |
4. Меню окончания игры 15 | 9 |
ЗАКЛЮЧЕНИЕ 17 | 10 |
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ И ЛИТЕРАТУРЫ 18 | 10 |
Приложение А 19 | 14 |
| 15 |
| 16 |
| 20 |
| 27 |
| 29 |
ВВЕДЕНИЕ
В настоящее время компьютерные игры являются одним из известнейших развлечений не только в кругу молодёжи, но также и среди людей старшего поколения. Наибольшую популярность они приобрели весной две тысячи двадцатого года, когда люди, запертые в четырёх стенах на самоизоляции, искали способы весело и интересно скоротать время дома.
Тетрис – это изобретённая и разработанная советским программистом Алексеем Пажитновым в тысяча девятьсот восемьдесят четвертом году головоломка, которая знакома практически каждому человеку. Даже спустя тридцать восемь лет она не потеряла своей популярности, и стоит на первом месте списка «Лучших игр всех времён» по мнению журнала Time.
Правила игры в Тетрис довольно просты: в изначально пустом поле поочерёдно «падают» различные фигурки, состоящие из нескольких квадратов. Игрок может перемещать их влево или вправо в пределах поля, а так же поворачивать на девяносто градусов. Фигурка может опускаться до тех пор, пока не окажется на дне поля, либо на другой фигурке. Если фигурки образуют заполненную линию, то есть, в пределах одного из рядов поля не окажется ни одного пустого места, то линия удаляется и все ряды над ней опускаются на позицию ниже. Теоретически игра может продолжаться бесконечно, но на практике она заканчивается, когда новая фигурка не может поместиться в стакан. Поэтому задачей игрока является заполнение рядов фигурками таким образом, чтобы игра длилась как можно дольше.
ОСНОВНАЯ ЧАСТЬ
-
Подготовка программы
Для представления в коде фигурок( тетрамино) использован двумерный массив с 7-ю строками (по числу фигур) и 4-мя столбцами, задающими форму каждой конкретной фигуры. Игровое поле также можно представить в виде целочисленного массива field[M][N] где M — это высота поля, а N — его ширина.
Чтобы отобразить фигуры на игровом поле создана структура Point, которая будет представлять точку с целыми координатами и два вспомогательных массива a[], b[]:
int figures[7][4] = // Массив фигурок-тетрамино
{
1,3,5,7, // I
2,4,5,7, // Z
3,5,4,6, // S
3,5,4,7, // T
2,3,5,7, // L
3,5,7,6, // J
2,3,4,5, // O
};
struct Point
{
int x, y;
}a[4], b[4];
Так же для проверки тетрамино на выход за границы игрового поля и свободна ли ячейка создана функция
check(). Функция проверки тетрамино на выход за границы игрового поля довольно-таки простая и состоит из двух условий if(): первое условие if() проверяет, не вышли ли мы за границы поля слева, справа и снизу. Так как мы движемся сверху вниз, то выйти за границу сверху мы не можем, соответственно, проверять её нет смысла; второе условие if() проверяет, свободна ли сейчас ячейка, расположенная на пути движения, или занята другими тетрамино.
// Проверка на выход за границы игрового поля
bool check()
{
for (int i = 0; i < 4; i++)
if (a[i].x < 0 || a[i].x >= N || a[i].y >= M) return 0;
else if (field[a[i].y][a[i].x]) return 0;
return 1;
};
Установим условную границу, при пересечении которой игра будет проиграна, для этого создана функция endGame(). Параметром она принимает указатель на объект класса RenderWindow. При пересечении условной границы так же будет вызвана функция close() у объекта, переданного в функцию:
bool endGame(RenderWindow* window)
{
for (int i = 0; i < N; i++)
{
if (field[2][i])
{
window->close();
return false;
}
}
}
Для отображения фигур, меню старта, меню окончания игры созданы текстуры и спрайты:
// Создание и загрузка текстуры
Texture texture,
texture_background,
texture_frame,
texture_start,
texture_game_over;
texture.loadFromFile("tiles.png");
texture_background.loadFromFile("background.png");
texture_frame.loadFromFile("frame.png");
texture_start.loadFromFile("start.png");
texture_game_over.loadFromFile("game_over.png");
// Создание спрайта
Sprite sprite(texture),
sprite_background(texture_background),
sprite_frame(texture_frame),
sprite_start(texture_start),
sprite_game_over(texture_game_over);
Теперь нужно выделить из спрайта тетрамино отдельный квадратик, чтобы можно было его использовать для построения нужных нам фигур Тетриса. Для этого воспользуемся методом setTextureRect().
Затем введены переменные, которые будут использоваться в течение работы программы для отображения различных состояний или вычислений: dx типа int и rotate типа bool, которым присваиваем значение нуля – горизонтального перемещения и вращения соответственно; colorNum, которой присваиваем значение единицы типа int – разноцветности тетрамино; beginGame
типа bool, которой присваиваем значение true – первое появление фигурки на поле; n типа int, которой присваивается рандомное значение от нуля до 6; timer, которому присваиваем значение нуля, delay, которому присваиваем значение 0,3 типа float, clock объект класса Clock – перемещение фигурок; IsRun – состояние игры( в процессе или окончание).
// Переменные для горизонтального перемещения и вращения
int dx = 0; bool rotate = 0;
int colorNum = 1;
bool beginGame = true;
int n = rand() % 7;
// Переменные для таймера и задержки
float timer = 0, delay = 0.3;
Clock clock;
bool IsRun = true;
-
Стартовое окно
Для удобства использования программы было разработано стартовое окно window0. Размер меню 320 на 480 пикселей и в заголовке задано название игры– Tetris.
Чтобы постоянно обрабатывать события созданного цикла, условием которого будет window0.isOpen() – открыто ли окно. Для обработки событий вводим переменную event и в зависимости от того, какая клавиша была нажата будут обрабатываться события: при нажатии пробела меню будет закрыто и программа перейдёт к следующему циклу, при нажатии же на крестик приложение будет закрыто:
while (window0.isOpen())
{
Event event;
while (window0.pollEvent(event))
{
// Пользователь нажал на «крестик»
if (event.type == Event::Closed)
{
window0.close();
return 0;
}
}
window0.clear(Color::White);
window0.draw(sprite_start);
window0.display();
if (Keyboard::isKeyPressed(Keyboard::Space))
{
window0.close();
break;
}
}
-
Основной алгоритм
Для начала создано окно window, размер которого так же составляет 320 на 480 пикселей и в заголовке задано название игры – Tetris. Основной алгоритм выполняется в цикле, условием которого является состояние окна( открыто ли оно или нет) и переменная IsRun типа bool отслеживающая условие пересечения фигурами условной границы, при пересечении которой, игра будет проиграна.
В начале цикла присваиваем переменной IsRun состояние функции endGame(), параметром которой задаём ссылку на окно window. При значении false у IsRun цикл будет остановлен:
RenderWindow window(VideoMode(320, 480), "Tetris");
// Цикл игры. Выполняется, пока открыто окно
while (window.isOpen() && IsRun)
{
IsRun = endGame(&window);
if (!IsRun)
{
break;
}
Дальше переменной time присваиваем значение времени, прошедшего с начала отсчета с помощью функции getElapsedTime(), и конвертированного в секунды с помощью функции asSeconds(). Таким образом создан