Автор Анна Евкова
Преподаватель который помогает студентам и школьникам в учёбе.

«Создание игровой программы на языке С++

Содержание:

ВВЕДЕНИЕ

Данная курсовая работа направлена на изучение принципов объектно-ориентированного программирования. Создание игровой программы на языке С++, реализующей игру «Змейка», мы постараемся разобраться в различных аспектах создания и использования языка С++.

Объектно-ориентированное программирование представляет собой четь более автоматизированный способ программирования. В основы ООП взято, что программа состоит из групп объектов, часто связанных между собой.

Программа «Змейка» - чисто игровая программа, предназначенная для принесения игровых потребностей пользователя. Для нее потребуется только клавиатура и не большая скорость нажатия на клавиши, так, как только пользователь сможет управлять головой змеи для поедания фруктов и увеличивая своего тела, и игрового счета. Игра прекратиться, как только мы врежемся сами в себя или после победы.

Глава 1. Постановка задач

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

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

Глава 2. Разработка алгоритма

2.1 Описание целей

Алгоритм:

1) Описываются переменные и константы

2) Выбор начальных координат случайным образом

3) Прорисовка начального положения

4) Генерация на поле яблок случайным образом

5) Проверка: не появилось ли яблоко на черве

6) Управление «Змейкой» с клавиатуры

7) Проверка: не укусила ли змейка сама себя, если укусила, то выводиться информационное окно

8) Проверка: не съела ли змейка яблоко, если съела, то наращиваем ей хвост

9) Перерисовка «Змейки»

В итоге должен получиться вариант игры змейка, который будет содержать:

1) «Змейка», которая может двигаться в ограниченной плоскости.

2) Пользователь, который должен управлять данной «Змейкой».

3) «Змейка» должна увеличиваться в размерах при соприкосновении с фруктом

4) При поедании фрукта будет начислять некоторое количество баллов, заданных программистом для победы.

5) Погибать при столкновении со своим увеличивающимся хвостом.

6) При выходе за границы «Змейка» будет перемещена в противоположную сторону, в которую она зашла.

2.2 Выбор языка программирования

Язык С++ считается в реальное время более все-распространённым и многообещающим языком программирования. К важным свойственным свойствам С++ следует отнести прежде всего сильную помощь объектно-ориентированного подхода к разработке программ и механизма параметризации типов и алгоритмов. Широкий диапазон типов и развитие способности построения пользовательских типов дают возможность правильно отражать особенности предметной области. Развитые схемы преобразования и приведения типов дают возможность гарантировать необходимый компромисс между жесткой типизацией и эффективностью выполнения программ.

С++ считается прямым преемником языка С и практически подключает его как подмножество. Тем самым, С++ имеет полностью отлично зарекомендовавшую себя классическую модель вычисления языка С, в том числе, развитый обще-алгоритмический базис, широкие способности конструирования новых типов и гибких способов работы с памятью, охватываю арифметику над указателями. Если говорить во вкратце, С++ становиться инструментом промышленного программирования в общемировом масштабе.

Наиболее важное понятие языков объектно-ориентированного программирования – это понятие объекта (object). Объект – это логическая единица, которая содержит данные и правила (методы) обработки этих данных. В языке С++ в качестве этих правил обработки выступают функции, т. е. объект в Borland C++ объединяет в себе данные и функции, обрабатывающие эти данные. Одним из самых ключевых понятий языка С++ считается понятие класса. В языке С++ для того, чтобы классифицировать объект, надо сначала классифицировать его форму с помощью ключевого слова. Всякий объект языка С++ содержит однообразные атрибуты и функциональность с другими объектами того же класса. За создание собственных классов и поведения объектов этих классов полную ответственность несет сам разработчик программного обеспечения. Работая в некоторой среде, разработчик программного обеспечения получает доступ к обширным библиотекам стандартных классов. Как правило, объект располагается в некотором уникальном состоянии, определяемом текущими значениями его атрибутов.

Глава 3. Кодирование

3.1 Программирование задачи

На данном этапе производим написание кода исходной программы, которая будет находиться в приложение А (Исходный код программы «Змейка»), после постановления задач и составления алгоритма решения, используемый алгоритм в итоге будет записан на выбранном языке программирования (C++).

Структура – это группа данных различны типов и назначения, которая предполагают собой единый информационный элемент [3].

В нашем коде структура и объявление структуры представляет в виде:

struct Zmeja – структура змейки

{COORD *t; - точки

int PCount; - количество яблок

};

