Реализация игры "Жизнь", в которой необходимо захватить как можно большее пространство своим цветом

Тип работы:
Дипломная
Предмет:
Программирование


Узнать стоимость

Детальная информация о работе

Выдержка из работы

Курсовая робота

Реализация игры «Жизнь», в которой необходимо захватить как можно большее пространство своим цветом

Задание

На игровой доске поле размером 10*10 2-х цветов игроки начинают с противоположных углов имея по 1-й фишке. Фишки могут ходить аналогично ферзю на расстояние не более 2-х клеток. При перемещении на 1-ну клетку происходит копирование, при каждом ходе все соседние фишки становятся такого же цвета что и ходивший. Выигрывает тот игрок, который имеет больше фишек.

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

объектный ориентированный программирование игра

Аннотация

В данной курсовой работе рассматривается реализация игры, в которой необходимо захватить как можно большее пространство своим цветом. Задача реализуется с помощью объектно-ориентированного подхода. Курсовой проект содержит пояснительную записку из 12 страниц текста, программного кода в виде приложения и трех рисунков результата работы программы.

Ключевые слова:

Игры на С++, игра Жизнь, рисование в С++.

Введение

Объектно-ориентированное проектирование это такой подход, когда программная система представляется как совокупность объектов, каждая из которых принадлежит некоторому классу, а классы представляют иерархическую структуру. Т.к. программная система представляется как совокупность взаимодействующих объектов, то, следовательно, используется не алгоритмическая и объектная декомпозиция программной системы. Термин объект появился одновременно в нескольких областях связанных с компьютерами. Так были созданы компьютеры с объектно-ориентированной архитектурой, например IBM system или Intel 432. Соответственно были созданы объектно-ориентированные операционные системы, например IMAX STAROS. Термин объект впервые появился в языке Simula67. Далее объектный подход был развит в версиях языка Smalltalk. Затем механизм объектно-ориентированного подхода был введен в традиционные языки высшего уровня.

С+ООП C++

Pascal+ ООП Object Pascal

Практически все объектно-ориентированные языки программирования являются развивающимися языками, их стандарты регулярно уточняются и расширяются. Следствием этого развития являются неизбежные различия во входных языках компиляторов различных систем программирования.. Наиболее распространенными в настоящее время являются системы программирования Microsoft C++, Microsoft Visual C++ и системы программирования фирмы Borland International. Дальнейший материал в данном пособии излагается применительно к системе программирования Borland C++. Это связано прежде всего наличием в этой системе программирования развитой интегрированной среды, объединяющей текстовый редактор, компилятор, редактор связей (компоновщик) и отладочные средства.

Сущность объектно-ориентированного подхода к программированию

Основные идеи объектно-ориентированного подхода опираются на следующие положения:

— Программа представляет собой модель некоторого реального процесса, части реального мира.

— Модель реального мира или его части может быть описана как совокупность взаимодействующих между собой объектов.

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

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

— Объекты, описанные одним и тем же набором параметров и способные выполнять один и тот же набор действий представляют собой класс однотипных объектов.

Преимущества и недостатки ООП

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

Основные концепции ООП: Каждый стиль программирования имеет свою концептуальную базу. Для объектно-ориентированного стиля программирования такой базой является объектная модель. Объектная модель имеет четыре главных элемента:

1) абстрагирование

2) инкапсуляция

3) модульность

4) иерархия

Выше было изложено краткое описание об ОО подходе

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

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

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

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

Проектирование системы классов

В данной курсовой работе были созданы следующие классы:

class TCells - класс «Клетка». Служит базовым классом для класса «Доска».

Методы:

void init (_size); - установка размера клеток

Свойства:

int size; - хранит размер клетки

class TDoska — класс «Доска», потомок класса TCells

Методы:

TDoska (); - устанавливает размер клеток

void draw (); - рисует доску.

class TFishka — класс «Фишка»

Свойства:

int mas[10][10]; - массив для хранения положений фишек

TColor color[10][10]; - массив для хранения цвета фишек на доске

int x, y, size;

int count1, count2; - счетчики очков для двух игроков

Методы:

TFishka ();

void draw_greed (); - рисует доску

void draw (); - рисует фишку в установленных координатах

void init (int _x, int _y, TColor _c, int __gamer); - установка фишек в заданные координаты, производит копирование фишек в соседние клетки.

void Game_over (); - проверка на окончание игры

Взаимосвязь классов

Рис.

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

В языке С++ формат описания класса выглядит следующим образом:

Class < имя класса>

{

элементы класса

< метка видимости> :< элементы класса>

< метка видимости> :< элементы класса>

};

объекты класса

Класс TCells

class TCells

