Написать программу игры в пятнашки

Автор работы: Пользователь скрыл имя, 29 Апреля 2013 в 22:10, курсовая работа

Краткое описание

В данной курсовой работе я представил программу, написанную на языке С++ в которой мы можем играть в игру пятнашки.
Самый первый вопрос, который мы должны себе задать, звучит примерно так: "Что должна делать эта программа? Какие функции она должна выполнять? Какими особенностями должна она обладать? Как должна выглядеть работа программы?" Ответы на эти вопросы составят приблизительный список требований, предъявляемый к программе и помогут нам яснее представить себе, что именно нам предстоит сделать.

Содержание

Введение
1 Математическая теория игры
2 Проектирование структур программы
3 Среда программирования Code::Blocks
4 Инструкция пользователя
5 Выводы
6 Список использованной литературы

Прикрепленные файлы: 1 файл

Курсовая.doc

— 217.00 Кб (Скачать документ)

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: во-первых, не надо будет каждый раз просматривать все поле в поисках этой клетки, во-вторых, даже если это делать, ее координаты все равно понадобятся - для самого перемещения соседней костяшки и для проверки корректности попытки перемещения.

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

 Логично было бы  при нажатии клавиши в функции main просто вызывать функцию перемещения, передавая ей информацию о том, какая из клавиш со стрелками была нажата, т.е. куда следует передвинуть одну из костяшек, если это возможно. Поэтому функция перемещения должна иметь аргумент, обозначающий направление. Конечно, можно для этой цели использовать, например, целые значения, но лучше всего определить для понятия "направление" особый тип-перечисление и передавать в качестве аргумента переменную этого типа. Это сделать очень просто: в самом начале кода программы, непосредственно перед объявлением наших глобальных переменных напишем:

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. Мы организуем ее код с помощью простого цикла, проверяющего первые пятнадцать позиций поля. Если во время этой проверки обнаруживается хотя бы одна костяшка, находящаяся не на месте, то функция тут же возвращает значение false, не проверяя уже последующие позиции. И только если за всю проверку не будет найдено ни одного несоответствия, и, стало быть, причин преждевременно выйти из функции, будет возвращено значение true:

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 написана на С++ и использует  библиотеку wxWidgets. Имея открытую  архитектуру, может масштабироваться  за счёт подключаемых модулей.  Поддерживает языки программирования С, С++, D (с ограничениями).

Code::Blocks разрабатывается  для Windows, Linux и Mac OS X. Среду можно  собрать из исходников практически  под любую Unix-подобную систему,  например FreeBSD.

Возможности программы:

Поддержка множества  компиляторов:

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”

Программа работает только в ОС Windows потому, что остальные ОС не поддерживают библиотеку “conio.h”, которая в свою очередь нужна для работы с «консольным вводом и выводом» программы.

 

 

 

 

 

 

 

 

 

 

 

 

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; //Костяшка с этим номером теперь занята

   }

  }

Информация о работе Написать программу игры в пятнашки