Любой элемент данных, называемый полем, содержит разное назначение. Одно поле содержит точки, другое количество фруктов. Впрочем, все эти поля связаны между собой, потому что относятся к одному и тому же объекту – змейка. Поскольку в объектах также возможно хранить группы разнотипных данных, то они также содержат структуры. Различие структуры от класса в том, что в структуре нет закрытых и защищенных членов. Все члены структуры не закрыты.

Вообще объявление структуры аналогично объявлению класса, но вместо ключевого слова class пишется ключевое слово Struct:

struct <идентификатор>

{

<Объявление данных или объектов>

};

Объявление структуры не предполагает создание объекта или же переменной. Объявление – это элементарно описание будущего объекта, в данном случае объекта – змейка. Дабы применить объект определенного класса или же переменную определенного типа их сначала необходимо объявить в качестве объекта этого класса или же переменной этого типа.

3.2 Описание библиотек

1. iostream – заголовочный файл с классами, функциями и переменными для организации ввода- вывода в языке программирования С++. Он включен в стандартную библиотеку С++ [4].

2. time.h – заголовочный файл стандартной библиотеки языка программирования С, содержит типы и функции для работы с датой и временем [4].

3. stdio.h – заголовочный файл стандартной библиотеки языка С, содержит определение макросов, констант и объявления функций, и типов, используемых для различных операций стандартного ввода и вывода [4].

4. windows.h – подключает использования функционала для предоставляемой операционной системой (Windows 95, 98, NT, 2000, XP) [4].

5. conio.h – заголовочный файл, используемый в старых компиляторах, работающих в операционных системах MS-DOS, для создания текстового интерфейса пользователя [4].

6. math.h – заголовочный файл стандартной библиотеки языка программирования С, разработанный для выполнения простых математических операций [4].

7. io.h – это библиотека с определениями низкоуровневых функций ввода и вывода [4].

8. fcntl.h – это библиотека обеспечивает контроль над дескрипторами [4].

9. string.h – заголовочный файл стандартной библиотеки языка С, содержащий функции для работы с нуль – терминированными строками и различными функциями работы с памятью [4].

3.3 Описание функций

Функция разброски яблок.

void PlusJabloko(Game &g){}

1. Процесс int x, y, I;

2. Заводится цикл while, в котором задаем координаты объекта – фрукта.

x = rand() % 56 + 3;

y = rand() % 19 + 3;

3. Проверяется объект- фрукт, попало ли оно на объект – змейку.

4. Если объект – фрукт пресекся с объектом – змейка.

5. Если объект – фрукт не пресекся с объектом – змейка, то запоминается позиция объект – фрукт.

6. Переносится курсор в последнею успешную позицию.

7. Присваивается цвет объекту – фрукту.

8. Присваивается изображение объекту – фрукт

printf("@", 6);

Функция старта змейки ее координат и скорость.

void skorostGame(Game & g){}

1. Задается точки – размер объекта – змейка.

2. После создания позиция запоминается.

3. Задается скорость передвижения объекта – змейка.

4. Выполняется рисунок объекта - фрукт.

Функция для выполнения рисунков и движений объектам.

int Move(Game & g){}

1. Вводятся координаты головы объекта – змейка.

2. Вводятся координаты хвоста объекта – змейка.

3. Проверяется следующая точка по направлению объекта – змейка.

4. Проверяется объект – змейка и объект – стена, не пересек ли объект – змейка с объектом – стена.

- При соприкосновении с объектом – стена выводится сообщение «GAME OVER» и производится выход, как видно на рисунке 2.

- При не соприкосновении с объектом – стена игра продолжается.

5. Выполняется проверка объекта – змейка не соприкоснулся он сам собой.

- При соприкосновении выводиться сообщении «GAME OVER» и производится выход, как видно на рисунке 3.

- При не соприкосновении игра продолжается.

6. При поедании объекта – фрукт производиться перекомпиляция объекта – змейка путем увеличения ее длины на одну точку.

7. Появляется новый массив, больший на одну единицу.

8. После съедания объекта – фрукт, закрашивается в цвет объекта – змейка.

9. Происходит закрашивание хвоста объекта – змейка в зеленый цвет.

10. Производиться закрашивание головы объекта – змейка в белый цвет.

Функции управления экранными объектами.

1. Goto X Y () – это функция размещения объекта по координатам х и у.

2. Move (Game &g) – это функция отвечает за движение и прорисовку объектов.

3. PlusJabloko (Game &g) – это функция, отвечающая за случайный разброс фруктов по полю.

