Вы находитесь на странице: 1из 46

Министерство науки и образования РФ

федеральное государственное бюджетное образовательное учреждение высшего образования


«Омский государственный технический университет»

Факультет (институт) Информационных технологий и компьютерных систем


Кафедра Информатики и вычислительной техники

КУРСОВОЙ ПРОЕКТ

по дисциплине Программирование

на тему Разработка мультипликационной и игровой программ

Пояснительная записка

Шифр проекта

Студента (ки) Тулуш Идегел Вадимовна


фамилия, имя, отчество полностью

Курс 1 Группа ПИ-171

Направление (специальность) 09.03.03 –


Прикладная информатика
код, наименование

Руководитель к.т.н., доцент


ученая степень, звание

Шафеева О.П.
фамилия, инициалы

Выполнил (а)
дата, подпись студента (ки)
К защите
дата, подпись руководителя

Выполнение и
подготовка к Защита КП (КР) Итоговый
защите рейтинг
КП (КР)

Проект (работа) защищен (а) с оценкой

Омск 2018
АННОТАЦИЯ

Пояснительная записка к курсовому проекту 16 рис., 3 источника, 1 прил.,


43 стр.
Цель работы – разработка мультипликационной и игровой программ.
В ходе работы была разработана программа с заставкой, информации об
авторе, функциями по генерации случайных чисел и отображению их в виде
игрального кубика, функции для игры тетрис.
Программа была написана на языке программирования C++ с
использованием возможностей Windows API в среде программирования Visual
Studio 2019 с пакетом Windows SDK 10.0.18362.0, а так же с подключением
библиотеки sfml(свободная кроссплатформенная мультимедийная библиотека
написанная на C+).
Программа состоит из 5 классов и 1 главного файла с функций main. В
общем количестве - 6 файлов исходного кода и 5 заголовочных файлов.
Всего в программе 650 выполняемых строк кода. Объем скомпилированной
программы 36 864 байт.
Министерство науки и образования РФ
федеральное государственное бюджетное образовательное учреждение высшего образования
«Омский государственный технический университет»
Факультет Информационных технологий и компьютерных систем
Кафедра Информатики и вычислительной техники
Дисциплина Программирование
ЗАДАНИЕ
на выполнение курсового проекта
Студенту (ке) Тулуш Идегел Вадимовне Группа ПИ-171
фамилия, имя, отчество полностью

Направление (специальность) 09.03.03 – Прикладная информатика


код, наименование

Тема проекта Разработка мультипликационной и игровой программ


« 25 » 05 20 18 г.
Срок сдачи проекта (работы) на кафедру
Исходные данные к проекту (работе) С/С++
Содержание пояснительной записки (перечень подлежащих разработке вопросов)
Введение. 1. Постановка задач на проектирование. 2. Методика решения. 3.
Разработка алгоритмов. 4. Особенности разработки программы. 5. Инструкция
пользователя. 6. Результаты тестирования. Приложения (текст программы)

Перечень графического материала с указанием основных чертежей и (или)


иллюстративного материала Укрупненная схема алгоритма,
схемы алгоритмов для функции
Методическая литература и иные информационные источники
1. Павловская, Т. А. С/С++. Программирование на языке высокого уровня / Т. А. Павловская. – СПб.:
Питер, 2012. – 544с.
2. Восходящее и нисходящее программирование: метод. указания / ОмГТУ ; сост. О. П. Шафеева.–
Омск : Изд-во ОмГТУ, 2015. – [Электронный ресурс].
3. Программирование С/С++. Проектирование алгоритмов и программ: Метод. указания / Сост. О. П.
Шафеева: Изд-во ОмГТУ, 2017. – 32 с. – 1 эл. опт. диск (CD-ROM).
4. Программирование на языке Си: Метод. указания / Сост. О. П. Шафеева, Ю.Г. Каворина, Шукурова
Г.С.: Изд-во ОмГТУ, 2008. – 72 с. [Электронный ресурс].
5. Системы программирования: Метод. указания / Сост. О.П. Шафеева, И.А. Волчкова, С.А.Гончаров. −
Омск: ОмГТУ, 2012. – 32 с..
6. Шафеева, О.П. Технологии программирования. С++. Учебное пособие. – Омск, Изд-во ОмГТУ. 2017. –
80 с. [Электронный ресурс].

Дата выдачи « 4 » февраля 2 18 г.


задания 0

Руководитель К.т.н., доцент Шафеева О.П.


