Игра "Марио"
Особенности синтаксиса языка программирования С++. Создание панели меню, для получения информации о программе, сохранения результата и выхода из программы. Работа с файлами, двумерными и одномерными динамическими массивами, функциями, строками и циклами.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 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