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

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

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

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

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

Отчет.doc

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

   Преимущества  С++ по сравнению с аналогичными программными продуктами.

  • быстрота разработки приложения;
  • высокая производительность разработанного приложения;
  • низкие требования разработанного приложения к ресурсам компьютера;
  • наращиваемость за счет встраивания новых компонент и инструментов в среду C++;
 
 
 
 
 
  • возможность разработки новых компонент и  инструментов собственными средствами QT (QT поставляется с полным исходным кодом);
  • удачная проработка иерархии объектов.

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

   К тому же работодателей интересует, прежде всего, скорость и качество создания программ, а эти характеристики может  обеспечить только среда визуального  проектирования, способная взять  на себя значительные объемы рутинной работы по подготовке приложений, а также согласовать деятельность группы постановщиков, кодировщиков, тестеров и технических писателей. Возможности QT C++ полностью отвечают подобным требованиям и подходят для создания систем любой сложности.

     

   В приложении приведена реализация итеративного метода Брауна-Робинсона решения  матричных игр в среде программирования QT 4.5.0 для платформы win32, на языке C++.

   Пользователь  вводит матрицу выигрышей размера  , где , .

   Далее машина запрашивает информацию о  том, кто из игроков начинает игру, какую стратегию он выбирает и  количество итераций.

   Во  второй таблице выводятся результаты разыгрывании игры за определённое число  итераций.

 

   

6.2 Разработка структуры данных

    Пользователь  вводит время начала работы и время  продолжительности работы. Количество окошек и максимальное время ожидания в очереди. Информация об очередях хранятся в массивах объединенных в структуры  данных. 

6.3 Разработка программного алгоритма

   В программном модуле будет три  основные функции: функция определения следующего хода для первого игрока (PlayerOne()), функция определения следующего хода для второго игрока (PlayerTwo) и функция решения матричной игры итерационным методом Брауна-Робинсона (реакция на нажатие кнопки StartBtn).

  1. Размерность матрицы( )

  1. Пользователь  ввел матрицу.
  2. Проверить, не являются ли все введенные элементы нулями?
  3. Если все элементы равны нулям, вывести сообщение и не продолжать работу.
  4. Найти минимальный элемент матрицы.
  5. Проверить наличие отрицательных элементов в матрице пользователя.
  6. Если есть отрицательные элементы, вычесть из них минимальный элемент, перезаполнить матрицу.
  7. Какой игрок ходит первым?
  8. Если первым ходит первый игрок, перейти к шагу 10, иначе к шагу 13
  9. Сформировать матрицу выигрышей первого игрока.
  10. Сформировать матрицу выигрышей второго игрока.
  11. Перейти к шагу 15
  12. Сформировать матрицу выигрышей второго игрока.
  13. Сформировать матрицу выигрышей первого игрока.
  14. Вывести информацию о выигрышах игроков на экран в виде таблицы.
 

     

Рисунок 1. Блок схема работы функции ‘PlayerOne’

 

 

 

 

/*Функция определения  следующего хода для игрока 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

}

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

int MainWindow::PlayerTwo()

{

    int a2, Min;

    Min = this->win_pltwo[this->a][0];

    if(this->pl == 1)

        a2 = n;

    else

        a2 = m;

    int id = 0;

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

        if(this->win_pltwo[a][i] < Min)

        {

            Min = this->win_pltwo[a][i];

            id = i;

        }

    return id;//Min

}

void MainWindow::StartBtn()

{

    this->m = this->ui->tableWidget->rowCount();

    this->n = this->ui->tableWidget->columnCount(); 

    /*

      Предположим, что:

    */

    this->nol = true;//Есть элементы равные 0

    this->otr = false;//Отрицательных элементов нет

    this->min = this->ui->tableWidget->item(0, 0)->text().toInt();//Минимальный элемент 

    /*

      Заполнение пользовательского массива  и флагов

    */

    this->array = new int*[m]; 

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

    {

        this->array[i] = new int[n];

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

        {

            if(this->ui->tableWidget->item(i, j)->text() != "")

                this->array[i][j] = this->ui->tableWidget->item(i, j)->text().toInt();

            else

                this->array[i][j] = 0; 

            if(this->array[i][j])

                this->nol = false;

            if(this->array[i][j] < 0)

                this->otr = true;

            if(this->array[i][j] < min)

                min = this->array[i][j];

        }

    }

    /*

      Итеративный метод Брауна-Робинсона

    */

    if(this->nol)//Все  элементы матрицы - 0

    {

        QMessageBox::warning(this, QString::fromLocal8Bit("Ошибка!"),

            QString::fromLocal8Bit("Все элементы матрицы равны 0!"),

            QMessageBox::Cancel);

        //QString::fromAscii()

    }

    else

    {

        if(this->otr)//если есть отрицательные элементы

        {

            for(int j = 0; j < this->m; j++)

                for(int i = 0; i < this->m; i++)

                    this->array[i][j] = array[i][j] - this->min;

            //Вывод окончательной матрицы

            for(int j = 0; j < this->m; j++)

                for(int i = 0; i < this->n; i++)

                {

                    QTableWidgetItem *item = new QTableWidgetItem(0);

                    QString s;

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

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

                }

        }

        a = 1;

        /*Игрок который ходит первым*/ 

        if(this->ui->player1->isChecked())

            this->pl = 1;

        else

            this->pl = 2;

        /*Начальна стратегия*/

        this->st = this->ui->strateg->text().toInt() - 1;

        /*Количество итераций*/

        this->kl = this->ui->iteration->text().toInt();

        for(int i = 0; i < this->n; i++)

            this->win_plone[0][i] = 0;

        do

        {

            if(this->pl == 2)//Ходит второй игрок

            {

                for(int i = 0; i < this->n; i++)//Формирование  матрицы выигрышей 1 игрока

                    this->win_plone[a][i] = this->array[st][i] + this->win_plone[a - 1][i];//

                st1 = this->PlayerOne();

                for(int i = 0; i < this->m; i++)//Формирование матрицы выигрышей 2 игрока

                    this->win_pltwo[a][i] = this->array[i][st1] + this->win_pltwo[a - 1][i];//

                st = this->PlayerTwo();

            }

            else

            {

                for(int i = 0; i < this->m; i++)//Формирование матрицы выигрышей 1 игрока

                    this->win_plone[a][i] = this->array[i][st] + this->win_plone[a - 1][i];//

                st1 = this->PlayerOne();

                for(int i = 0; i < this->n; i++)//Формирование матрицы выигрышей 2 игрока

                    this->win_pltwo[a][i] = this->array[st1][i] + this->win_pltwo[a - 1][i];//

                st = this->PlayerTwo();

            }

            this->ui->outTable->setRowCount(a);

            /*

              Внесение данных в таблицу

            */

            char buf[50] = "";

            for(int i = 0; i < this->n; i++)

                sprintf(buf, "%s %i", buf, this->win_plone[a][i]);

            //qDebug("%s", buf);

            this->setOutTblItem(a - 1, 1, QString::fromLocal8Bit(buf));//Выйграш первого игрока

            sprintf(buf, "%i", st1);

            this->setOutTblItem(a - 1, 0, QString::fromLocal8Bit(buf));//Стратегия первого игрока

            sprintf(buf, "%i", st);//Стратегия второго игрока

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

            sprintf(buf, "");

            for(int i = 0; i < this->m; i++)

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

            //Выйграш второго игрока

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

            //V - вывод наибольшего суммарного выигрыша 1 игрока

            sprintf(buf, "%i", this->win_plone[a][st1]);

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

            //W - вывод наибольшего суммарного выигрыша 2 игрока

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