подпись дата
ученая степень, звание, ФИО

Зав. кафедрой Д.т.н., профессор Потапов В.И.


подпись дата
ученая степень, звание, ФИО

Задание принял к
исполнению студент 20 1 г.
(ка) 8
Министерство науки и образования РФ
федеральное государственное бюджетное образовательное учреждение высшего образования
«Омский государственный технический университет»

ОТЗЫВ
на курсовой проект (работу)

Факультет информационных технологий и компьютерных систем Кафедра


Информатики и вычислительной техники
Дисциплина Программирование

Тема разработка мультипликационной и игровой программ


Студент Тулуш Идегел Вадимовна
фамилия, имя, отчество полностью

Курс 1 Группа ПИ-171

Руководитель к.т.н., доцент Шафеева О.П.


ученая степень, звание, ФИО

Содержание отзыва

Спроектирована укрупненная схема алгоритма для проекта реализации программы


игры с поиском и работой с графических функций; Детализированы и разработаны
схемы алгоритмов для отдельных функций и подзадач. Разработана и отлажена
программа, реализующая следующие подзадачи:
- сведения об авторе;
- заставка «мигающий персонаж»;
- меню (графическое, текстовое);
- программа с генерацией значения на кубике;
- игра «Тетрис»;
- тестирование готового программного продукта;

Оформлена пояснительная записка.

Рейтинговые баллы за выполнение и подготовку к


защите курсового проекта (работы)
Заключение о допуске к
защите

Руководитель Дата « » 20 г.
подпись
ОГЛАВЛЕНИЕ

ВВЕДЕНИЕ……………………………………………………………………………..6

1 АНАЛИЗ ЗАДАНИЯ…………………………………………………………………7

2 РАЗРАБОТКА СХЕМ АЛГОРИТМА………………………………………………8


3 ОСОБЕННОСТИ РАЗРАБОТКИ ПРОГРАММЫ………………………………….24
4 ВХОДНЫЕ И ВЫХОДНЫЕ ДАННЫЕ…………………………………………….25
5 ХАРАКТЕРИСТИКИ ПРОГРАММЫ……………………………………………...26

6 ИНСТРУКЦИЯ ПОЛЬЗОВАТЕЛЯ…………………………………………………27
8 РЕЗУЛЬТАТЫ ТЕСТИРОВАНИЯ…...................................................................…..30
ЗАКЛЮЧЕНИЕ…...........................................................................................................32
БИБЛИОГРАФИЧЕСКИЙ СПИСОК…………………………………………………33
ПРИЛОЖЕНИЕ A............................................................................................................34
ВВЕДЕНИЕ

Программа, разрабатываемая в данной работе должна иметь 2 основные


функции: генерация случайных чисел на грани кубика и игру тетрис.

Программа с генерацией чисел – представляет собой угадывание числа,


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

Игра «Тетрис» представляет собой доску по которой движутся фигуры и в


случае если фигуры ровно выстроятся в ряд, он пропадает. Фигуры имеют разные
размеры и присутствует возможность не только их передвижения, но и
переворачивания.

6
1 - АНАЛИЗ ЗАДАНИЯ

Программа с генерацией случайных чисел и кубиком, на котором


отображается загаданное случайное число. Отображает действие с функция
графики.
Программа игры «Тетрис». Случайные фигурки тетрамино падают сверху в
прямоугольный стакан шириной 10 и высотой 20 клеток. В полёте игрок может
поворачивать фигурку на 90° и двигать её по горизонтали. Также можно
«сбрасывать» фигурку, то есть ускорять её падение, когда уже решено, куда
фигурка должна упасть. Фигурка летит до тех пор, пока не наткнётся на другую
фигурку либо на дно стакана. Если при этом заполнился горизонтальный ряд из 10
клеток, он пропадает и всё, что выше него, опускается на одну клетку.
Дополнительно показывается фигурка, которая будет следовать после текущей —
это подсказка, которая позволяет игроку планировать действия. Темп игры
постепенно ускоряется. Игра заканчивается, когда новая фигурка не может
поместиться в стакан. Игрок получает очки за каждый заполненный ряд, поэтому
его задача — заполнять ряды, не заполняя сам стакан (по вертикали) как можно
дольше, чтобы таким образом получить как можно больше очков.
В пункте об авторе содержится информация о студенте, разработавшем
курсовой проект.
Заставка являет собой анимированного персонажа посредством сдвига
текстуры которое доступно в sfml.
Меню будет управляться при помощи мыши или же можно управлять с
помощью клавиш 0,1,2,3. Правая клавиша мыши позволяет вернуться в главное меню
из любого пункта.

