Игра "Марио"

Особенности синтаксиса языка программирования С++. Создание панели меню, для получения информации о программе, сохранения результата и выхода из программы. Работа с файлами, двумерными и одномерными динамическими массивами, функциями, строками и циклами.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 06.02.2016
Размер файла 782,3 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Санкт-Петербургский государственный

электротехнический университет «ЛЭТИ» им. В.И. Ульянова (Ленина)

Кафедра МО ЭВМ

ПОЯСНИТЕЛЬНАЯ ЗАПИСКА

К КУРСОВОЙ РАБОТЕ

«Игра “Марио”»

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

Выполнил: Малинин М.В.

Группа: 5304

Факультет: КТИ

Преподаватель: Голубков А.М.

Санкт-Петербург

2015

Содержание

1. Цель работы

2. Постановка задачи

3. Анализ и выполнение задачи

3.1 Общий анализ

3.2 Алгоритм решения

3.3 Отрисовка

4. Тестирование

5. Вывод

Приложение 1. Код программы

Приложение 2. Блок-схемы

1. Цель работы

В ходе написания программы:

· освоить синтаксис языка программирования С++;

· изучить и реализовать на практике сложные алгоритмы;

· повторить знания о применении различных типов данных;

· применить на практике знания, полученные за семестр.

2. Постановка задачи

Написать программу, в которой происходит управление пользователем игровым персонажем (вид сбоку), с целью набрать наибольшее число очков.

Программа включает в себя:

· генерацию персонажа, земли, деревьев (заднего фона) и бонусных блоков;

· создание панели меню, для получения информации о программе, сохранения результата и выхода из программы;

· возможность передвижения персонажем по карте вперед, вверх, вниз и назад;

· визуализация предметов в игровом поле.

3. Анализ и выполнение задачи

3.1 Общий анализ

Для создания проекта использовалась программа Microsoft Visual C++ 2013. Проект создавался методом проб и ошибок, с постоянными изменениями и улучшениями, как в плане производительности, так и в плане удобства для пользователя. Исходя из того, что нет предела совершенству, можно сказать, что программа не окончена и требует дополнений.

Программа состоит из файла исходного кода и двух текстовых документов.

Программа имеет возможность считывать карту из текстового документа и самостоятельно дополнять ее по мере прохождения. Конец игры зависит только от желания игрока (пользователя) продолжать игру и в любой момент имеет выход.

В игре существуют следующие объекты:

Таблица 1. Игровые объекты

Тип объекта

Условное обозначение в консоли

Персонаж

7 (цвет - серый)

Малое дерево

2 (цвет - зелёный)

2

6 (цвет - коричневый)

Среднее дерево

10 (цвет - светло-зелёный)

10 10 10

6 (цвет - коричневый)

Бонусный блок

4 (цвет - красный)

Земля

1 (цвет - синий)

Воздух

0 (цвет - черный)

3.2 Алгоритм решения

Объявляю два двумерных массива А(массив, отвечающий за фон будущей карты) и В(массив, отвечающий за блоки, на которые можно воздействовать). А так же перечисление, отвечающее за цвет объектов.

Точка входа программы находится в файле Mario_1.cpp.

В первую очередь, программа осуществляет вызов текстового документа, с которого считывает значения и присваивает их каждому элементу массива А. Массив В заполняется нулевыми значениями.

С помощью функций «void LTree(int j)», «void MTree(int j)» создаются деревья для красоты программы с вероятностью 1:10 и 13:100 соответственно и вводятся в массив А, при чем они создаются на «поверхности», то есть над первым значением «1» в этом массиве в столбце j. Учитывается вероятность того, что верхушки деревьев могут выходить за верх карты, поэтому они обрезаются сверху.

Функция «void Coins(int j)» создает бонусные блоки с вероятностью 6:100, которые «лежат» на «земле», или 1:10, которые «зависают» над «землей» на высоте одного блока в массиве В в столбце j.

На этом первичная генерация карты окончена, можно переходить к «основным действиям».

Создаю персонажа, который появляется в этом мире на втором столбце, стоящий на земле.

Далее идет цикл типа do…while, который определяет движение персонажа по нажатию игроком клавиш. При каждом действии происходит отрисовка карты с помощью функции «void mass(int N, int M)».

