Автор работы: Пользователь скрыл имя, 29 Апреля 2013 в 22:10, курсовая работа
В данной курсовой работе я представил программу, написанную на языке С++ в которой мы можем играть в игру пятнашки.
Самый первый вопрос, который мы должны себе задать, звучит примерно так: "Что должна делать эта программа? Какие функции она должна выполнять? Какими особенностями должна она обладать? Как должна выглядеть работа программы?" Ответы на эти вопросы составят приблизительный список требований, предъявляемый к программе и помогут нам яснее представить себе, что именно нам предстоит сделать.
Введение
1 Математическая теория игры
2 Проектирование структур программы
3 Среда программирования Code::Blocks
4 Инструкция пользователя
5 Выводы
6 Список использованной литературы
for (int i = 0; i < 15; i++)
Field[i % 4][i / 4] = Nums[i]; //a % b - остаток от деления a на b
Field[3][3] = 0;
EmptyX = 3; EmptyY = 3;
Следующая функция, которую
мы напишем - функция рисования
игрового поля. Рисовать мы его
будем псевдографически, впрочем,
для простоты будем
Реализовать функцию можно двумя способами: либо рисовать по отдельности каждую костяшку с использованием функции gotoxy, либо рисовать по очереди все 12 рядов символов, представляющих изображение поля с использованием просто перевода строки. Первый способ более логичный и наглядный, однако, плохо переносимый, т.к. функция gotoxy, устанавливающая курсор в точке с указанными координатами, есть не во всех средах разработки (например, в IDE от фирмы Borland - Borland C++ и Borland C++ Builder она есть, а в Microsoft Visual C++ ее нет). Второй способ менее прозрачный, но использует только стандартные функции.
void DrawField()
{
clrscr(); //Очищаем экран
for (int j = 0; j < 4; j++) //Рисуем построчно четыре горизонтальных ряда костяшек
{
for (int i = 0; i < 4; i++) //Рисуем верхнюю часть ряда
{
if (Field[i][j])
cout << "++++";
else
cout << " ";
}
cout << '\n';
for (int i = 0; i < 4; i++) //Рисуем среднюю часть ряда (с номерами)
{
if (Field[i][j])
{
cout << "+";
cout.width(2);
cout << Field[i][j] << "+";
}
else
cout << " ";
}
cout << '\n';
for (int i = 0; i < 4; i++) //Рисуем нижнюю часть ряда
{
if (Field[i][j])
cout << "++++";
else
cout << " " ;
}
cout << '\n';
}
}
Теперь напишем функцию, осуществляющую перемещение костяшек. Именно для этой функции нам будут полезны координаты свободной клетки игрового поля - EmptyX и EmptyY: во-первых, не надо будет каждый раз просматривать все поле в поисках этой клетки, во-вторых, даже если это делать, ее координаты все равно понадобятся - для самого перемещения соседней костяшки и для проверки корректности попытки перемещения.
Сделаем небольшое уточнение по работе функции. Будем считать, что при нажатии игроком клавиш со стрелками мы перемещаем одну из костяшек на свободную клетку в направлении, соответствующем этой стрелке. Т.е. если игрок нажал клавишу "влево", то на свободное поле (влево) перемещается костяшка, находившаяся справа от него, если только это можно сделать.
Логично было бы
при нажатии клавиши в функции
enum Direction {LEFT, UP, RIGHT, DOWN};
И теперь мы можем передавать LEFT, UP, RIGHT и DOWN в качестве аргументов и вообще использовать как любые другие объекты любого другого встроенного типа. Реализация же функции тогда будет такой:
void Move(Direction dir)
{
switch (dir)
{
case LEFT:
{
if (EmptyX < 3)
{
Field[EmptyX][EmptyY] = Field[EmptyX + 1][EmptyY];
Field[EmptyX + 1][EmptyY] = 0;
EmptyX++;
}
} break;
case UP:
{
if (EmptyY < 3)
{
Field[EmptyX][EmptyY] = Field[EmptyX][EmptyY + 1];
Field[EmptyX][EmptyY + 1] = 0;
EmptyY++;
}
} break;
case RIGHT:
{
if (EmptyX > 0)
{
Field[EmptyX][EmptyY] = Field[EmptyX - 1][EmptyY];
Field[EmptyX - 1][EmptyY] = 0;
EmptyX--;
}
} break;
case DOWN:
{
if (EmptyY > 0)
{
Field[EmptyX][EmptyY] = Field[EmptyX][EmptyY - 1];
Field[EmptyX][EmptyY - 1] = 0;
EmptyY--;
}
} break;
}
}
И наконец, напишем
функцию, проверяющую,
bool FieldIsCorrect()
{
for (int i = 0; i < 15; i++)
if (Field[i % 4][i / 4] != i + 1)
return false; //При первом же нахождении несоответствия выходим и возвращаем false
return true;//Если не найдено ни одного несоответствия - поле собрано верно
}
Теперь мы написали все функции, необходимые для работы программы и можем приступать к написанию функции main.
Для того, чтобы наши разрозненные функции обрели вид законченной программы, осталось сделать совсем немного - написать функцию main, а также объявить заголовочные файлы, содержащие объявления используемых нами функций. Сначала напишем нашу самую главную функцию - в самом низу кода, под всеми объявлениями и определениями. По сути под программой можно понимать именно ее - все остальные функции будут вызываться внутри нее, сама же функция main определяет логику работы программы. Поскольку мы уже в самом начале определили структуру нашей программы, то сейчас мы запишем то же самое, только в виде кода C++:
int main()
{
CreateField(); //Генерация поля
DrawField(); //Первоначальное рисование поля
char c; //В эту переменную мы считываем символ нажатой клавиши
while (!FieldIsCorrect()) //Игровой цикл (выполняется пока поле не будет собрано)
{
c = getch(); //Считываем нажатие клавиши
switch(c) //В зависимости от нажатой клавиши (от ее целочисленного кода) двигаем костяшки
{
case 75: Move(LEFT); break; //Нажата клавиша "Влево"
case 72: Move(UP); break; //Нажата клавиша "Вверх"
case 77: Move(RIGHT); break; //Нажата клавиша "Вправо"
case 80: Move(DOWN); break; //Нажата клавиша "Вниз"
case 27: return 0; //Нажата клавиша "Escape"
}
DrawField(); //Рисование поля
}
cout << "\n\nCongratulations! Press Enter to exit!"; //Поздравление игрока
cin.get(); //Ждем ввода строки и нажатия Enter перед выходом
}
И теперь нам осталось только подключить нужные нам заголовочные файлы, добавив в самое начало кода (перед чем бы то ни было) следующие строки:
#include <iostream>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
Функция void CreateField
Функция void Chaos
Функция void DrawField
ФункцияMove(DirectionDir)
Функция FieldIsCorrect
Функция main
3 СРЕДА ПРОГРАММИРОВАНИЯ CODE::BLOCKS
Code::Blocks — свободная
кроссплатформенная среда
Code::Blocks разрабатывается
для Windows, Linux и Mac OS X. Среду можно
собрать из исходников
Возможности программы:
Поддержка множества компиляторов:
MinGW / GCC C/C++
GNU ARM GCC Compiler
GNU AVR GCC Compiler
GNU GCC Compiler for PowerPC
GNU GCC Compiler for TriCore
Digital Mars C/C++
Digital Mars D (с некоторыми ограничениями)
SDCC (Small device C compiler)
Microsoft Visual C++ 6[2]
Microsoft Visual C++ Toolkit 2003
Microsoft Visual C++ 2005/2008 (с некоторыми ограничениями)
Borland C++ 5.5
Watcom
Intel C++ compiler
GNU Fortran
GNU ARM
GNU GDC
Многопрофильные проекты
Поддержка рабочих пространств
Импорт проектов Dev-C++
Импорт проектов и рабочих пространств Microsoft Visual Studio (включая 2005)
Возможности интерфейса:
Подсветка синтаксиса
Сворачивание блоков кода
Автодополнение кода
Браузер классов
Скриптовой движок Squirrel
Планировщик под несколько пользователей
Поддержка плагинов Devpack (установочные пакеты для Dev-C++)
Плагин wxSmith (инструмент быстрой разработки приложений (RAD) на wxWidgets)
Поддержка отладчиков:
GNU GDB
MS CDB
Поддержка визуализации значений переменных и функций
4 ИНСТРУКЦИЯ ПОЛЬЗОВАТЕЛЯ
Программа, которая была разработана в ходе выполнения курсовой работы, позволяет играть в игру пятнашки.
Минимальные системные требования для работы программы:
- OS Windows.
- 6 МБ на жестком диске
- 8 МБ оперативной памяти
Для запуска программы следует открыть файл “1515.exe”
5 ВЫВОДЫ
Ниже представлении результат программы с помощью которой можно играть в игру пятнашки:
Рисунок 2. – Программа игры в пятнашки.
Рисунок 3. – Результат программы.
6 СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ
1. Громов Ю.Ю., Татаренко С.И. Программирование на языке СИ: Учебное пособие.
2. Мартынов Н. Н. Программирование для Windows на C/C++.
3. Дейтел Х.М. Дейтел П.Дж. Как программировать на С++.
4. Шилдт Г. С++ Для Начинающих (Четвертое издание)
5. Борис Пахомов C/C++ и MS Visual C++ 2010 для начинающих
7 ПРИЛОЖЕНИЕ
#include <iostream>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
using namespace std;
enum Direction {LEFT, UP, RIGHT, DOWN};
int Field[4][4];
int EmptyX, EmptyY;
int Nums[15];
void CreateField()
{
srand(time(NULL));
bool NumIsFree[15]; //NumIsFree[i] показывает, определили ли мы уже позицию i-й костяшки
//Nums[i] содержит номер костяшки, находящейся в i-й позиции
for (int i = 0; i < 15; i++) //Объявляем, что изначально все костяшки свободны
NumIsFree[i] = true;
rand(); //randomize позволяет при каждом прогоне программы получать разные последовательности псевдослучайных чисел
bool Ok; //Флаг, определяющий корректность выбора костяшки для данной позиции
int RandNum; //Номер костяшки, генерируемый в дальнейшем случайным образом
for (int i = 0; i < 15; i++) //Нам надо определить номер костяшки, находящейся в каждой из 15 позиций поля
{
Ok = false; //Каждый раз сбрасываем значение флага
while (!Ok) //Продолжаем случайным образом определять номер костяшки, пока он не окажется корректным
{
RandNum = 1 + rand() % 15; //random(n) генерирует псевдослучайное число от 0 до n - 1, а нам нужно от 1 до 15
if (NumIsFree[RandNum - 1]) //Если костяшка с таким номером еще свободна (помним, что массивы нумеруются начиная с нуля)
Ok = true; //то мы определили ее номер корректно
}
Nums[i] = RandNum; //Записываем этот корректный номер в i-ю позицию
NumIsFree[RandNum - 1] = false; //Костяшка с этим номером теперь занята
}
}