7
2 - РАЗРАБОТКА СХЕМ АЛГОРИТМА

Главная функция программы имеет переходы к конкретным меню,


расположенным в 5 различных классах. За то, какое меню должно быть запущено
сейчас отвечает переменная «selectedMenu». Цикл в главной функции бесконечен,
пока не закроется окно. Внутри данного цикла так же есть цикл событий, в
котором обрабатываются нажатия. Общая схема алгоритма программы
изображена на рисунке 1.

8
Рисунок 1 - Общая схема алгоритма программы.

9
Продолжение рисунка 1 – Общая схема алгоритма программы

10
Продолжение рисунка 1 – Общая схема алгоритма

11
Подпрограммы класса «menu» отвечают за вывод и обработку главного меню.
Схемы алгоритмов функций, отвечающих за вывод меню изображены на рисунках 2-3.

Рисунок 2 – Конструктор класса Menu

12
Рисунок 3 – Схема алгоритма функции передающей в окно компоненты для
рисования

13
В классе Intro реализована заставка в виде анимационного насекомого и
двигающегося текста позади.

Рисунок 4 – Схема алгоритма конструктора класса Intro

14
Рисунок 5 – Схема алгоритма функции вывода на экран

15
Игра описана в классе Game. При создании объекта происходит запись текстур и
установка начальных параметров для игры.

Рисунок 6 – Схема алгоритма конструктора класса игры

16
Рисунок 7 – Схема алгоритма функции вывода на экран игры

17
Продолжение рисунка 7 – Схема алгоритма функции вывода на экран

Продолжение рисунка 7 – Схема алгоритма функции вывода на экран

18
Рисунок 8 – Схема алгоритма проверки

19
Класс DiceRoll который представляет небольшую игру с угадыванием
загаданного числа компьютером и визуально отображающий кубик с 6 цифрами.

Рисунок 9 – Схема алгоритма конструктора класса DiceRoll

20
Рисунок 10 – Схема алгоритма главной функции класса DiceRoll

21
Продолжение рисунка 10 – Схема алгоритма главной функции класса DiceRoll

22
Продолжение рисунка 10 – Схема алгоритма главной функции класса DiceRoll

Продолжение рисунка 10 – Схема алгоритма главной функции класса DiceRoll

23
24
Класс Info. В данном классе реализован вывод текста, сообщающее информацию
об разработчике программы.

Рисунок 11 – Схема алгоритма функции класса Info

25
3 - ОСОБЕННОСТИ РАЗРАБОТКИ ПРОГРАММЫ

Программа была написана на языке программирования C++ с


использованием возможностей Windows API в среде программирования Visual
Studio 2019 с пакетом Windows SDK 10.0.18362.0. Состоит из 5 классов, каждый
из которых выполняет свою задачу. Проект содержит 11 файлов из которых 6
файлы исходного кода “.cpp” и еще 5 заголовочные файлы классов “.h”.
Подключена библиотека sfml, которая позволяет добиться сокращения количества
строк при реализации окон и элементов в нем.

Структура проекта:
* Source.cpp
* Menu.h
⇒ Menu.cpp
* Info.h
⇒ Info.cpp
* Intro.h
⇒ Intro.cpp
* Tetris.h
⇒ Tetris.cpp
* DiceRoll.h
⇒ DiceRoll.cpp

1. Главная функция «Source.cpp»- вызов остальных подпрограмм;


2. Класс «Menu» - Содержит алгоритмы главного меню;
3. Класс «Info» - Содержит меню об авторе;
4. Класс «Intro» - Заставка программы;
5. Класс «Game» – Содержит игровую подпрограмму «Тетрис»;
6. Класс «DiceRoll» - Содержит генератор чисел с визуализацией в виде кубика.

26
4 - ВХОДНЫЕ И ВЫХОДНЫЕ ДАННЫЕ

Входные данные для угадывания случайного числа:


Расположение мыши
Нажатие кнопок мыши
Выходные данные для угадывания случайного числа:
Перемещение предмета

Входные данные для игры «Тетрис»:


Нажатие клавиш
Выходные данные игры «Тетрис»:
Изменение размещения объектов

Ввод данных вводимые в программу данные проверяются. Ошибки


обрабатываются или игнорируются, в зависимости от вида ошибки ввода.