«W» - прыжок. Персонаж подпрыгивает на один блок вверх и ждет следующей команды. Есть возможность прыгнуть вверх, вперед и назад. Учитывается, что при прыжке персонаж может подобрать бонусный блок. В таком случае, прибавляется одно очко.

«D» - движение вперед. Происходит движение вперед, если после этого действия персонаж находится не на земле, то он падает. Учитывается, что при движении персонаж может подобрать бонусный блок. В таком случае, прибавляется одно очко. Если персонаж подходит близко к краю карты (за 15 блоков до конца), то к ней прибавляется новый столбец с помощью функции «int main1(int N, int M)».

«A» - движение назад. Происходит движение назад, если после этого действия персонаж находится не на земле, то он падает. Учитывается, что при движении персонаж может подобрать бонусный блок. В таком случае, прибавляется одно очко. Если перед этим происходило создание нового столбца, то карта сдвигается назад.

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

«Q» - вызов меню. Управление выбранным пунктом меню производится клавишами «W» и «S». Для выбора пункта необходимо нажать клавишу «D». Сохранение производится автоматически при выборе пункта меню «Score».

«P» - конец цикла. Происходит выход из основной части программы. После чего происходит освобождение памяти массивов А и В и завершение программы.

3.3 Отрисовка

Как уже было сказано, цвет был добавлен для удобства игрока и зрелищности программы. Изменение цвета фона и шрифта происходит с помощью функции «void SetColor(int text, int background)»

4. Тестирование

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

- программа написана верно, явных ошибок обнаружено не было;

- возможны утечки памяти в программе, но ими можно пренебречь.

5. Вывод

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

Приложение 1

язык программирование файл массив

Код программы

#include "stdafx.h"

#include <conio.h>

#include <iostream>

#include <cstdlib>

#include <fstream>

#include <string>

#include <Windows.h>

using namespace std;

int **A; // Массив "заднего" фона

int **B; // Массив "переднего" фона

enum ConsoleColor

{

Black = 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(int text, int background)

{

HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

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

}

void menu(int c, int v, int score)

{

cout << "\t\t\t***MENU***\n";

if (c == 1){ SetColor(13, 0); }

cout << "\tINFO\n"; SetColor(15, 0);

if (v == 1 && c == 1){ cout << "\tЭто информацияV1.1\n"; }// информация о программе

if (c == 2){ SetColor(13, 0); }

cout << "\tStart\n"; SetColor(15, 0); // переходит к разделу игры

if (v == 1 && c == 2){}

if (c == 3){ SetColor(13, 0); } // выдает 10 лучших результатов

cout << "\tScore\n"; SetColor(15, 0);

if (v == 1 && c == 3){

cout << "\tSaved\n";

ofstream in("C://Users//Maskit//Desktop//php3.txt");

in << "Ваш счет: " << score;

in.close();

} //Закрываем файл

if (c == 4){ SetColor(13, 0); } // выход из программы

cout << "\tEXIT"; SetColor(15, 0);

if (v == 1 && c == 4){exit(0);}

}

void LTree(int j){

int i, r;

i = 1;

r = 1 + rand() % 100;

while (A[i][j] != 1)

{

++i;

}

if (r < 10){

if (i > 1){ A[i - 1][j] = 6; }

if (i > 2){ A[i - 2][j] = 10; A[i - 2][j - 1] = 10; A[i - 2][j + 1] = 10; }

if (i > 3){ A[i - 3][j] = 10; }

}

}

void MTree(int j){

int i, r;

i = 1;

r = 1 + rand() % 100;

while (A[i][j] != 1)

{

++i;

}

if (r < 13){

if (i > 1){ A[i - 1][j] = 6; }

if (i > 2){ A[i - 2][j] = 2; }

if (i > 3){ A[i - 3][j] = 2; }

}

}

void Coins(int j){

int i, r;

i = 1;

r = 1 + rand() % 100;

while (A[i][j] != 1)

{

++i;

}

if (r < 6){if (i > 1){ B[i - 1][j] = 4; }}

if (r >= 6 && r<14){ if (i > 2){ B[i - 2][j] = 4; } }

}

void mass(int N, int M){

int i, j;

system("cls");

for (i = 0; i < M-1; ++i){

cout << "\n\t";

for (j = N - 46; j < N; ++j){

if(i<1 || j<N-45 || i>M-2 || j>N-2){ SetColor(0,2); cout<<"2 "; SetColor(15,0);}

else{

if (B[i][j] == 0){

SetColor(0, A[i][j]);

cout << A[i][j];

if (A[i][j] < 10)cout << " ";

}

else

{

SetColor(0, B[i][j]); cout << B[i][j]; if (B[i][j] < 10) cout << " ";

}

SetColor(15, 0);

}

}

}

}

int main1(int N, int M)// создание нового столбца и заполнение

{

int i, e, r;

e = 0;

r = (0 + rand() % 3);

while (A[e][N - 1] != 1)

{

++e;

}

if (e < M - 2 && r == 0){ ++e; }

if (e > 2 && r == 1){ --e; }

int **temp = new int*[M];

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

temp[i] = new int[N];//Выделяю память для временного массива

for (int j = 0; j < N; j++ ){

temp[i][j] = A[i][j]; //Записываю туда данные

}

}

delete[](*A); //вот так освобождаю массив, принятый функцией

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

A[i] = new int[N + 1]; //Выделяю для массива, принятой функцией новую память

}

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