4. skorostGame (Game &g) – это функция, отвечающая за старт объекта – змейка, а также её координат и скорости.

5. SetColor (ConsoleColor text, ConsoleColor background) – это функция, отвечающая за изменения цвета текста и объектов.

6. STENA_2 () – это функция, отвечающая за прорисовку объекта – стена, с координатами х и у.

7. ZmejaStart () – это функция, отвечающая за старт игры.

8. Main () – это функция создания основной формы.

3.4 Графический интерфейс

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

Так же в данном коде мы использовали цвета (Pink Blue, Green Cyan, Red, Magenta, Brown, LightGray, DarkGray, LightBlue, LightGreen, LightCyan, LightRed, LightMagenta, Yellow, White), для закрашивания экранных объектом разными цветами. В одном объекте могут присутствовать два цвета, внутренний и цвет контура. Ведь по умолчанию интерфейс программы будет белым и черным.

Глава 4. Тестирование программы

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

Попробуем вывести змейку за пределы поля, результат мы видим на рисунке 2.

Выводиться сообщение о проигрыше

Теперь попробуем столкновение змейки со своим хвостом, и мы увидим результат на рисунке 3.

Выводиться сообщение о проигрыше

Осталось только закончить игру, окончание мы увидим на рисунке 4.

Выводиться сообщение о выигрыше

ЗАКЛЮЧЕНИЕ

В процессе выполнения данного курсового проекта были закреплены познания по применению классов и применению основ объектно-ориентированного программированию.

Конец игры предусмотрен лишь в одном случаи: при поедании 75 фруктов. Также в процессе написания программы были рассмотрены все варианты неправильной работы программы, к примеру: не находиться ли головы змеи на фрукте или не пресекает ли голова змеи заданное игровое поле. Все эти проблемы были выявлены и благополучно устранены.

Также мной были получены новые познания в области написания объектно-ориентированных программ, разработке классов и работе с ними.

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

1. C/C++. Программирование на языке высокого уровня. Павловская Т.А. СПб.: Питер, 2004. – 461 с.

2. Структуры и алгоритмы обработки данных., Учебное пособие для вузов. Лойко В.И. – Краснодар: КубГАУ, 2004. – 261 с.

3. С/С++. Структурное и объектно-ориентированное программирование: Практикум. Павловская Т.А., Щупак. Ю.А – СПб.: Питер, 2011. -352 с.

4. Языки программирования С++, Страуструп Б., Бином, 2011. – 1136 с.

5. Основы алгоритмизации и программирования, Семакин И.Г., Шестаков А.П., – 3-е изд. -М., 2016. – 304 с.

6. С++ экспресс курс: Учебник., Лаптем В.В. – СПб.: Питер, 2004. – 512 с.

7. С++ учебный курс: Учебник., Франка П. – СПб.: Питер, 2005. – 522 с.

ПРИЛОЖЕНИЕ

ПРИЛОЖЕНИЕ А

Исходный код программы С++ игры «Змейка»

#include <iostream>

#include <time.h>

#include <stdio.h>

#include <windows.h>

#include <conio.h>

#include <math.h>

#include <io.h>

#include <fcntl.h>

#include <string.h>

using namespace std;

HANDLE hConsole;

//HANDLE hStdout, hStdin;

HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

GotoXY(int X, int Y)

{

COORD coord = { X, Y };

SetConsoleCursorPosition(hStdOut, coord);

}

enum ConsoleColor

{

Pink = 0,

Blue = 1,

Green = 2,

Cyan = 3,

Red = 4,

Magenta = 5,

Brown = 6,

LightGray = 7,

DarkGray = 8,

LightBlue = 9,

LightGreen = 10,

LightCyan = 11,

LightRed = 12,

LightMagenta = 13,

Yellow = 14,

White = 15

};

void SetColor(ConsoleColor text, ConsoleColor background)

{

SetConsoleTextAttribute(hStdOut, (WORD)((background << 4) | text));

}

struct Zmeja

{

COORD* t;

int PCount;

};

enum uprawlenie { LEFT, UP, RIGHT, DOWN };

struct Game

{

Zmeja gaduka;

COORD jabloko;

int dx, dy,

pause;

int nap;

};

void PlusJabloko(Game & g)

{

int i, x, y;

int n = g.gaduka.PCount;

do

{

x = rand() % 56 + 3;

y = rand() % 19 + 3;

for (i = 0; i < n; i++)

{

if (x == g.gaduka.t[i].X && y == g.gaduka.t[i].Y)

break;

}

}

while (i < n);

g.jabloko.X = x;

g.jabloko.Y = y;

SetConsoleCursorPosition(hConsole, g.jabloko);

SetConsoleTextAttribute(hConsole, 0x0c);

printf("@", 6);

}