{

public:

int size;

void init (_size){size=_size; }

};

В данном примере переменная size и функция init() объявлены как public, т. е. как общедоступные.

Синтаксис объявления класса-потомка следующий:

Class base1

{… };

Class baseN

{… };

class potomok: <спецификатор доступа> base1, baseN

Класс TDoska

class TDoska: public TCells

{

public:

TDoska ();

void draw ();

}

В данном примере функции TDoska (),draw () объявлены как public, т. е. как общедоступные.

Класс TFishka

class TFishka

{

public:

int mas[10][10];

TColor color[10][10];

int x, y, size;

int count1, count2;

//-------------

TFishka ();

void draw_greed ();

void draw ();

void init (int _x, int _y, TColor _c, int __gamer);

void Game_over ();

};

В данном примере все функции и переменные объявлены как public, т. е. как общедоступные.

Заключение

В данной курсовой работе была разработана реализация игры, в которой необходимо захватить как можно большее пространство своим цветом. Приложение разрабатывалось в среде CBuilder 5, т.к. этот язык программирования оптимально подходил для реализации требуемой задачи. Язык С++ был выбран неслучайно т.к. объектная модель в нем реализуется на доступном пользователю уровне.

Программа разрабатывалась с использованием объектно-ориентированного подхода, поэтому при ее реализации были использованы классы.

class TCells - класс «Клетка». Служит базовым классом для класса «Доска».

class TDoska — класс «Доска», потомок класса TCells

class TFishka — класс «Фишка»

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

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

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

Литература

1. Конспект лекций по ООП

2. Бьерн Страуструп. Язык программирования С++

3. Интернет: www. google. com. ru, www. gamedev. ru.

Приложение

Программный код модуля unit1. h

//---------------------------------------------------------------------------

#ifndef Unit1H

#define Unit1H

//---------------------------------------------------------------------------

#include < Classes. hpp>

#include < Controls. hpp>

#include < StdCtrls. hpp>

#include < Forms. hpp>

#include < ExtCtrls. hpp>

//---------------------------------------------------------------------------

class TForm1: public TForm

{

__published: // IDE-managed Components

TGroupBox *GroupBox1; TGroupBox *GroupBox2; TGroupBox *GroupBox3;

TEdit *Edit1; TEdit *Edit2; TEdit *Edit3; TEdit *Edit4;

TLabel *Label1; TLabel *Label2; TLabel *Label3; TLabel *Label4;

TLabel *Label5; TLabel *Label6; TButton *Button1; TButton *Button2;

TLabel *Label7; TLabel *Label8; TEdit *Edit5; TEdit *Edit6;

TShape *Shape1; TShape *Shape2; TTimer *Timer1;

void __fastcall FormPaint (TObject *Sender);

void __fastcall Button1Click (TObject *Sender);

void __fastcall Button2Click (TObject *Sender);

void __fastcall Timer1Timer (TObject *Sender);

void __fastcall FormCreate (TObject *Sender);

private: // User declarations

public: // User declarations

__fastcall TForm1(TComponent* Owner);

};

//---------------------------------------------------------------------------

extern PACKAGE TForm1 *Form1;

//---------------------------------------------------------------------------

#endif

class TCells

{

public:

int size;

void init (_size){size=_size;} //установка размера клетки

};

class TDoska: public TCells

{

public:

TDoska () //конструктор — устанавливает значение размера клетки

{

init (33);

}

void draw () //рисует доску белого цвета

{

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

for (int j=0; j<10;j++)

{

Form1-> Canvas->Brush->Color=clWhite;

Form1-> Canvas->Ellipse (i*size, j*size,(i+1)*size,(j+1)*size);

}

}

};

//---------------------------------------------------------------------------

class TFishka

{

public:

int mas[10][10];

TColor color[10][10];

int x, y, size;

int count1, count2;

//-------------

TFishka ();

//-------------

void draw_greed () // рисует доску с фишками

{

int i, j;

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

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

{

Form1-> Canvas->Brush->Color=color[i][j];

Form1-> Canvas->Ellipse (i*size, j*size,(i+1)*size,(j+1)*size);

}

}

//-------------

void draw () // рисует одну фишку с установленными координатами

{

Form1-> Canvas->Brush->Color=color[x][y];

Form1-> Canvas->Ellipse (x*size, y*size,(x+1)*size,(y+1)*size);

}

//------------- // прототип функции

void init (int _x, int _y, TColor _c, int __gamer);

//------------- // процедура проверки окончания игры

void Game_over ()

{

int i, j, t1,t2,_gamer;

t1=100; _gamer=0;t2=0;

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

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

if (mas[i][j]==1){t2++; }

if (t2==t1)

{

if (count1> count2){_gamer=1;} else {_gamer=2; }

Form1-> Button1->Enabled=false;

Form1-> Button2->Enabled=false;

ShowMessage («Game Over!!! Auea? ae ea? ie ["+IntToStr (_gamer)+"]»);

}

}

//-------------

};

