Игра Конвея "Жизнь"

Автор работы: Пользователь скрыл имя, 16 Мая 2014 в 14:00, курсовая работа

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

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

Содержание

Введение 3
Глава 1. Постановка задачи 4
1.1 Общая характеристика задачи 4
Глава 2. Проектирование программного модуля 5
2.1 Расчетные формулы метода 5
2.2 Описание схемы программы 6
Глава 3. Реализация программного модуля 7
3.1 Описание структуры разрабатываемого пакета 7
3.2 Описание используемых типов данных 8
3.3 Создание основной формы программы 9
3.4 Написание кода основных расчетов 10
3.5 Вывод результатов 12
3.6 Проектирование интерфейса программы 15
Глава 4. Тестирование программного модуля 16
4.1 Тестирование программы 16
Заключение 17
Список литературы

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

Готовая курсовая.doc

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

Содержание

Введение                    3

Глава 1. Постановка задачи                 4

1.1 Общая характеристика  задачи                4

Глава 2. Проектирование программного модуля              5

2.1 Расчетные формулы метода                5

2.2 Описание схемы программы                           6

Глава 3. Реализация программного модуля                                     7

3.1 Описание структуры  разрабатываемого пакета             7

3.2 Описание используемых  типов данных               8

3.3 Создание основной формы программы               9

3.4 Написание кода основных расчетов             10

3.5 Вывод результатов                12

3.6 Проектирование интерфейса программы            15

Глава 4. Тестирование программного модуля            16

4.1 Тестирование программы               16

Заключение                  17

Список литературы                18

Приложение А Текст программы              19

 

 

 

 

 

 

 

 

 

Введение


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

Примеры развития колоний в игре "Жизнь"

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

 

 

 

 

 

Глава 1. Постановка задачи


1.1 Общая характеристика  задачи

Необходимо разработать эволюционную игру "Жизнь", придуманную Д.Конвеем , позволяющая проследить увлекательную картину "эволюции" фигур на игровом поле, происходящую по законам, подобным законам эволюции в настоящих экологических системах.

Суть "Жизни" очень проста, как и суть обычной человеческой жизни. На игровом поле располагается в некотором начальном порядке определенное количество фишек, которые задают начальные условия эволюционного процесса. Каждая ячейка игрового поля может находиться в двух состояниях - либо оставаться пустой, либо быть занятой фишкой. Игра состоит из «циклов жизни», или из последовательности дискретных шагов, с помощью которых имитируется смена поколений. Переход от предыдущего поколения к следующему происходит по определенным правилам, которые применяются одновременно ко всем клеткам доски.

Предусмотреть графический интерфейс.

 

 

 

 

 

 

 

 

 

 

 

 

 

Глава 2. Проектирование программного модуля


2.1 Расчетные формулы  метода

Расчётные формулы метода отражают правила самой игры, т.е. когда клетки должны рождаться и когда должны умирать.

Привила игры следующие:

  1. Клетка выживает, если ее окружают 2 или 3 закрашенные клетки
  2. Клетка гибнет, если ее окружают более 3-х закрашенных клеток
  3. Клетка гибнет, если ее окружают менее 2-х закрашенных клеток
  4. Клетка рождается, если ее окружают 3 закрашенные клетки.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2.4 Описание схемы программы


 

 

 

 

 

 

 

 

 

Глава 3. Реализация программного модуля                        


3.1 Описание структуры  разрабатываемого пакета

Программа представляет собой окно, в котором расположено поле. На этом поле происходит рисование клеток. Рисование клеток происходит с помощью функции paintEvent(). И кнопка, по нажатию на которую, будет происходить итерация жизненных циклов. Нажатие кнопки вызывает событие ris(), в котором производятся основные расчёты. Так же к окну добавлен такой стандартный элемент как "Главное меню". Главное меню создаётся с помощью метода menuBar()->addmenu() класса QMenu. Функциональность к пунктам главного меню добавляется с помощью объектов класса QAction. Т.е. добавляем событие к пункту меню, которое связывается с обработчиком события с помощью функции connect(). Через  главное меню будет происходить настройка приложения и отображение краткой информации о приложении, с помощью диалогового окна. Диалоговое окно создаётся с помощью объекта класса QDialog, к которому мы подключаем спроектированное диалоговое окно в QtDesigner. Выход из приложения так же осуществляется с помощью главного меню. Через главное меню можно будет начать игру заново с новыми начальными данными. При этом вызывается функция restart(), в которой вызывается метод random(), созданного нами класса Life, который и задаёт новые значения экземпляру imatrix[20][20] класса Life. По данным массива imatrix  происходят основные расчёты. Так же функция restart() вызывает функцию repaint(), которая производит перерисовку клеток.

 

 

 

 

3.2 Описание используемых  типов данных 