27
5 - ХАРАКТЕРИСТИКИ ПРОГРАММЫ
Требования:
Оперативная память 500 кб, а также память под консоль вывода от 8 мб.
Операционная система “Windows XP” и старше.
Свободная память - 36 864 байт на диске .

28
6 - ИНСТРУКЦИЯ ПОЛЬЗОВАТЕЛЯ
Запустите исполняемый файл «ProgrammCourse.exe». Появится заставка
(рис.12).

Рисунок 12 - Заставка

После нажатия правой кнопки мыши либо на клавишу пробел появится


главное меню(рис.13). Выбор в меню осуществляется с мышки и нажатия
мышкой на нужный пункт левой кнопкой мыши. Выход в главное меню
осуществляется правой кнопкой мыши.

Рисунок 13 – Главное меню

29
30
При выборе раздела «Кости» на экране появляются цифры и кубик с 6 цифрами.
При нажатии мышкой на цифру производится бросок. В зависимости от выбранной
цифры определяется угадал пользователь или нет и высвечивается сверху(рис. 14).

Рисунок 14 – Раздел «Кости»

При выборе раздела «Тетрис» на экране появляется доска на которой движутся


фигуры вниз и пользователь с помощью клавише стрелок может осуществить их
передвижение в рамках правил тетриса(рис. 15).

Рисунок 15 – Раздел «Тетрис»

31
При выборе раздела «Автор» на экране появится информация об разработчике
данной программы(рис. 16).

Рисунок 16 – Раздел «Автор»

32
8 - РЕЗУЛЬТАТЫ ТЕСТИРОВАНИЯ

Программа различных действий в пункте, который содержит описание


графических примитивов.

Таблица – Тестирование программы.


Ввод Ожидание Результат
Нажатие левой Запуск анимации Анимация
кнопкой мыши на кубика с числами запустилась
число
Двойное нажатие Анимация не Анимация не
на другое число должна прервалась
прерваться от
первого запуска
Нажатие правой Переход в Перешло в
кнопкой мыши главное меню главное меню
Нажатие клавиши Переход в Перешло в
пробел главное меню главное меню
Нажатие клавиши Действий Ничего не
вверх произойти не произошло
должно
Ввод 0 Запуск заставки Запустилась
заставка

33
Игра – Тетрис и результаты тестирования сведены в таблице ниже.

Таблица – Тестирование игры.


Действия Ожидание Результат
Клавиша вниз Увеличение Фигура
скорости ускоренно
движения фигуры движется
вниз вниз
Клавиша влево Фигура меняет Фигура меняет
движение влево движение влево
Клавиша вправо Фигура Фигура
меняет сдвигается
движение вправо
вправо
Клавиша вверх Поворот Фигура
движущейся повернулась
фигуры
Правая кнопка Выход из игры в Произошел
мыши главное меню выход из игры в
главное меню
Левая кнопка Ничего не Ничего не
мыши должно произошло.
произойти.
Клавиша пробел Выход из игры в Появилось
главное меню главное меню

34
ЗАКЛЮЧЕНИЕ
В данной курсовой работе разработаны алгоритмы работы с генерацией
случайных чисел и игровой программы тетрис. Программа была реализована на
языке C++ с использованием возможностей “Windows API” и библиотек sfml.
Помимо этого, в программе присутствуют меню, информация об авторе и
заставка. Цель курсового проекта была достигнута, все критерии соблюдены. В
программе выполняются все необходимые функции.

35
БИБЛИОГРАФИЧЕСКИЙ СПИСОК
1. Восходящее и нисходящее программирование: метод. указания /
ОмГТУ ;сост. О. П. Шафеева.– Омск : Изд-во ОмГТУ, 2015. – 1 эл. опт.
диск (CD-ROM).
2. Программирование на языке Си: Метод. указания / Сост. О. П. Шафеева,
Ю.Г. Каворина, Шукурова Г.С.: Изд-во ОмГТУ, 2008. - 72 с.
3. Системы программирования: Метод. указания / Сост. О.П. Шафеева, И.А.
Волчкова, С.А.Гончаров. - Омск: ОмГТУ, 2012. – 32 с.

36
ПРИЛОЖЕНИЕ A