//---------------------- установка координат и захват ближайших клеток -----------

void TFishka: :init (int _x, int _y, TColor _c, int __gamer)

{

int temp;

x=_x;

y=_y;

temp=0;

if (mas[x][y]==0) {color[x][y]=_c; mas[x][y]=1; temp++; }

if (mas[x+1][y]==0) {color[x+1][y]=_c; mas[x+1][y]=1; temp++; }

if (mas[x-1][y]==0) {color[x-1][y]=_c; mas[x-1][y]=1; temp++; }

if (mas[x][y+1]==0) {color[x][y+1]=_c; mas[x][y+1]=1; temp++; }

if (mas[x][y-1]==0) {color[x][y-1]=_c; mas[x][y-1]=1; temp++; }

if (mas[x+1][y-1]==0) {color[x+1][y-1]=_c; mas[x+1][y-1]=1; temp++; }

if (mas[x+1][y+1]==0) {color[x+1][y+1]=_c; mas[x+1][y+1]=1; temp++; }

if (mas[x-1][y-1]==0) {color[x-1][y-1]=_c; mas[x-1][y-1]=1; temp++; }

if (mas[x-1][y+1]==0) {color[x-1][y+1]=_c; mas[x-1][y+1]=1; temp++; }

switch (__gamer)

{

case 1: count1+=temp; break;

case 2: count2+=temp; break;

}

}

//------------- конструктор — установка начальных значений переменных -------

TFishka: :TFishka ()

{

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

for (int j=0; j<10;j++)

{color[i][j]=clWhite;

mas[i][j]=0; }

count1=0;

count2=0;

size=33;

}

Программный код модуля unit1. cpp

//---------------------------------------------------------------------------

#include < vcl. h>

#pragma hdrstop

#include «Unit1. h»

//---------------------------------------------------------------------------

#pragma package (smart_init)

#pragma resource «*. dfm»

TForm1 *Form1;

TFishka f;

TDoska doska;

//---------------------------------------------------------------------------

__fastcall TForm1: :TForm1(TComponent* Owner): TForm (Owner)

{}

//----------- обработчик прорисовки формы -----------------------------------------

void __fastcall TForm1: :FormPaint (TObject *Sender)

{

doska. draw ();

}

//---------------------- нажатие кнопки первого игрока ----------------------------------

void __fastcall TForm1: :Button1Click (TObject *Sender)

{

f. init (StrToInt (Edit1->Text), StrToInt (Edit2->Text), clBlue, 1);

f. draw ();

Edit5-> Text=IntToStr (f. count1);

Button1-> Enabled=false;

Edit1-> Enabled=false;Edit1->Text="";

Edit2-> Enabled=false;Edit2->Text="";

if (Button2-> Enabled==false)

{ Button2-> Enabled=true;

Edit3-> Enabled=true;

Edit4-> Enabled=true;}

else {Button2-> Enabled=false;}

f. Game_over ();

}

//-------------------------- нажатие кнопки второго игрока ------------------------------

void __fastcall TForm1: :Button2Click (TObject *Sender)

{

f. init (StrToInt (Edit3->Text), StrToInt (Edit4->Text), clRed, 2);

f. draw ();

Edit6-> Text=IntToStr (f. count2);

Button2-> Enabled=false;

Edit3-> Enabled=false;Edit3->Text="";

Edit4-> Enabled=false;Edit4->Text="";

if (Button1-> Enabled==false)

{Button1-> Enabled=true;

Edit1-> Enabled=true;

Edit2-> Enabled=true;

}else{Button1-> Enabled=false;}

f. Game_over ();

}

//------------------------------ обработчик таймера для прорисовки доски ------------

void __fastcall TForm1: :Timer1Timer (TObject *Sender)

{f. draw_greed ();}

//---------------------- обработчик создания формы ------------------------------------

void __fastcall TForm1: :FormCreate (TObject *Sender)

{

Edit5-> Text=IntToStr (f. count1);

Edit6-> Text=IntToStr (f. count2);

Edit3-> Enabled=false;

Edit4-> Enabled=false;

}

//---------------------------------------------------------------------------

Результаты работы программы

Рис. 1. Главное окно после запуска программы.

Рис. 2. промежуточный результат работы программы.

Рис. 3. конечный результат работы программы.

ПоказатьСвернуть
Заполнить форму текущей работой