void skorostGame(Game & g)

{

system("cls");

g.gaduka.PCount = 3;

g.gaduka.t = new COORD[3];

for (int i = 0; i < 3; i++)

{

g.gaduka.t[i].X = 20 + i;

g.gaduka.t[i].Y = 20;

}

g.dx = 1;

g.dy = 0;

g.pause = 100;

PlusJabloko(g);

}

void ZmejaStart()

{

GotoXY(10, 15); cout << "Собирай больше фруктов " << endl;

}

void STENA_2()

{

SetColor(LightGreen, Pink); GotoXY(20, 0); cout << "Игра Змейка!!" << endl;

GotoXY(64, 2); cout << "Данные:" << endl;

GotoXY(64, 3); cout << "Фруктов собрано:0" << endl;

GotoXY(64, 4); cout << "Длина змейки:3" << endl;

GotoXY(64, 5); cout << "Скорость:0" << endl;

GotoXY(64, 7); cout << "Управление:" << endl;

GotoXY(64, 8); cout << "Esc:Выход" << endl;

GotoXY(64, 9); cout << "P:Пауза" << endl;

GotoXY(64, 10); cout << "K:Старт" << endl;

GotoXY(64, 13); printf("%c", 24); cout << ":Вверх" << endl;

GotoXY(64, 14); printf("%c", 25); cout << ":Вниз" << endl;

GotoXY(64, 15); printf("%c", 27); cout << ":Влево" << endl;

GotoXY(64, 16); printf("%c", 26); cout << ":Вправо" << endl;

{

SetColor(LightCyan, Pink);

GotoXY(2, 2);

int m = 0;

for (m = 0; m < 60; m++)

{

printf("#");

}

}

{

GotoXY(2, 24);

int m = 0;

for (m = 0; m < 60; m++)

{

printf("#");

}

}

{

GotoXY(2, 3); cout << "#" << endl;

GotoXY(2, 4); cout << "#" << endl;

GotoXY(2, 5); cout << "#" << endl;

GotoXY(2, 6); cout << "#" << endl;

GotoXY(2, 7); cout << "#" << endl;

GotoXY(2, 8); cout << "#" << endl;

GotoXY(2, 9); cout << "#" << endl;

GotoXY(2, 10); cout << "#" << endl;

GotoXY(2, 11); cout << "#" << endl;

GotoXY(2, 12); cout << "#" << endl;

GotoXY(2, 13); cout << "#" << endl;

GotoXY(2, 14); cout << "#" << endl;

GotoXY(2, 15); cout << "#" << endl;

GotoXY(2, 16); cout << "#" << endl;

GotoXY(2, 17); cout << "#" << endl;

GotoXY(2, 18); cout << "#" << endl;

GotoXY(2, 19); cout << "#" << endl;

GotoXY(2, 20); cout << "#" << endl;

GotoXY(2, 21); cout << "#" << endl;

GotoXY(2, 22); cout << "#" << endl;

GotoXY(2, 23); cout << "#" << endl;

}

{

GotoXY(61, 3); cout << "#" << endl;

GotoXY(61, 4); cout << "#" << endl;

GotoXY(61, 5); cout << "#" << endl;

GotoXY(61, 6); cout << "#" << endl;

GotoXY(61, 7); cout << "#" << endl;

GotoXY(61, 8); cout << "#" << endl;

GotoXY(61, 9); cout << "#" << endl;

GotoXY(61, 10); cout << "#" << endl;

GotoXY(61, 11); cout << "#" << endl;

GotoXY(61, 12); cout << "#" << endl;

GotoXY(61, 13); cout << "#" << endl;

GotoXY(61, 14); cout << "#" << endl;

GotoXY(61, 15); cout << "#" << endl;

GotoXY(61, 16); cout << "#" << endl;

GotoXY(61, 17); cout << "#" << endl;

GotoXY(61, 18); cout << "#" << endl;

GotoXY(61, 19); cout << "#" << endl;

GotoXY(61, 20); cout << "#" << endl;

GotoXY(61, 21); cout << "#" << endl;

GotoXY(61, 22); cout << "#" << endl;

GotoXY(61, 23); cout << "#" << endl;

}

}

enum { KONEC, STENA, PLUS, MOVE };

int Move(Game & g)

