Описание и программирование матричных игр

Автор работы: Пользователь скрыл имя, 17 Ноября 2011 в 08:04, курсовая работа

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

Теория игр – раздел математики, предметом которого является изучение математических моделей принятия оптимальных решений в условиях конфликта.
ИГРОЙ называется всякая конфликтная ситуация, изучаемая в теории игр и представляющая собой упрощенную, схематизированную модель ситуации. От реальной конфликтной ситуации игра отличается тем, что не включает второстепенные, несущественные для ситуации факторы и ведется по определенным правилам, которые в реальной ситуации могут нарушаться

Содержимое работы - 1 файл

Отчет.doc

— 1.79 Мб (Скачать файл)

            sprintf(buf, "%i", this->win_pltwo[a][st]);

            this->setOutTblItem(a - 1, 5, QString::fromLocal8Bit(buf));

            //Y - приближенное значение цены игры

            sprintf(buf, "%.2f", (float)(this->win_plone[a][st1] + this->win_pltwo[a][st])/ (a * 2));

            this->setOutTblItem(a - 1, 6, QString::fromLocal8Bit(buf));

            /**/

            a++;

        }while(a <= kl);

    }

}

 
6.4 Организация интерфейса

 

Рисунок 4. Проектирование формы. 

Основные компоненты и их назначение:

  1. tableWidget – компонент таблица, предназначен для ввода пользовательской матрицы.
  2. spinBox – компонент счетчик, предназначен для изменения количества строк таблицы tableWidget.
  3. spinBox_2 - компонент счетчик, предназначен для изменения количества столбцов таблицы tableWidget.
  4. player1, player2 – компоненты переключатели, устанавливают, какой игрок первым начинает ходить.
  5. strateg – компонент текстовое поле, в него вводится выбранная игроком начальная стратегия.
  6. iteration - компонент текстовое поле, в нем указывается количество итераций(выполняемых шагов).
  7. startBtn – компонент кнопка, при нажатии начинает приближенное решение матричной игры методом Брауна-Робинсона.
  8. defArrayBtn - компонент кнопка, при нажатии устанавливает значения таблицы tableWidget в значения по умолчанию(как при запуске программы).
  9. outTable - компонент таблица, предназначен для вывода решений.

   Для более приятного диалога с программой был использован интерфейс под названием «Plastique», использованный в операционной системе «Kubuntu». 

   Для более удобного использования компоненты сгруппированы на панелях с заголовками. 

Рисунок 5. Сравнение программы со стандартным оформлением и с оформлением «Plastique»

 

7. Экспериментально  – прикладная  часть

7.1. Руководство  программиста

   Для написания программы были использованы библиотеки Nokia QT версии 4.5.0 скомпилированные и настроенные на платформу win32 операционной системы Windows.

   Программа базируется на типе проекта «GUI приложение QT» (рис. 7.1), и использованными стандартными модулями.

   

Рисунок 7.1. Создание проекта.

   На  форме расположены необходимые  для работы программы компоненты. Основные использованные классы компонентов:

    • QMainWindow
    • QWidget
    • QToolBox
    • QFrame
    • QGroupBox
    • QPushButton
    • QLabel
    • QSpinBox
    • QTableWidget
    • QRadioButton
    • QLineEdit
    • QTextBrouser
    • QStatusBar
   

   

   