for (int j = 0; j < N; j++){

A[i][j] = temp[i][j]; //Записываю туда данные

}

}

int **temp2 = new int*[M];

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

temp2[i] = new int[N]; //Выделяю новую память для временного массива

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

for (int j = 0; j < N; j++){

temp2[i][j] = B[i][j]; //Записываю туда данные

}

}

delete[](*B); //вот так освобождаю массив, принятый функцией

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

B[i] = new int[N + 1]; //Выделяю для массива, принятой функцией новую память

}

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

for (int j = 0; j < N; j++){

B[i][j] = temp2[i][j]; //Записываю туда данные

}

}

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

{

if (e <= i){ A[i][N] = 1; }

else{ A[i][N] = 0; }

B[i][N] = 0;

}

delete[]temp; //освобождаю память от временного массива

delete[]temp2; //освобождаю память от временного массива

MTree(N); LTree(N - 1); Coins(N);

++N;

return N;

}

void main()

{

int i, j;

string a, b;

b = *"";

setlocale(LC_ALL, "Russian");

int N = 0, M = 0; //Число колонок=N, Число строк= M

/*Чтение из файла текста*/

ifstream in("C://Users//Maskit//Desktop//php.txt");// получение файла с картой

int t;

t = 0;

while (!in.eof())

{

getline(in, a); // Считываем строчку в переменную а

b = b + ' ' + a;

if (N < a.size()){ N = a.size(); }

for (i = 0; a[i] != *""; i++){ if (i > a.size()){ break; } }

++M;

}

in.close(); //Закрываем файл

/*Создание динамического двумерного массива*/

//A = new int*[M];

A = (int**)malloc(sizeof(int*) * M);

B = (int**)malloc(sizeof(int*) * M);

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

{

// A[i] = new int[N];

A[i] = (int*)malloc(sizeof(int) * N);

B[i] = (int*)malloc(sizeof(int) * N);

for (j = 0; j <= N; j++)

{

a = b.substr(t + 2, 1);

++t;

A[i][j] = atoi(a.c_str());

B[i][j] = 0;

if (a == " "){

while (j < N)

{

A[i][j] = 0;

B[i][j] = 0;

j++;

}

}

if (t == b.size() - 2){ break; }

}

if (t == b.size() - 2){ break; }// зарисовка предметов

}

cout << "\n\n";

for (j = 1; j < N - 1; ++j){ LTree(j); MTree(j); Coins(j); }

i = M - 2;

j = 2;

while (A[i][j] == 1)

{

i = i - 1;

}

B[i][j] = 7;// создание персонажа

char vvod;

int K = N, c = 0, score = 0, v = 0;

do{

vvod = _getche();

if (vvod == 'w' && i > 0 && A[i - 1][j] != 1){ if (B[i - 1][j] == 4){ ++score; }B[i][j] = 0; --i; B[i][j] = 7; mass(N, M); vvod = _getche(); }

if (vvod == 'a' && j > 0 && A[i][j - 1] != 1){ if (B[i][j - 1] == 4){ ++score; }B[i][j] = 0; --j; B[i][j] = 7; if (N > 45){ --N; } mass(N, M); }

if (vvod == 'd' && j < N - 2 && A[i][j + 1] != 1){ if (j >= K - 15){/**/ if (N < K){ ++N; } else { K = main1(K, M); ++N;/**/ } } if (B[i][j + 1] == 4){ ++score; }B[i][j] = 0; ++j; B[i][j] = 7; mass(N, M); }

while (A[i + 1][j] != 1){ if (B[i + 1][j] == 4){ score++; }if (B[i + 1][j] == 4){ ++score; } B[i][j] = 0; ++i; B[i][j] = 7; mass(N, M); }

if (vvod == 'q'){// Меню

c = 1;

do

{

system("cls");

menu(c, v, score);

vvod = _getche();

if (vvod == 'w'){ if (c > 1) { --c; } }

if (vvod == 'a'){ v = 0; }

if (vvod == 's'){ if (c < 5){ ++c; } }

if (vvod == 'd'){ v = 1; }

//if (c == 1){}

} while (vvod != 'q');

}

} while (vvod != 'p');

/*Очистка памяти от созданного двумерного массива*/

for (int i = 0; i < N; i++) { delete[]A[i]; delete[]B[i]; }

delete[]A; delete[]B;

A = NULL; B = NULL;

system("pause");

}