#include <SFML/Graphics.hpp>
#include <iostream>
#include "Menu.h"
#include "Intro.h"
#include "Info.h"
#include "Tetris.h"
#include "DiceRoll.h"
/*
3.6.11 - ИГРОВЫЕ ЗАДАЧИ
Разработать программу «тетрис»

3.4.4 - ЗВУКОГЕНЕРАЦИЯ, ГРАФИКА, ДВИЖЕНИЕ, МУЛЬТИПЛИКАЦИЯ


Разработать программму-генератор случайных чисел от 1 до 6. Выдачу числа производить на грани кубика
(или вертушки).
Предусмотреть повторные бросания, вращение кубика (вертушки) и угадывание числа.
*/
using namespace sf;
int main() {
// Создаем главное окно приложения
srand(time(NULL)); // для генерация ислучайных значений
HWND hWnd = GetConsoleWindow(); // получаем хэндл консоли
ShowWindow(hWnd, SW_HIDE); // скрываем консоль
RenderWindow window(VideoMode(1000, 500), "Course project by Idegel"); // создание окна
window.setKeyRepeatEnabled(false); // отключение повторения нажатия в окне
window.setVerticalSyncEnabled(1); // включение вертикальной синхронизации
window.setFramerateLimit(60); // ограничение кадров
Menu menu(window.getSize().x, window.getSize().y); // создаем объект меню с указанием
размеров окна в параметрах
Game tetris; // создаем объект тетрис
DiceRoll dice(window.getSize().x,window.getSize().y); // создаем объект игры с костями с
указанием размеров окна в параметрах
info about(window.getSize().x, window.getSize().y); // создаем объект информации об авторе, с
передачей размеров окна
int selectedMenu = 6; // переменная которая используется для переключение отрисовок
Intro intro(window.getSize().x, window.getSize().y); // создаем объект в котором описана
заставка с передачей размеров окна
int firstrun = 1; // переменная используемся для того, чтобы в начале выводилось интро, при
первом запуске. Потом заставку можно включить нажав кнопку 0.
while (window.isOpen()) {
// Обрабатываем события в цикле
Event event;
while (window.pollEvent(event)) {
// Кроме обычного способа наше окно будет закрываться по нажатию на Escape
if (event.type == Event::Closed ||
(event.type == Event::KeyPressed && event.key.code == Keyboard::Escape))
{
window.close();
}
// Если нажата правая кнопка мыши, то будет присвоено переменной для
переключения отрисовки 6, что соотвествует отрисовку объекта "меню"
if (Mouse::isButtonPressed(Mouse::Button::Right)) {
selectedMenu = 6;
}
// аналогично, только теперь это реализовано с помощью клавиши Space
if (Event::KeyPressed == event.type && event.key.code == Keyboard::Space) {
selectedMenu = 6;
}

37
// для экономии времени, можно переключать разделы программы с помощью цифр 0-
1-2-3 (4 - это выход, поэтому нет смысла т.к. можно нажать на крестик)
// 0 - заставка, 1 - кубик с 6 числами, 2 - тетрис, 3 - информация об авторе
if (Event::KeyPressed == event.type && event.key.code == Keyboard::Num0) {
selectedMenu = 0;
}
if (Event::KeyPressed == event.type && event.key.code == Keyboard::Num1) {
selectedMenu = 1;
}
if (Event::KeyPressed == event.type && event.key.code == Keyboard::Num2) {
selectedMenu = 2;
}
if (Event::KeyPressed == event.type && event.key.code == Keyboard::Num3) {
selectedMenu = 3;
}
}
// если это первый запуск, то первым на экране будет интро. В объекте цикл
бесконечный, до нажатия кнопки Space или Правой кнопки мыши.
// После того как с того цикла произойдет выход, в заставку можно будет попасть только
нажав на кнопку 0(ноль)
if (firstrun) {
firstrun--;
intro.draw(window);
}
else {
// Очистка
window.clear();
// по переменной определяем что будет отрисовывак
switch (selectedMenu) {
case 0: intro.draw(window); // отрисовка интро
break;
case 1: dice.draw(window); // отрисовка игры с кубиком
break;
case 2: tetris.draw(window); // отрисовка игры тетрис
break;
case 3: about.draw(window); // отрисовка информации об авторе
break;
case 4: window.close(); // закрытие окна(завершение программы)
break;
default: menu.draw(window,&selectedMenu); // отрисовка в меню, по стандарту
break;
}
// вывод на экран
window.display();
}
}
return 0;
}

#pragma once
#include "SFML/Graphics.hpp"
const int max_items = 4; // максимальное
количество выбора в меню
using namespace sf;
// класс меню
class Menu
{
public:
Menu(float width, float height); // конструктор
void draw(RenderWindow& window,int* selectedMenu); // главная функция в объекте
private:
float width; // ширина

38
float height; // высота

Font font; //
шрифт
Text menutext[max_items]; // текст
Texture bgtexture; //
текстура заднего фона
Sprite bgsprite; // спрайт
заднего фона
};