Для реализации программного модуля используются следующие типы данных:

    • Int – целочисленный тип данных, используемый для фиксирования расчётов в программе.
    • QString – строковый тип данных, предназначенный хранения строковых величин.
    • QPushButton – тип, используемый для добавления на форму кнопок.
    • QMenu – тип, используемый для добавления на форму главного меню
    • QAction - тип, используемый для реализации функциональности пунктов главного меню.
    • QDialog – тип, используемы для добавления в приложение диалоговых окон.
    • QPainter - тип, используемый для рисования объектов на форме.
    • QHBox Layout - тип, используемый для горизонтальной компоновки виджетов на форме.
    • QWidget - тип, используемый для отображения и использования виджетов.
    • QValidator - тип, используемый для ограничения ввода данных пользователем.

 

 

 

 

 

3.3 Создание основной  формы программы


Основная форма программы создаётся, с помощью следующего кода:

QWidget *wgt = new QWidget;

int h;

int w;

h = a.screen()->geometry().height();

w = a.screen()->geometry().width();

board = new Life;

setWindowTitle(tr("Жизнь - Игра"));

setGeometry((h - (board->n_c*50)+115)/2,(h - board->n_r*50+70)/4, 1, 1);

setFixedSize(board->n_c*50+115,board->n_r*50+70);     

setCentralWidget(wgt);

QPushButton *btngo = new QPushButton(QObject::tr("Вперед"));

btngo->setFixedSize(70,28);

QObject::connect(btngo, SIGNAL(clicked()), board, SLOT(ris()));

QHBoxLayout *lay = new QHBoxLayout; 

lay->addWidget(board);                  

lay->addWidget(btngo);

wgt->setLayout(lay);

createActions();

createMenus();

 

 

 

 

 

 

3.4 Написание кода  основных расчетов


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

int count = 0;

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

{

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

{

if (imatrix[i+1][j] == 1) count++;

if (imatrix[i+1][j+1] == 1) count++;

if (imatrix[i+1][j-1] == 1) count++;

if (imatrix[i][j+1] == 1) count++;

if (imatrix[i][j-1] == 1) count++;

if (imatrix[i-1][j-1] == 1) count++;

if (imatrix[i-1][j] == 1) count++;

if (imatrix[i-1][j+1] == 1) count++;

if (count > 1 && count < 4 && imatrix[i][j] == 1) newmatrix[i][j] =1;

if (count == 3 && imatrix[i][j] == 0) newmatrix[i][j] =1;

if (count > 3) newmatrix[i][j] = 0;

if (count < 2) newmatrix[i][j] = 0;

count = 0;

}

}

 

 

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


for (int j = 0; j < n_c; j++) imatrix[i][j] = newmatrix[i][j];

repaint();

В зависимости от обработанных данных функцией ris(), происходит перерисовка поля, на котором отображается новое расположение клеток. Перерисовка осуществляется с помощью функции repaint(), которая вызывает в себе переопределённую нами виртуальную функцию paintEvent().

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3.5 Вывод результатов


В зависимости от условий расположения закрашенных клеток, результаты могут быть различны. К примеру, если на поле остались только 4 клетки, расположенные рядом друг с другом кубиком, то на этом игра и остановится, потому что по условиям игры в этой ситуации клетки не рождаются и не погибают. Данный результат игры отображён на скриншоте:

Может ещё возникнуть ситуация когда происходит зацикливание итераций жизненных циклов. К примеру, если на поле остались 3 клетки расположенные в ряд или в столбик, то будет бесконечно меняться картинка с 3-х живых клеток в ряд в 3 живые клетки в столбик, и наоборот. Данную ситуацию можно посмотреть на следующем скриншоте:

 

 

 

 

 


из этого получится следующие и будет происходить по кругу:

Так же возможно, что некоторые результаты будут совместимы, что мы и видели на предыдущих двух скриншотах.

 

 

 

 Может возникнуть такая ситуация, что все клетки погибнут, тогда появится оповещающее окно об окончанни игры, после чего игра начнётся заново. Данная ситуация отображена на следующем скриншоте:


 

 

 

 

 

 

 

 

 

 

 

3.6 Проектирование  интерфейса программы


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

 

 

 

 

 

 

 

 

 

 

 

 

 

Глава 4. Тестирование программного модуля


4.1 Тестирование  программы

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Заключение


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Список литературы


Язык программирования С++ специальное издание / Бьёрн Страуструп; перевод с английского С. Анисимова и М. Кононова; под ред. Ф. Андреева и У. Ушакова. – Москва: Бином-Пресс, 2007. – 753-755 с.

Qt4: программирование GUI на С++ / Жасмин Бланшет, Марк Саммерфилд. – Москва: КУДИЦ-ПРЕСС, 2007. – 14-73 с.

 

 

 

 



 


Информация о работе Игра Конвея "Жизнь"