Приложение 2

Блок-схемы

Размещено на Allbest.ru


Подобные документы

  • Изучение функций и возможностей среды разработки языка программирования Pascal. Рассмотрение работы с одномерными и двумерными массивами, со строками и числами. Математическая формулировка задач. Разработка алгоритмов, описание структуры программ.

    курсовая работа [879,8 K], добавлен 11.02.2016

  • Характеристика языка программирования С++. Описание классов и методов. Выполнение решения вычислительных процессов по заданным формулам. Создание диалогового приложения. Разработка инструкции пользователя. Операции над одномерными и двумерными массивами.

    дипломная работа [2,0 M], добавлен 16.04.2017

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

    курсовая работа [529,7 K], добавлен 19.12.2010

  • Ознакомление с историей изобретение языка программирования C. Рассмотрение компонентов программы Блокнот. Проектирование основных кнопок окна, строки заголовка, меню верхнего уровня, панели инструментов для меню второго уровня и статусной панели.

    курсовая работа [198,0 K], добавлен 19.07.2014

  • Особенности работы с процедурами и двумерными массивами, последовательность вызова процедур. Способы описания и использования многомерных массивов, назначение процедур, их описание и обращение к ним. Набор программы, ее отладка и тестирование данных.

    лабораторная работа [112,1 K], добавлен 03.10.2010

  • Ознакомление с понятием, особенностями объявления, инициализацией и принципами работы с одномерными и двумерными массивами. Изучение смысла тернарной операции вывода элементов матрицы. Рассмотрение сущности и способов использования указателей переменных.

    лабораторная работа [22,1 K], добавлен 15.07.2010

  • Решение задач, прямо связанных с применением циклов и массивов. Условия применения различных видов циклической структуры. Операторы цикла с предусловием while, постусловием do-while и for. Особенности работы с одномерными и двумерными массивами.

    курсовая работа [1,1 M], добавлен 31.08.2019

  • Ознакомление с языком программирование PHP. Операторы управления и передачи данных, конструкции разветвления и повторения. Создание функции в PHP. Работа с числами, строками и датой/временем в PHP. Работа с массивами данных. Работа с файловой системой.

    курсовая работа [1,5 M], добавлен 09.09.2011

  • Сущность понятия "код блюда". Алгоритмы обучения и использования программы. Логика работы программы. Общий интерфейс программы. Последовательность обучения программе Lota+. Интерфейс программы в момент выбора параметров и получения общего результата.

    курсовая работа [563,6 K], добавлен 01.12.2009

  • Освоение технологии структурного программирования и применения стандартных методов работы с одномерными массивами при разработке и создании программы на языке Турбо Паскаль. Разработка программы методом пошаговой детализации с помощью псевдокода.

    реферат [276,9 K], добавлен 27.02.2008

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.