#include "Menu.h"

Menu::Menu(float width, float height) {


font.loadFromFile("../19888.ttf");

this->width = width;
this->height = height;

menutext[0].setFont(font);
menutext[0].setFillColor(Color::White);
menutext[0].setString(L"Кости");
menutext[0].setPosition(Vector2f((width / 2) + 200, height / 5 * 1));

menutext[1].setFont(font);
menutext[1].setFillColor(Color::White);
menutext[1].setString(L"Тетрис");
menutext[1].setPosition(Vector2f((width / 2) + 200, height / 5 * 2));

menutext[2].setFont(font);
menutext[2].setFillColor(Color::White);
menutext[2].setString(L"Автор");
menutext[2].setPosition(sf::Vector2f((width / 2) + 200, height / 5 * 3));

menutext[3].setFont(font);
menutext[3].setFillColor(Color::White);
menutext[3].setString(L"Выход");
menutext[3].setPosition(Vector2f((width / 2)+ 200, height / 5 * 4));

bgtexture.loadFromFile("street.png");
bgsprite.setTexture(bgtexture);
}

void Menu::draw(RenderWindow& window,int *selectedMenu) {


bgsprite.setPosition(Vector2f(0, 0));
bgsprite.setScale(Vector2f(2.5f, 3.2f));
window.draw(bgsprite);
for (int i = 0; i < max_items; i++) {
if (IntRect((width / 2) + 200, height / 5 * (i+1), 100,
100).contains(Mouse::getPosition(window))) {
menutext[i].setFillColor(Color::Red);
menutext[i].setScale(1.3f, 1.3f);
if (Mouse::isButtonPressed(Mouse::Button::Left)) {
*selectedMenu = i + 1;
}
}
else {
menutext[i].setScale(1, 1);
menutext[i].setFillColor(Color::White);
}
}
for (int i = 0; i < max_items; i++) {
window.draw(menutext[i]);

39
}
}

#pragma once
#include <SFML/Graphics.hpp>
#include <Windows.h>
using namespace sf;
// класс заставки
class Intro
{
public:
Intro(float width, float height); // конструктор, параметры - размеры окна
void draw(RenderWindow& window); // главная функция в данном объекте
private:
float width; // ширина
float height; // высота
int frame; // кадр
int smooth; // переменная для плавного движения по
y
int inc; // регулирует размер переменной smooth
int dx; // смещение по x
Texture spritesheet; // текстура объекта в движении
Sprite object; // спрайт объекта
Font font; // шрифт
Text name; // имя разработчика
};

#include "Intro.h"

Intro::Intro(float width, float height) {


this->width = width;
this->height = height;
spritesheet.loadFromFile("anim.png");
object.setTexture(spritesheet);
frame = 0;
dx = 0;
smooth = 0;
font.loadFromFile("../19888.ttf");
name.setFont(font);
name.setFillColor(Color::White);
name.setString(L"Тулуш Идегел Вадимовна");
name.setPosition(Vector2f(width / 2.5f, height / 2.5f));
inc = 1;
}

void Intro::draw(RenderWindow& window){


while (1) {
if (Keyboard::isKeyPressed(Keyboard::Space)) break;
if (Mouse::isButtonPressed(Mouse::Button::Right)) break;
window.clear();
object.setTextureRect(IntRect(0 + dx, 0, 240, 280));
if (frame == 4) {
dx = 0;
frame = 0;
}
if (inc) {
smooth++;
inc = (smooth == 11) ? 0 : 1;
}
else {
smooth--;
inc = (smooth == -11) ? 1 : 0;

40
}
dx += 240;
frame++;
object.setPosition((width / 2) - 100, (height / 2) -
100 + (frame * 10));
name.setPosition(Vector2f((width / 2.5f), (height / 2.5f)
+ smooth));
window.draw(name);
window.draw(object);
Sleep(100);
window.display();
}
}

#pragma once
#include "SFML/Graphics.hpp"
using namespace sf;
// класс информации об авторе
class info
{
public:
info(float width, float height); // конструктор, параметры - размеры окна(ширина,высота)
void draw(RenderWindow& window); // главная функция, параметры - окно, которое и
используется для вывода
private:
Font font; // в данной переменной хранится шрифт
для текста используемого далее
Text textabout[2]; // массив из двух текстовых переменных
};