{

int& n = g.gaduka.PCount;

COORD head = g.gaduka.t[n - 1];

COORD tail = g.gaduka.t[0];

COORD next;

next.X = head.X + g.dx;

next.Y = head.Y + g.dy;

if (next.X < 3 || next.Y < 3 || next.X > 60 || next.Y > 23)

return STENA;

if (n > 4)

{

for (int i = 0; i < n; i++)

if (next.X == g.gaduka.t[i].X && next.Y == g.gaduka.t[i].Y)

return KONEC;

}

if (next.X == g.jabloko.X && next.Y == g.jabloko.Y)

{

COORD* temp = new COORD[++n];

for (int i = 0; i < n; i++)

temp[i] = g.gaduka.t[i];

temp[n - 1] = next;

delete[] g.gaduka.t;

g.gaduka.t = temp;

SetConsoleCursorPosition(hConsole, head);

SetConsoleTextAttribute(hConsole, 0x0a);

printf(" ");

SetConsoleCursorPosition(hConsole, next);

SetConsoleTextAttribute(hConsole, 0x0a);

printf("@", 1);

PlusJabloko(g);

return PLUS;

}

for (int i = 0; i < n - 1; i++)

g.gaduka.t[i] = g.gaduka.t[i + 1];

g.gaduka.t[n - 1] = next;

SetConsoleCursorPosition(hConsole, tail);

printf(" ");

SetConsoleCursorPosition(hConsole, head);

SetConsoleTextAttribute(hConsole, 0x0a);

printf("o");

SetConsoleCursorPosition(hConsole, next);

SetConsoleTextAttribute(hConsole, 0x0f);

printf("O", 2);

return MOVE;

}

void main()

{

hConsole = GetStdHandle(STD_OUTPUT_HANDLE);

int key = 0, count = 0;

bool Pause = false;

Game g;

skorostGame(g);

STENA_2();

srand(time(0));

bool pause = false;

while (key != 27)

{

while (!_kbhit())

{

if (Pause == true)

{

Sleep(1);

continue;

}

switch (Move(g))

{

case PLUS:

++count;

g.pause -= 1;

GotoXY(64, 2); cout << "Данные:" << endl;

GotoXY(64, 3); cout << "Количество фруктов:" << count << endl;

GotoXY(64, 4); cout << "Длинна змейки:" << g.gaduka.PCount << endl;

GotoXY(64, 5); cout << "Скорость:" << g.pause << endl;

GotoXY(64, 7); cout << "Управление:" << endl;

GotoXY(64, 8); cout << "Esc:Выход" << endl;

GotoXY(64, 9); cout << "P:Пауза" << endl;

GotoXY(64, 10); cout << "S:Старт" << endl;

GotoXY(64, 13); printf("%c", 24); cout << ":Вверх" << endl;

GotoXY(64, 14); printf("%c", 25); cout << ":Вниз" << endl;

GotoXY(64, 15); printf("%c", 27); cout << ":Влево" << endl;

GotoXY(64, 16); printf("%c", 26); cout << ":Вправо" << endl;

if (count == 75)

{

GotoXY(15, 1); cout << "Вы победили" << endl;

GotoXY(15, 6); printf("\n\t\t\t");

GotoXY(15, 7); printf("\n\t\t\t");

_getch();

_getch();

_getch();

_getch();

_getch();

return;

}

break;

case STENA:

case KONEC:

GotoXY(23, 1); printf("GAME OVER");

_getch();

return;

break;

}

Sleep(g.pause);

}

key = _getch();

if (key == 'P' || key == 'p')

Pause = !Pause;

else if (key == 'S' || key == 's')

ZmejaStart();

else if (key == 0 || key == 224)

{

key = _getch();

if (key == 72 && g.nap != DOWN)

{

g.nap = UP;

g.dx = 0;

g.dy = -1;

}

else if (key == 80 && g.nap != UP)

{

g.nap = DOWN;

g.dx = 0;

g.dy = 1;

}

else if (key == 75 && g.nap != RIGHT)

{

g.nap = LEFT;

g.dx = -1;

g.dy = 0;

}

else if (key == 77 && g.nap != LEFT)

{

g.nap = RIGHT;

g.dx = 1;

g.dy = 0;

}

}

}

}

ПРИЛОЖЕНИЕ Б

Рисунок 1. Стартовый вид игры при запуске

Рисунок 2. Змейка ударилась об объект - стена

Рисунок 3. Голова змейки ударилась об свой же хвост

Рисунок 4. Конченый итого после победы в игре