Рисунок 7.2. Иерархия расположения компонентов на форме.

 

   Main.cpp:

   

   

   #include <QtGui/QApplication>

   #include <QWindowsVistaStyle>

   #include <QFile>

   #include "mainwindow.h" 

   int main(int argc, char *argv[])

   {

       QApplication a(argc, argv); 

       /*

           Загрузка таблицы стилей

       */

       QFile file(".\\style.txt");

       if(file.open(QIODevice::ReadOnly))

       {

           QByteArray line;

           while (!file.atEnd())

                  line += file.readLine(); 

           //Применение таблицы стилей

           a.setStyleSheet(QString::fromLocal8Bit(line));

       }

       MainWindow w;

       w.show();

       return a.exec();

   }

 

    mainwindow.h: 

   #ifndef MAINWINDOW_H

   #define MAINWINDOW_H 

   #include <QMainWindow>

   #include "windows.h"

   

   #include "QWindowsVistaStyle.h" 

   namespace Ui {

       class MainWindow;

   } 

   class MainWindow : public QMainWindow {

       Q_OBJECT

   public:

       MainWindow(QWidget *parent = 0);

       ~MainWindow(); 

   protected:

       void changeEvent(QEvent *e); 

   private:

       int **array;//матрица пользоателя

       int m, n;//размерность матрицы пользователя

       bool nol;//Все элеметы равны 0?

       bool otr;//Наличие отрицательных элементов

       int min, max;//Минимальный и максимальный элементы

       DWORD win_plone[150][10], win_pltwo[150][10];//Массивы для выигрышей игроков 1 и 2

       int a;//Счетчик итераций

       int pl;//Игрок

       short st,st1,st2;//Стратегии

       short kl;//Количество итераций

       int PlayerOne();

       int PlayerTwo();

       void setOutTblItem(int row, int col, QString text);

       Ui::MainWindow *ui;

   private slots:

       void StartBtn();

       void SetDefArray();

       void UpdateTableRows(int value);

       void UpdateTableColumn(int value);

   };

   #endif // MAINWINDOW_H

 

   mainwindow.cpp: 

   #include "mainwindow.h"

   #include "ui_mainwindow.h"

   #include "QMessageBox.h" 

   MainWindow::MainWindow(QWidget *parent) :

   

       QMainWindow(parent),

       ui(new Ui::MainWindow)

   {

       //Инициализация графического интерфейса

       ui->setupUi(this); 

       /*

         Установка количества строк и  столбцов таблицы

       */

       this->ui->tableWidget->setRowCount(3);

       this->ui->tableWidget->setColumnCount(3); 

       /*

         Установка начальных значений  для счетчиков

       */

       this->ui->spinBox->setValue(3);

       this->ui->spinBox_2->setValue(3); 

       QHeaderView *h = new QHeaderView(Qt::Horizontal);

       h->setDefaultSectionSize(50);

       this->ui->tableWidget->setHorizontalHeader(h); 

       //Активна вкладка "Программа"

       this->ui->toolBox->setCurrentIndex(0); 

       //Заполнение матрицы значениями по умолчанию

       this->SetDefArray(); 

       //Загрузка стартовой страницы  справки

       this->ui->textBrowser->setSource(QUrl(QString("qrc:/help/index.html"))); 

       //Подключение событий

       this->ui->spinBox->connect(this->ui->spinBox, SIGNAL(valueChanged(int)), this, SLOT(UpdateTableRows(int)));

       this->ui->spinBox_2->connect(this->ui->spinBox_2, SIGNAL(valueChanged(int)), this, SLOT(UpdateTableColumn(int)));

       this->ui->defArrayBtn->connect(this->ui->defArrayBtn, SIGNAL(clicked()), this, SLOT(SetDefArray()));

       this->ui->startBtn->connect(this->ui->startBtn, SIGNAL(clicked()), this, SLOT(StartBtn())); 

   }

     

   MainWindow::~MainWindow()

   {

       delete ui;

   } 

   void MainWindow::changeEvent(QEvent *e)

   {

       QMainWindow::changeEvent(e);

       switch (e->type()) {

       case QEvent::LanguageChange:

           ui->retranslateUi(this);

           break;

       default:

           break;

       }

   } 

   void MainWindow::SetDefArray()

   {

       short a[3][3] =

       {

           {0,4,2},

           {3,1,0},

           {1,2,3}

       }; 

       this->ui->tableWidget->setRowCount(3);

       this->ui->tableWidget->setColumnCount(3); 

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

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

           {

               QTableWidgetItem *item = new QTableWidgetItem(0);

               QString s;

               item->setText(s.setNum(a[i][j], 10));

               this->ui->tableWidget->setItem(i, j, item);

           }

   } 

   void MainWindow::setOutTblItem(int row, int col, QString text)

   {

       QTableWidgetItem *item = new QTableWidgetItem(0);

       item->setText(text);

       item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);

       item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);

       this->ui->outTable->setItem(row, col, item);

   } 

   void MainWindow::UpdateTableRows(int value)

   

   {

       this->ui->tableWidget->setRowCount(value);

   } 

   void MainWindow::UpdateTableColumn(int value)

   {

       this->ui->tableWidget->setColumnCount(value);

   } 

   /*

     Функция  определения следующего хода  для игрока 1

   */

   int MainWindow::PlayerOne()

   {

       int a2, Max;

       Max = this->win_plone[this->a][0]; 

       if(this->pl == 1)

           a2 = m;

       else

           a2 = n; 

       int id = 0; 

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

           if(this->win_plone[a][i] > Max)

           {

               Max = this->win_plone[a][i];

               id = i;

           }

       return id;// Max

Информация о работе Описание и программирование матричных игр