#include "Info.h"
info::info(float width, float height) {
font.loadFromFile("../19888.ttf");

textabout[0].setFont(font);
textabout[0].setFillColor(sf::Color::White);
textabout[0].setString(L"Тулуш Идегел Вадимовна");
textabout[0].setPosition(sf::Vector2f((width / 2)-90, height/2 - 90));

textabout[1].setFont(font);
textabout[1].setFillColor(sf::Color::White);
textabout[1].setString(L"Группа ПИ-171");
textabout[1].setPosition(sf::Vector2f((width / 2)-100, height/2));
}

void info::draw(sf::RenderWindow& window) {


for (int i = 0; i < 2; i++) {
window.draw(textabout[i]);
}
}

#pragma once
#include "SFML/Graphics.hpp"
#include <Windows.h>
#include <time.h>
#include <stdlib.h>
using namespace sf;
// игра Тетрис
class Game
{
public:
Game(); // констурктор без параметров
void draw(RenderWindow& window); // главная функци
bool check(); // функция проверки объектов в игре

41
private:
int dx; // изменение по x
int colorNum; // цвет
bool rotate; // поворот
float timer; // время
float delay; // ожидание
char st[30]; // массив для хранения строк
Font font; // шрифт
Event event; // события
Texture t1, t2; // текстуры
Sprite s, background; // задний фон
Clock clock; // время
};
#define _CRT_SECURE_NO_WARNINGS
#include "Tetris.h"
struct Point
{
int x, y;
} a[4], b[4];

const int M = 20;


const int N = 10;
int field[M][N] = { 0 };

int figures[7][4] =
{
1,3,5,7,
2,4,5,7,
3,5,4,6,
3,5,4,7,
2,3,5,7,
3,5,7,6,
2,3,4,5,
};
Game::Game() {
font.loadFromFile("../arial.ttf");
t1.loadFromFile("images/tiles.png");
t2.loadFromFile("images/background.png");
dx = 0;
rotate = 0;
colorNum = 1;
timer = 0;
delay = 0.3;
s.setTexture(t1);
background.setTexture(t2);
background.setPosition(sf::Vector2f(363, 0));
srand(time(0));
}
bool Game::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;
};

void Game::draw(sf::RenderWindow& window) {


float time = clock.getElapsedTime().asSeconds();
clock.restart();
timer += time;
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up)) rotate = true;
else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left)) dx = -1;
else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right)) dx = 1;

42
else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down)) delay = 0.05;
for (int i = 0; i < 4; i++){
b[i] = a[i]; a[i].x += dx;
}
if (!check()) {
for (int i = 0; i < 4; i++) {
a[i] = b[i];
}
}
//////Поворот//////
if (rotate){
Point p = a[1];
for (int i = 0; i < 4; i++){
int x = a[i].y - p.y;
int y = a[i].x - p.x;
a[i].x = p.x - x;
a[i].y = p.y + y;
}
if (!check()) {
for (int i = 0; i < 4; i++) {
a[i] = b[i];
}
}
}
///////Таймер//////
if (timer > delay){
for (int i = 0; i < 4; i++){
b[i] = a[i]; a[i].y += 1;
}
if (!check()){
for (int i = 0; i < 4; i++) {
field[b[i].y][b[i].x] = colorNum;
}
colorNum = 1 + rand() % 7;
int n = rand() % 7;
for (int i = 0; i < 4; i++){
a[i].x = figures[n][i] % 2;
a[i].y = figures[n][i] / 2;
}
}
timer = 0;
}

///////Проверка линий//////////
int k = M - 1;
for (int i = M - 1; i > 0; i--){
int count = 0;
for (int j = 0; j < N; j++){
if (field[i][j]) count++;
field[k][j] = field[i][j];
}
if (count < N){
k--;
}
}
dx = 0;
rotate = 0;
delay = 0.3;
/////////Отрисовка//////////
window.draw(background);
for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++) {
if (field[i][j] == 0) continue;
s.setTextureRect(sf::IntRect(field[i][j] * 18, 0, 18, 18));

43
s.setPosition(400 + (j * 18), i * 18);
s.move(28, 31);
window.draw(s);
}
}
for (int i = 0; i < 4; i++){
s.setTextureRect(sf::IntRect(colorNum * 18, 0, 18, 18));
s.setPosition(400+(a[i].x * 18), a[i].y * 18);
s.move(28, 31);
window.draw(s);
}
}

#pragma once
#include "SFML/Graphics.hpp" // для графики
#include <Windows.h> // для задержки
using namespace sf;
// Класс игры с кубиком
class DiceRoll
{
public:
DiceRoll(float width,float height); // конструктор в котором указываются начальные
параметры объекта, а так же в качестве параметров размеры окна
void draw(RenderWindow& window); // главная функция в этом объекте, вся логика происходит
тут
private:
float width; // ширина окна
float height; // высота окна
int number; // число которое выбрал пользователь наугад
int isUp; // поднимается ли куб. Для анимации по Y (0 или 1)
int isWin; // угадал ли число пользователь (0 или 1 иными словами)
int frame; // кадр. Всего рассчитано 14 кадров на любой исход
int dx; // изменение по x при считывании кадров с текстуры
int dy; // изменение по y при полете и так же используется в
переворачивании
int col; // отвечает за положение чтения с текстуры по x
int row; // отвечает за чтение с текстуры по y
int result; // сгенерированное число компьютером, которое должен угадать
пользователь
Texture spritesheet; // текстура с анимациями переворачивания кубика с 6 числами
Sprite dice; // спрайт на который накладывается текстура
Font font; // шрифт для последующего использования в тексте
Text winText; // текст победы
Text loseText; // текст поражения
Text choise[6]; // текст который представляет собой 6 цифр
};

#include "DiceRoll.h"
char num[6] = { '1','2','3','4','5','6' };
DiceRoll::DiceRoll(float width,float height) {
font.loadFromFile("../19888.ttf");
this->width = width;
this->height = height;
winText.setFont(font);
winText.setFillColor(Color::White);
winText.setString(L"Вы угадали");
number = 0;
result = 0;
loseText.setFont(font);
loseText.setFillColor(Color::Red);
loseText.setString(L"Вы не угадали");
frame = 0;
row = 0;
col = 0;

44
for (int i = 0; i < 6; i++) {
choise[i].setFont(font);
choise[i].setFillColor(Color::Yellow);
choise[i].setString(num[i]);
}
spritesheet.loadFromFile("images/diceroll.png");
dice.setTexture(spritesheet);

dx = 94;
dy = 0;
isUp=1;

winText.setPosition(Vector2f(width / 2.5f, height / 15.5f));


loseText.setPosition(Vector2f(width / 2.7f, height / 15.5f));
for (int i = 0; i < 6; i++) {
choise[i].setPosition(Vector2f((width / 3) + (55 * i), height / 7));
}
}

void DiceRoll::draw(RenderWindow& window) {


if (number){
result = result > 0 ? result:1+(rand()%6);
switch (result) {
case 1: row = 0;
break;
case 2: row = 100;
break;
case 3: row = 200;
break;
case 4: row = 300;
break;
case 5: row = 390;
break;
case 6: row = 500;
break;
}

if (frame == 14) {
dx = 0;
isWin = (number == result) ? 1 : 0;
number = 0;
result = 0;
}

if (dy > -60 && isUp) {


dy -= 10;
}
else if (dy != 0) {
isUp = 0;
dy += 10;
}
dice.setTextureRect(IntRect(10 + col, 0 + row, 90, 100));
dice.setPosition(Vector2f((window.getSize().x / 2.5f) + (col / 10),
(window.getSize().y / 2.5f) + dy));
dice.setRotation(dy);
window.draw(dice);

Sleep(100);
if (dx > 0) {
frame++;
col += dx;
}
}
else {

45
for (int i = 0; i < 6; i++) {
if (IntRect(choise[i].getPosition().x, choise[i].getPosition().y, 25,
50).contains(Mouse::getPosition(window))) {
choise[i].setFillColor(Color::Red);
if (Mouse::isButtonPressed(Mouse::Button::Left)) {
number = i + 1;
frame = 0;
col = 0;
dx = 94;
isUp = 1;
}
}
else {
choise[i].setFillColor(Color::Yellow);
}
}
if (frame == 14) {
if (isWin) {
window.draw(winText);
}
else {
window.draw(loseText);
}
}
dice.setTextureRect(IntRect(10 + col, 0 + row, 90, 100));
dice.setPosition(Vector2f((window.getSize().x / 2.5f) + (col / 10),
(window.getSize().y / 2.5f) + dy));
dice.setRotation(dy);
window.draw(dice);
}

for (int i = 0; i < 6; i++) {


window.draw(choise[i]);
}
}

46