Логическая игра "Морской бой"

 

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ

РОССИЙСКОЙ ФЕДЕРАЦИИ

Федеральное государственное бюджетное образовательное учреждение

высшего профессионального образования

«НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ ТОМСКИЙ ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»

Институт дистанционного образования

Кафедра Автоматики и компьютерных систем

Направление «Управление в технических системах»





Пояснительная записка к курсовой работе

по дисциплине

«Объектно-ориентированное программирование»



Студент гр. З-8001 Поспелова И.В.

Ассистент каф. АиКС Татарский Ф. Е.








Томск - 2013


Оглавление


Введение

. Задание на курсовую работу

. Правила игры

.1 Описание классов игры

. Описание работы приложения

Заключение

Список использованных источников

Приложение А



Введение


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

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

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

Целью данной курсовой работы была разработка кроссплатформенной игры «Морской бой». В качестве языка программирования был взят язык программирования С++, так как это чрезвычайно мощный язык, содержащий средства создания эффективных программ практически любого назначения, от низкоуровневых утилит и драйверов до сложных программных комплексов самого различного назначения. Также С++ дает возможность разрабатывать программы для самых различных платформ и систем.

В качестве инструмента кроссплатформенной разработки мною была выбрана библиотека qt и среда разработки qt creator. Qt предоставляет программисту не только удобный набор библиотек классов, но и определённую модель разработки приложений, определённый каркас их структуры. Следование принципам и правилам «хорошего стиля программирования на C++/Qt» существенно снижает частоту таких трудно отлавливаемых ошибок в приложениях, как утечки памяти (memory leaks), необработанные исключения, незакрытые файлы или неосвобождённые дескрипторы ресурсных объектов.

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



1 Задание на курсовую работу


Разработать программу - компьютерную логическую игру. В результате выполнения данной работы студенты осваивают приемы практического использования объектно-ориентированного подхода в создании законченного программного продукта:

·Реализующую выбранную компьютерную логическую игру;

·Обладающего графическим интерфейсом пользователя;

·Удовлетворяющего требованию переносимости на кровне исходного кода;

·Простого в установке и обслуживании.

Программа должна предоставлять следующие возможности:

·Начало игры на чистом поле, сброс предыдущей игры;

·Выбор противника (человек, компьютер), если применимо;

·Сохранение текущей игры в любой момент игры в файл, восстановление состояния игры из файла;

·Отмену хода (если применимо);

·Подсказку следующего хода (если применимо);

·Контроль правильности хода игрока(ов);

·Определение конца игры, отслеживание патовых ситуаций;

·Возможность задания произвольного размера поля (если применимо);

·Возможность визуального редактирования уровней (если применимо);

·Управление как с клавиатуры, так и мышью;

·Настройку клавиш управления;

·Использование горячих клавиш;

·Возможность задания настроек в конфигурационном файле или реестре Windows;

·Индикацию текущего счета (если применимо);

·Ведение списка чемпионов для каждого размера поля;

·Выбор уровня сложности игры (если применимо);

·Вынесение графических элементов (курсоры, иконки, спрайты) в ресурсный файл (если применимо);

·Наличие инсталлятора (показ лицензии, выбор устанавливаемых компонентов, выбор пути установки и т.п.).

Логическая игра «Морской бой».

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

·Расстановку кораблей на игровом поле 10х10;

·Выбор противника (человек, компьютер);

·Изменение интерфейса в зависимости от выбора противника;

·Фиксацию имен противников и число побед.



2. Правила игры


«Морской бой» - игра для двух участников, в которой игроки по очереди называют координаты на неизвестной им карте соперника. Если у соперника по этим координатам имеется корабль (координаты заняты), то корабль или его часть «топится», а попавший получает право сделать ещё один ход. Цель игрока - первым поразить все корабли противника.

Игровое поле - квадрат 10×10 каждого игрока (рисунок 1), на котором размещается флот кораблей.


Рисунок 1


Горизонтали обычно нумеруются сверху вниз, а вертикали помечаются буквами слева направо. При этом используются буквы русского алфавита от «а» до «к» (буквы «ё» и «й» обычно пропускаются), либо буквы латинского алфавита от «a» до «j».

На поле размещаются:

·1 корабль - ряд из 4 клеток («линкоры», или «четырёхпалубные»)

·2 корабля - ряд из 3 клеток («крейсеры», или «трёхпалубные»)

·3 корабля - ряд из 2 клеток («эсминцы», или «двухпалубные»)

·4 корабля - 1 клетка («подлодки», или «однопалубные»)

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

Рядом со «своим» полем чертится «чужое» такого же размера, только пустое. Это участок моря, где плавают чужие корабли противника.

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

Игра считается законченной, когда будут убиты все корабли одного из противников.


2.1 Описание классов игры


) Класс Ships. Представляет собой абстрактный класс, описывающий корабли. Класс содержит в себе:

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

целочисленный двумерный массив location, в который будут записываться координаты палуб для каждого корабля на игровом поле.

) Класс BattleShip. Наследуется от Ships, характеризует четырехпалубный корабль.

) Класс Cruiser. Наследуется от Ships, характеризует трехпалубный корабль.

) Класс Destroyer. Наследуется от Ships, характеризует двухпалубный корабль.

) Класс Boat. Наследуется от Ships, характеризует однопалубный корабль.

) Класс Field. Является абстрактным классом. Описывает игровое поле.

В программе игровое поле представляет собой целочисленную матрицу размером 10х10. Элементы матрицы могут принимать 4 различных значения:

«- 1» - пустая клетка;

«0» - клетка является палубой корабля;

«1» - палуба подбита;

«2» - в эту позицию стреляли, но промахнулись.

На основании данных этой матрицы осуществляется графическая прорисовка игровых полей.

В классе Field описаны следующие функции:

Функция прорисовки пустого игрового поля.

Функция формирования матрицы игрового поля.

Функция загрузки и прорисовки загруженного игрового поля.

Функции, осуществляющие построение кораблей для каждого игрока

Функции формирования массивов локации для каждого корабля.

Функции сохранения игрового поля и координат локации для каждого корабля.

Функцию, осуществляющую стрельбу игроком-человеком.

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

Функции, осуществляющие проверку на гибель корабля в случае попадания.

) Класс PlayerField. Наследуется от класса Field и описывает поле игрока-человека.

) Класс EnemyField. Наследуется от класса Field и описывает поле игрока-компьютера.

) Класс PutName. Представляет собой виджет для ввода имен игроков и передачу этих имен в другие классы программы.

) Класс SelectMode. Представляет собой виджет для выбора режима игры: человек-человек или человек-компьютер. Передает данные о выбранном режиме игры в другие классы программы для дальнейшей обработки.

) Класс StartWidget. Представляет собой виджет, который выводится на экран при запуске игры. Виждет предлагает выбрать игроку один из следующих пунктов:

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

Загрузить игру. При выборе этого пункта откроется файловый диалог, предлагающий игроку загрузить ранее сохраненную игру. После выбора соответствующего файла, игрок сможет продолжить игру с момента сохранения.

Выход. При выборе этого пункта произойдет закрытие игры.

) Класс MainWindow. Представляет собой виджет, описывающий основное окно игры. Содержит в себе два игровых поля: поле игрока и поле соперника и меню игры со следующими пунктами:

а) Пункт «Игра». Содержит в себе следующие подпункты:

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

Сохранить. При выборе этого пункта откроется файловый диалог, предлагающий игроку сохранить игру в выбранном месте под выбранным именем.

Загрузить. При выборе этого пункта игроку будет предложено сохранить текущую игру. Затем откроется файловый диалог, предлагающий выбрать и загрузить файл сохраненной ранее игры.

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

б) Пункт «Справка». Содержит в себе следующие подпункты:

О программе. При выборе этого пункта на экране появится сообщение с названием программы и именем разработчика.

Как играть. При выборе этого пункта на экране появится окно, содержащее в себе правила игры.

) Класс SrlrctionShips. Класс представляет собой виджет, появляющийся при начале новой игры и позволяющий игроку выбрать размер корабля и контролирующий необходимое количество кораблей с выбранным размером.



3. Описание работы приложения


При установке игры пользователь выбирает пусть установки игры (рисунок 2).


Рисунок 2


При старте игры на экране появляется окно, изображенное на рисунке 3, предлагающее игроку сделать выбор.



Рисунок 3


Если игрок решил начать новую игру, на экране появится сообщение, изображенное на рисунке 4, предлагающее выбрать режим игры.


Рисунок 4


После того, как режим игры был выбран, Игроку необходимо ввести свое имя (рисунок 5).


Рисунок 5

Далее игроку необходимо расставить на своем поле корабли (рисунок 6, рисунок 7).


Рисунок 6


Рисунок 7


Если при расстановке кораблей игрок попытается поставить корабль не по правилам, то он будет предупрежден выводом на экран сообщения (Рисунок 8).


Рисунок 8


Если игра идет в режиме человек-человек, то игроки расставляют свои корабли по очереди, после чего экран затемняется и начинается игра (Рисунок 9).


Рисунок 9


Если игра идет в режиме человек-компьютер, то экран не затемняется (рисунок 10).



Рисунок 10


При победе одного из игроков на экран выводится соответствующее сообщение (рисунок 11)


Рисунок 11


Если игрок пожелает сохранить или загрузить игру, то при выборе соответствующего пункта меню на экран будет выведен файловый диалог соответственно для сохранения или для загрузки файла (рисунок 12).


Рисунок 12


При выборе в меню справки пункт «О программе», игрок может получить информацию о приложении (рисунок 13)


Рисунок 13


Если игрок пожелает ознакомиться с правилами игры, он может выбрать в меню справки пункт «Как играть», после чего на экране появится соответствующее окно (рисунок 14)


Рисунок 14



Заключение


В ходе выполнения курсовой работы были закреплены и углублены навыки использования объектно-ориентированного подхода к программированию.

При помощи языка C++ и библиотеки Qt было спроектировано и разработано готовое кроссплатформенное приложение, соответствующее всем требованиям поставленной задачи.

Приложение осуществляет расстановку кораблей на игровом поле 10х10, предоставляет выбор противника, осуществляет сохранение и загрузку игры из файла. Также в игре отслеживается правильность ходов, правильность расстановки кораблей и момент окончания игры. Приложение обеспечивает возможность начать новую игру на чистом поле и сброс предыдущей игры.

Помимо этого, настройки игры вынесены в конфигурационный файл settings.conf и загружаются в программу из него.

Также при помощи программы WinRar был сделан инсталлятор, позволяющий выбрать путь распаковки приложения.

кроссплатформенный компьютерной игра класс


Список использованных источников


1. «Qt 4.5. Профессиональное программирование на С++» М. Шлее - СПб.: БХВ-Петербург, 2010. 896 с.

. «С++: руководство для начинающих» Г. Шилдт - М.: Издательский дом «Вильямс», 2005. 672 с.

. «Qt 4: программирование GUI на С++» Ж. Бланшет, М. Саммерфилд - М.: КУДИЦ-ПРЕСС, 2008. 736 с.

. «Язык программирования С++. Лекции и упражнения» С. Прата - М.: ООО «И.Д. Вильямс», 2012. 1248 с.



Приложение А


Исходный текст программы


Файл battleship.h

#ifndef BATTLESHIP_H

#define BATTLESHIP_H


#include "ships.h"

BattleShip : public Ships

{:();

~BattleShip();

};


#endif // BATTLESHIP_H


Файл battleship.cpp

#include "battleship.h"

::BattleShip()

{i;=4;

= new int*[amountDeck];(i=0;i<amountDeck;i++)[i]=new int[2];

}

::~BattleShip()

{i;(i=0;i<amountDeck;i++)[] location[i];[] location;

}


Файл boat.h

#ifndef BOAT_H

#define BOAT_H


#include "ships.h"

Boat : public Ships

{:();

~Boat();

};


#endif // BOAT_H


Файл boat.cpp

#include "boat.h"

::Boat()

{i;=1;

= new int*[amountDeck];(i=0;i<amountDeck;i++)[i]=new int[2];

}

::~Boat()

{i;(i=0;i<amountDeck;i++)[] location[i];[] location;

}


Файл cruiser.h

#ifndef CRUISER_H

#define CRUISER_H


#include "ships.h"

Cruiser : public Ships

{:();

~Cruiser();

};


#endif // CRUISER_H

Файл cruiser.cpp

#include "cruiser.h"

::Cruiser()

{i;=3;

= new int*[amountDeck];(i=0;i<amountDeck;i++)[i]=new int[2];

}

::~Cruiser()

{i;(i=0;i<amountDeck;i++)[] location[i];[] location;

}


Файл dectroyer.h

#ifndef DESTROYER_H

#define DESTROYER_H


#include "ships.h"

Destroyer : public Ships

{:();

~Destroyer();

};


#endif // DESTROYER_H


Файл dectroyer.cpp

#include "destroyer.h"

::Destroyer()

{i;=2;

= new int*[amountDeck];(i=0;i<amountDeck;i++)[i]=new int[2];

}

::~Destroyer()

{i;(i=0;i<amountDeck;i++)[] location[i];[] location;

}


Файл enemyfield.h

#ifndef ENEMYFIELD_H

#define ENEMYFIELD_H

#include "field.h"

EnemyField : public Field

{_OBJECT:();

~EnemyField();

calcPos();buildShips(int size);mousePressEvent(QMouseEvent *event);


:EFSignal();

slots:autoBuild();

};


#endif // ENEMYFIELD_H


Файл enemyfield.hcpp

#include "enemyfield.h"

::EnemyField()

{>setScene(&scene);

}EnemyField::calcPos()

{= (rand() % 9+0)+1;= (rand() % 9+0)+1;

}

EnemyField::mousePressEvent(QMouseEvent *event)

{x, y;= event->pos().x()-30;= event->pos().y()-20;(event->button()==Qt::LeftButton)

{(x>=30&&x<=330&&y>=30&&y<=330)

{=y/30;=x/30;startFight();

}

}

}

EnemyField::autoBuild()

{l;

=4;(size);(l=0;l<2;l++)

{=0;=3;(size);

}

(l=0;l<3;l++)

{=0;=2;(size);

}

(l=0;l<4;l++)

{=0;=1;(size);

}=10;

}

EnemyField::buildShips(int size)

{(amount!=1)

{();(flag, t, size);

}

}::~EnemyField()

{


}


Файл field.h

#ifndef FIELD_H

#define FIELD_H


#include <QtGui>

#include <QApplication>

#include <QSettings>

#include "battleship.h"

#include "cruiser.h"

#include "destroyer.h"

#include "boat.h"

Field : public QGraphicsView

{_OBJECT:();

~Field();

scene;paintField(QColor Bcolor, QColor Lcolor);

player[10][10];iShip, jShip;size;amount;flag;t;move;thI, twI, oI;K;f;lhit, h;M[4][2];sizeField, sizeDeck;lColor, bColor, deckColor, hitColor;

fourDeck;threeDeck[2];twoDeck[3];oneDeck[4];

void calcPos(int x, int y); //сопоставляет позицию нажатия ЛКМ с player[][]loadField(QColor lColor, QColor bColor, QColor deckColor, QColor hitColor); //выгружает player[][] на игровое полеsave(QByteArray &array);saveShips(QByteArray &array);supSaveShips(QByteArray &array, int s, int **m);matrix();

:completed();startFight();endFight();miss();hit();

slots:fire();

:selectShip(int &flag, int &t, int &size); //выделяет палубы для окончательной прорисовкиpaintShip(int size, QColor lColor, QColor deckColor); //заполняет player[][] checkPosition(); //проверяет, можно ли поставить палубу

void wound(int i, int j, QColor lColor, QColor hitColor); //обрабатывает попадание в корабльpast(QColor lColor, int i, int j); //обрабатывает промахpaintDeck(QColor lColor, QColor deckColor, int i, int j); //рисует палуьбы

getLocation(int size, int i, int j, int locI); //записывает координаты палоб для каждого корабля checkDeath(int i, int j); //проверка на уничтожение корабля

void supCheck(int sizeShip, int **a); //вспомогательнаяpaintPoints(int sizeShip, int **a, QColor lColor);

};


#endif // FIELD_H

Файл field.cpp

#include "field.h"

::Field()

{=-1;=0;=0;=0;=0;=0;

=0;=0;=0;=0;=0;=0;

path=QApplication::applicationDirPath()+"/settings.conf";

*settings = new QSettings(path,QSettings::IniFormat);= settings->value("settings/sizeField").toInt();()<<sizeField;= settings->value("settings/sizeDeck").toInt();

();

}

Field::paintField(QColor Bcolor, QColor Lcolor)

{i, j;ch;str;*numbers, *letters;.setBackgroundBrush(QBrush(Bcolor));


//------прорисовка поля-------------------------------------(i=30;i<330;i=i+30)(j=30;j<330;j=j+30).addRect(j, i, sizeDeck, sizeDeck, QPen(Lcolor), QBrush(Bcolor));

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


//---------прорисовка букв и цифр---------------------------(i=1; i<=sizeField;i++)

{= scene.addText(QString::number(i));>setDefaultTextColor(Lcolor);>setPos(5, i*sizeDeck);

}

=1;(ch='A'; ch<='J';ch++)

{=ch;= scene.addText(str);>setDefaultTextColor(Lcolor);>setPos((i+0.3)*sizeDeck,0);++;

}

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

}

Field::matrix()

{i, j;(i=0;i<sizeField;i++)(j=0;j<sizeField;j++)[i][j]=-1;

}

Field::calcPos(int x, int y)

{


}

Field::loadField(QColor lColor, QColor bColor, QColor deckColor, QColor hitColor)

{i, j;(bColor, lColor);(i=0;i<sizeField;i++)(j=0;j<sizeField;j++)

{(player[i][j]==0)paintDeck(lColor, deckColor, i, j);if(player[i][j]==2)past(lColor, i+1, j+1);if(player[i][j]==1)wound(i+1, j+1, lColor, hitColor);

}

}

Field::checkPosition()

{i, j, f, iStart,jStart, jFinish, iFinish;=0;=iShip-1;=jShip-1;(i==0)iStart=0;iStart = i-1;

(j==0)jStart=0;jStart=j-1;

(i==9)iFinish=9;iFinish=i+1;

(j==9)jFinish=9;jFinish=j+1;

(player[iShip-1][jShip-1]==size)f=1;(i=iStart; i<=iFinish; i++)(j=jStart; j<=jFinish; j++)(player[i][j]==0)f=1;

(f!=0)return false;return true;

}

Field::selectShip(int &flag, int &t, int &size)

{i, j, f, iStart,jStart, jFinish, iFinish;=0;

(flag<size)

{=iShip-1;=jShip-1;(i==0)iStart=0;iStart = i-1;

(j==0)jStart=0;jStart=j-1;

(i==9)iFinish=9;iFinish=i+1;

(j==9)jFinish=9;jFinish=j+1;

(checkPosition())

{(t!=1)

{.addRect(jShip*sizeDeck, iShip*sizeDeck, sizeDeck, sizeDeck, QPen(Qt::red, 1));[iShip-1][jShip-1]=size;=1;=1;

}(i=iStart;i<=iFinish;i++)(j=jStart;j<=jFinish;j++)

{(player[i][j]==size)

{((i==iShip-1&&j!=jShip-1)||(i!=iShip-1&&j==jShip-1))

{.addRect(jShip*sizeDeck, iShip*sizeDeck, sizeDeck, sizeDeck, QPen(Qt::red, 1));[iShip-1][jShip-1]=size;=1;

}

}

}(f!=0)flag++;(flag==size)

{(size, lColor, deckColor);=0;=0;

(size==3)thI++;if(size==2)twI++;if(size==1)oI++;completed();++;

}

}

}

}

Field::paintShip(int size, QColor lColor, QColor deckColor)

{i, j;locI=0;

(i=0;i<sizeField;i++)(j=0;j<sizeField;j++)(player[i][j]==size)

{(lColor, deckColor, i, j);[i][j]=0;(size, i, j, locI);++;

}

}

Field::getLocation(int size, int i, int j, int locI)

{

(size==4)

{.location[locI][0]=i;.location[locI][1]=j;

}

if(size==3)

{[thI].location[locI][0]=i;[thI].location[locI][1]=j;

}if(size==2)

{[twI].location[locI][0]=i;[twI].location[locI][1]=j;

}if(size==1)

{[oI].location[0][0]=i;[oI].location[0][1]=j;

}


}

Field::save(QByteArray &array)

{i, j;

(i=0;i<sizeField;i++)

{(j=0;j<sizeField;j++).append(QString::number(player[i][j]));.append("\n");

}


}

Field::saveShips(QByteArray &array)

{i;(array, 4, fourDeck.location);

(i=0;i<2;i++)(array, 3, threeDeck[i].location);

(i=0;i<3;i++)(array, 2, twoDeck[i].location);(i=0;i<4;i++)(array, 1, oneDeck[i].location);


}

Field::supSaveShips(QByteArray &array, int s, int **m)

{i;(i=0;i<s;i++)

{.append(QString::number(m[i][0]));.append(" ");.append(QString::number(m[i][1]));.append("\n");

}

}

Field::fire()

{(player[iShip-1][jShip-1]!=0)

{(player[iShip-1][jShip-1]!=1&&player[iShip-1][jShip-1]!=2)

{(lColor, iShip, jShip);=0;miss();

}

}

{=1;=1;[lhit][0]=iShip-1;[lhit][1]=jShip-1;

++;[iShip-1][jShip-1]=1;(iShip-1, jShip-1);(iShip,jShip, lColor, hitColor);++;hit();(K==20)emit endFight();

}

}

Field::checkDeath(int i, int j)

{l;fD=0;thD=0;twD=0;oD=0;numShip=0;sizeShip;

(l=0;l<4;l++)(fourDeck.location[l][0]==i&&.location[l][1]==j)fD=1;(thI=0;thI<2;thI++)(l=0;l<3;l++)(threeDeck[thI].location[l][0]==i&&[thI].location[l][1]==j)

{=1;=thI;

}

(twI=0;twI<3;twI++)(l=0;l<2;l++)(twoDeck[twI].location[l][0]==i&&[twI].location[l][1]==j)

{=1;=twI;

}

(oI=0;oI<4;oI++)

{(oneDeck[oI].location[0][0]==i&&[oI].location[0][1]==j)

{=1;=oI;

}

}


(fD!=0)

{=4;(sizeShip, fourDeck.location);

}if(thD!=0)

{=3;(sizeShip, threeDeck[numShip].location);

}if(twD!=0)

{=2;(sizeShip, twoDeck[numShip].location);

}if(oD!=0)

{=1;(sizeShip, oneDeck[numShip].location);

}

}

Field::supCheck(int sizeShip, int**a)

{fD=0;l;(l=0;l<sizeShip;l++)

{(player[a[l][0]][a[l][1]]==1)fD++;

}(fD==sizeShip)

{=0;=0;=0;(sizeShip, a, lColor);

}

}

Field::paintPoints(int sizeShip, int**a, QColor lColor)

{i, j, l;k, m, n, p;

(l=0;l<sizeShip;l++)

{(a[l][0]==0)k=0;k = a[l][0]-1;

(a[l][0]==9)m=9;m=a[l][0]+1;

(a[l][1]==0)p=0;p = a[l][1]-1;

(a[l][1]==9)n=9;n = a[l][1]+1;

(i=k; i<m+1;i++)(j=p; j<n+1;j++)

{(player[i][j]==-1||player[i][j]==2)

{(lColor, i+1, j+1);

}

}

}

}

Field::wound(int i, int j, QColor lColor, QColor hitColor)

{.addRect(j*sizeDeck, i*sizeDeck, sizeDeck, sizeDeck, QPen(lColor, 2),QBrush(hitColor));.addLine(j*sizeDeck, i*sizeDeck, (j*sizeDeck)+sizeDeck, (i*sizeDeck)+sizeDeck, QPen(lColor, 2));.addLine((j*sizeDeck)+sizeDeck, i*sizeDeck, j*sizeDeck, (i*sizeDeck)+sizeDeck, QPen(lColor, 2));

}

Field::past(QColor color, int i, int j)

{.addEllipse((j*sizeDeck)+12, (i*sizeDeck)+12, 5, 5, QPen(color), QBrush(color));[i-1][j-1]=2;

}

Field::paintDeck(QColor lColor,QColor deckColor, int i, int j)

{.addRect((j+1)*sizeDeck, (i+1)*sizeDeck, sizeDeck, sizeDeck, QPen(lColor), QBrush(deckColor));

}::~Field()

{

}


Файл main.cpp

#include <QtGui>

#include <QTextCodec>

#include <QApplication>

#include "startwidget.h"

main(int argv, char **args)

{

//QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));

//QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));

//QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));

::setCodecForCStrings(QTextCodec::codecForName("Windows-1251"));::setCodecForLocale(QTextCodec::codecForName("Windows-1251"));::setCodecForTr(QTextCodec::codecForName("Windows-1251"));

app(argv, args);

.connect(&app, SIGNAL(lastWindowClosed()), &app, SLOT(quit()));SW;.show();

app.exec();

}


Файл mainwindow.h

#ifndef MAINWINDOW_H

#define MAINWINDOW_H


#include <QtGui>

#include <QFile>

#include <QApplication>

#include <QSettings>

#include "playerfield.h"

#include "enemyfield.h"

#include "selectionships.h"

MainWindow : public QMainWindow

{_OBJECT:();

~MainWindow();

*PF1, *PF2;*EF;*sShip;*Pfield;*Efield;*StartGame;*Game, *About;path;difinMode(int mode, QString PlayerName1, QString PlayerName2, int&load);readFile(QString fileName);

:MWSignal();loadGame();startNew();

slots:quit(); //выход из игры

void newGameWidget(); //добавление виджетов на формуcloseSelectionShips(); //закрытие окна выбора кораблейdecrement(); //декремент количества кораблей при их выборе

void saveGame(); //сохранение игрыsaveAs();

void secondDock(); //обработка второго игрового поля при наличии двух игроковfirePF1(); //обработка стрельбы первого игрокаfirePF2(); //обработка игры второго игрокаwon(); //оповещение о победеlose(); //оповещение о проигрышеblockMenu(); //блокировка главного менюunblockMenu(); //разблокировка главного менюMWLoad(); //загрузка существующей игрыstartNewGame();

void about();help();

:menu();playing();connection(PlayerField *var);loadWidgets(QDockWidget *&wdgt, PlayerField *&var, QString fieldName);loadWidgets(QDockWidget *&wdgt, EnemyField *&var, QString fieldName);choice();getMatrix(QString line, PlayerField *&var, int i);getMatrix(QString line, EnemyField *&var, int i);checkEnd(QString &line);loadShips(PlayerField *&var);loadShips(EnemyField *&var);supLoadShips(int i, int **&m, QString temp);checkRepeat(QVector <QString> a, QString name);

gMode;PN1, PN2;file;

};


#endif // MAINWINDOW_H


Файл mainwindow.cpp

#include "mainwindow.h"

::MainWindow()

{();= new PlayerField();= new PlayerField();= new EnemyField();= new SelectionShips();= new QDockWidget(tr("Поле игрока"));= new QDockWidget(tr("Поле врага"));= new QDockWidget();

}

MainWindow::menu()

{= menuBar()->addMenu(tr("&Игра"));>addAction(tr("&Новая"), this, SLOT(startNewGame()));>addAction(tr("&Сохранить"), this, SLOT(saveGame()));>addAction(tr("&Загрузить"), this, SLOT(MWLoad()));>addAction(tr("&Выход"), this, SLOT(quit()));

= menuBar()->addMenu(tr("&Справка"));>addAction(tr("&О программе"), this, SLOT(about()));>addAction(tr("&Как играть"), this, SLOT(help()));

}

MainWindow::newGameWidget()

{str = PN1+" расставляет свои корабли";= new PlayerField();->deckColor=Qt::darkCyan;(Pfield, PF1, PN1);(Qt::LeftDockWidgetArea, Pfield);

();(Qt::LeftDockWidgetArea, StartGame);(gMode!=1)

{= new PlayerField();->deckColor=Qt::darkCyan;

(Efield, PF2, PN2);(Qt::RightDockWidgetArea, Efield);>setEnabled(false);->blackout(Qt::black, Qt::white, Qt::red);

(sShip->start, SIGNAL(clicked()), this, SLOT(secondDock()));(PF1);

}

{= new EnemyField();>deckColor=Qt::white;(Efield, EF, PN2);(Qt::RightDockWidgetArea, Efield);

(sShip->start, SIGNAL(clicked()), this, SLOT(closeSelectionShips()));(sShip->start, SIGNAL(clicked()), this, SLOT(unblockMenu()));(sShip->start, SIGNAL(clicked()), EF, SLOT(autoBuild()));(PF1);

}

::information(NULL, "Внимание!", tr(str.toStdString().c_str()));

}MainWindow::secondDock()

{>setEnabled(true);

();->blackout(Qt::black, Qt::white, Qt::red);->blackout(Qt::white, Qt::black, Qt::red); str = PN2+" расставляет свои корабли";

QMessageBox::information(NULL, "Внимание!", tr(str.toStdString().c_str()));

();(Qt::RightDockWidgetArea, StartGame);

(PF2);(sShip->start, SIGNAL(clicked()), this, SLOT(closeSelectionShips()));(sShip->start, SIGNAL(clicked()), this, SLOT(unblockMenu()));

}

MainWindow::loadWidgets(QDockWidget*&wdgt, PlayerField*&var, QString fieldName)

{>close();= new QDockWidget(tr(fieldName.toStdString().c_str()));>setFeatures(QDockWidget::NoDockWidgetFeatures);>setFixedSize(400, 400);

>loadField(Qt::black, Qt::white, Qt::darkCyan, Qt::red);>setWidget(var);

}

MainWindow::loadWidgets(QDockWidget*&wdgt, EnemyField*&var, QString fieldName)

{>close();= new QDockWidget(tr(fieldName.toStdString().c_str()));>setFeatures(QDockWidget::NoDockWidgetFeatures);>setFixedSize(400, 400);

>loadField(Qt::black, Qt::white, Qt::white, Qt::red);>setWidget(var);

}

MainWindow::choice()

{>close();= new QDockWidget(tr("Выберите корабль:"));>setFeatures(QDockWidget::NoDockWidgetFeatures);= new SelectionShips();>setWidget(sShip);

}

MainWindow::connection(PlayerField *var)

{(sShip->fourBtn, SIGNAL(clicked()),var , SLOT(four()));(sShip->fourBtn, SIGNAL(clicked()), this, SLOT(blockMenu()));(sShip->threeBtn, SIGNAL(clicked()),var , SLOT(three()));(sShip->threeBtn, SIGNAL(clicked()), this, SLOT(blockMenu()));(sShip->twoBtn, SIGNAL(clicked()),var , SLOT(two()));(sShip->twoBtn, SIGNAL(clicked()), this, SLOT(blockMenu()));(sShip->oneBtn, SIGNAL(clicked()),var , SLOT(one()));(sShip->oneBtn, SIGNAL(clicked()), this, SLOT(blockMenu()));(var, SIGNAL(completed()), this, SLOT(decrement()));

}

MainWindow::blockMenu()

{>actions().at(0)->setEnabled(false);>actions().at(1)->setEnabled(false);>actions().at(2)->setEnabled(false);

}

MainWindow::unblockMenu()

{>actions().at(0)->setEnabled(true);>actions().at(1)->setEnabled(true);>actions().at(2)->setEnabled(true);

}

MainWindow::difinMode(int mode, QString PlayerName1, QString PlayerName2, int &load)

{=1;= mode;= PlayerName1;= PlayerName2;

}

MainWindow::closeSelectionShips()

{(sShip->fourEdit->text()=="0"&&sShip->threeEdit->text()=="0"&&sShip->twoEdit->text()=="0"&&sShip->oneEdit->text()=="0")>close();::warning(NULL, "Warring", tr("Вы должны построить все корабли, чтобы начать игру!"));(PF1->amount==10&&PF2->amount==10) playing();if(gMode!=0&&PF1->amount==10)playing();

}

MainWindow::decrement()

{n;(PF1->size==4||PF2->size==4)

{= sShip->fourEdit->text().toInt();-;>fourEdit->setText(QString::number(n));(n==0)

{>fourEdit->setEnabled(false);>fourBtn->setEnabled(false);(PF1->size==4)PF1->size=-1;PF2->size=-1;

}

}if(PF1->size==3||PF2->size==3)

{= sShip->threeEdit->text().toInt();-;>threeEdit->setText(QString::number(n));(n==0)

{>threeEdit->setEnabled(false);>threeBtn->setEnabled(false);(PF1->size==3)PF1->size=-1;PF2->size=-1;

}

}if(PF1->size==2||PF2->size==2)

{= sShip->twoEdit->text().toInt();-;>twoEdit->setText(QString::number(n));(n==0)

{>twoEdit->setEnabled(false);>twoBtn->setEnabled(false);(PF1->size==2)PF1->size=-1;PF2->size=-1;

}

}if(PF1->size==1||PF2->size==1)

{= sShip->oneEdit->text().toInt();-;>oneEdit->setText(QString::number(n));(n==0)

{>oneEdit->setEnabled(false);>oneBtn->setEnabled(false);(PF1->size==1)PF1->size=-1;PF2->size=-1;

}

}

}

MainWindow::saveAs()

{str=QApplication::applicationDirPath()+"/users/";=QFileDialog::getSaveFileName(this, tr("Сохраните файл"), str, tr("Save Files (*.xml)"));

}

MainWindow::saveGame()

{(path==NULL) saveAs();

array;

.append(QString::number(gMode));.append("\n");.append(QString::number(PF1->move));.append("\n");

.append(PN1);.append("\n");

.append(QString::number(PF1->K));.append("\n");

->save(array);

.append(PN2);.append("\n");

(gMode!=1)array.append(QString::number(PF2->K));array.append(QString::number(EF->K));.append("\n");

(gMode!=1)PF2->save(array);EF->save(array);

->saveShips(array);(gMode!=1)PF2->saveShips(array);EF->saveShips(array);

.setFileName(path);.open(QIODevice::WriteOnly);.write(array);.close();

}MainWindow::MWLoad()

{loadGame();

}

MainWindow::readFile(QString fileName)

{temp;i, j;

.setFileName(fileName);.open(QIODevice::ReadOnly);(!file.atEnd())

{= file.readLine();(temp);= temp.toInt();

= file.readLine();(temp);->move = temp.toInt();

= file.readLine();(temp);= temp;

= file.readLine();(temp);->K = temp.toInt();

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

{= file.readLine();(temp);(temp, PF1, i);

}

= file.readLine();(temp);= temp;

= file.readLine();(temp);(gMode!=1) PF2->K = temp.toInt();EF->K = temp.toInt();

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

{= file.readLine();(temp);(gMode!=1) getMatrix(temp, PF2, i);getMatrix(temp, EF, i);

}(PF1);(gMode!=1)loadShips(PF2);

{(EF);

->lhit=0;(i=0;i<PF1->sizeField;i++)(j=0;j<PF1->sizeField;j++)

{(PF1->player[i][j]==1)

{(PF1->player[i-1][j]==0&&i>0)

{->M[PF1->lhit][0]=i;->M[PF1->lhit][1]=j;->lhit++;->f=1;

}if(PF1->player[i+1][j]==0&&i<9)

{->M[PF1->lhit][0]=i;->M[PF1->lhit][1]=j;->lhit++;->f=1;

}if(PF1->player[i][j-1]==0&&j>0)

{->M[PF1->lhit][0]=i;->M[PF1->lhit][1]=j;->lhit++;->f=1;

}if(PF1->player[i][j+1]==0&&j<9)

{->M[PF1->lhit][0]=i;->M[PF1->lhit][1]=j;->lhit++;->f=1;

}

}

}

}

}>close();(Pfield, PF1, PN1);(Qt::LeftDockWidgetArea, Pfield);->amount=10;(gMode!=1)

{->amount=10;(Efield, PF2, PN2);(Qt::RightDockWidgetArea, Efield);

}

{>amount=10;(Efield, EF, PN2);(Qt::RightDockWidgetArea, Efield);

}

();.close();

}

MainWindow::getMatrix(QString line, PlayerField*&var, int i)

{j, len, l;ch;

=0;= line.length();(j=0;j<len;j++)

{(line.at(j)=='-')

{=line.at(j);++;=ch+line.at(j);

}ch=line.at(j);>player[i][l]=ch.toInt();++;(l>9)l=0;

}

}

MainWindow::getMatrix(QString line, EnemyField*&var, int i)

{j, len, l;ch;

=0;= line.length();(j=0;j<len;j++)

{(line.at(j)=='-')

{=line.at(j);++;=ch+line.at(j);

}ch=line.at(j);>player[i][l]=ch.toInt();++;(l>9)l=0;

}

}

MainWindow::checkEnd(QString &line)

{i, len;temp;= line.length();(i=0;i<len;i++)(line.at(i)!='\n')= temp+line.at(i);= temp;

}

MainWindow::loadShips(PlayerField*&var)

{i, j;temp;

(i=0;i<4;i++)

{= file.readLine();(temp);(i, var->fourDeck.location, temp);

}

(j=0; j<2;j++)(i=0;i<3;i++)

{= file.readLine();(temp);(i, var->threeDeck[j].location, temp);

}

(j=0;j<3;j++)(i=0;i<2;i++)

{= file.readLine();(temp);(i, var->twoDeck[j].location, temp);

}

(j=0;j<4;j++)

{= file.readLine();(temp);(0, var->oneDeck[j].location, temp);

}

}

MainWindow::loadShips(EnemyField*&var)

{i, j;temp;

(i=0;i<4;i++)

{= file.readLine();(temp);(i, var->fourDeck.location, temp);

}

(j=0; j<2;j++)(i=0;i<3;i++)

{= file.readLine();(temp);(i, var->threeDeck[j].location, temp);

}

(j=0;j<3;j++)(i=0;i<2;i++)

{= file.readLine();(temp);(i, var->twoDeck[j].location, temp);

}

(j=0;j<4;j++)

{= file.readLine();(temp);(0, var->oneDeck[j].location, temp);

}

}

MainWindow::supLoadShips(int i, int**&m, QString temp)

{ch;j, l, len;=0;= temp.length();

(j=0;j<len;j++)

{(temp.at(j)!=' ')

{=temp.at(j);[i][l]=ch.toInt();++;

}

{.clear();

}

}

}

MainWindow::playing()

{->hitColor = Qt::red;(gMode!=1)

{->blackout(Qt::black, Qt::white, Qt::red);->blackout(Qt::black, Qt::white, Qt::red);->lColor = Qt::white;->lColor=Qt::white;->hitColor = Qt::red;

}

{>hitColor = Qt::red;

}

(PF1->move!=0)

{();

}

{();

}

(gMode!=1)QObject::connect(PF2, SIGNAL(endFight()), this, SLOT(won()));QObject::connect(EF, SIGNAL(endFight()), this, SLOT(won()));::connect(PF1, SIGNAL(endFight()), this, SLOT(lose()));


}

MainWindow::firePF1()

{(gMode!=1)

{->setEnabled(false);->setEnabled(true);str="Ходит игрок "+PN1;::information(this, "Внимание!", str);::disconnect(PF1, SIGNAL(miss()), this, SLOT(firePF1()));::disconnect(PF1, SIGNAL(startFight()), PF1, SLOT(fire()));::connect(PF2, SIGNAL(miss()), this, SLOT(firePF2()));::connect(PF2, SIGNAL(startFight()), PF2, SLOT(fire()));

}

{->setEnabled(false);>setEnabled(true);

::disconnect(PF1, SIGNAL(hit()), PF1, SLOT(compFire()));::disconnect(PF1, SIGNAL(miss()), this, SLOT(firePF1()));::connect(EF, SIGNAL(miss()), PF1, SLOT(compFire()));::connect(PF1, SIGNAL(comp()), this, SLOT(firePF2()));::connect(EF, SIGNAL(startFight()), EF, SLOT(fire()));

}

}

MainWindow::firePF2()

{(gMode!=1)

{->setEnabled(false);->setEnabled(true);str="Ходит игрок "+PN2;::information(this, "Внимание!", str);

::disconnect(PF2, SIGNAL(miss()), this, SLOT(firePF2()));::disconnect(PF2, SIGNAL(startFight()), PF2, SLOT(fire()));::connect(PF1, SIGNAL(startFight()), PF1, SLOT(fire()));::connect(PF1, SIGNAL(miss()), this, SLOT(firePF1()));

}

{->setEnabled(true);>setEnabled(false);

::disconnect(PF1, SIGNAL(comp()), this, SLOT(firePF2()));::disconnect(EF, SIGNAL(miss()), PF1, SLOT(compFire()));::disconnect(EF, SIGNAL(startFight()), EF, SLOT(fire()));::connect(PF1, SIGNAL(hit()), PF1, SLOT(compFire()));::connect(PF1, SIGNAL(miss()), this, SLOT(firePF1()));

}

}

MainWindow::lose()

{str = "Выиграл игрок "+PN2;(gMode!=1)::warning(NULL, "Внимение", str);::warning(NULL, "Внимение", tr("Вы проиграли!"));->setEnabled(false);->setEnabled(false);>setEnabled(false);

}

MainWindow::won()

{str = "Выиграл игрок "+PN1;(gMode!=1)::warning(NULL, "Внимение", str);::warning(NULL, "Внимение", tr("Вы выиграли!"));->setEnabled(false);->setEnabled(false);>setEnabled(false);

}

MainWindow::checkRepeat(QVector<QString> a, QString name)

{stName, stCount, temp;i, j, count, len, n;fine = false;()<<a.size();

/*for(i=0;i<a.size();i++)

{= a.at(i);= temp.length();=0;(temp.at(j)!='-')

{=stName+temp.at(j);++;

}=j;(j=n;j<len;j++)=stCount+temp.at(j);= stCount.toInt();(stName==name)

{++;=stName+'-'+QString::number(count);.insert(i, stName);=true;

}

}(!fine)

{= name+"-1";.append(stName);

}*/


}

MainWindow::startNewGame()

{res = QMessageBox::warning(this, "Внимание!", tr("Вы уверены, что хотите начать новую игру?"), QMessageBox::Yes, QMessageBox::No);

(res==QMessageBox::Yes)

{();="";startNew();

}

}

MainWindow::quit()

{res = QMessageBox::warning(this, "Внимание!", tr("Вы уверены, что хотите выйти?"), QMessageBox::Yes, QMessageBox::No);

(res==QMessageBox::Yes)

{(gMode!=1)

{(PF1->amount<10&&PF2->amount<10)exit(0);

}if(PF1->amount<10)exit(0);sres = QMessageBox::warning(this, "Внимание!", tr("Сохранить игру перед выходом?"), QMessageBox::Yes, QMessageBox::No);(sres==QMessageBox::Yes)

{(PF1->K<20)

{();(0);

}exit(0);(gMode!=1)(PF2->K<20)

{();(0);

}if(EF->K<20)

{();(0);

}exit(0);

}(sres==QMessageBox::No)exit(0);

}

}

MainWindow::about()

{str; = "Игра 'Морской бой'\nВерсия 1.0\nИгра разработана студенткой группы З-8001 Поспеловой И.В.";

QMessageBox::information(NULL, tr("О программе"), str);

}

MainWindow::help()

{hFile;str, path;= QApplication::applicationDirPath()+"/help.txt";

.setFileName(path);.open(QIODevice::ReadOnly);(!hFile.atEnd())= hFile.readAll();.close();

::information(NULL, tr("Как играть"), str);

}::~MainWindow()

{


}


Файл playerfield.h

#ifndef PLAYERFIELD_H

#define PLAYERFIELD_H


#include <QApplication>

#include "field.h"

#include "battleship.h"

#include "cruiser.h"

#include "destroyer.h"

#include "boat.h"

PlayerField : public Field

{_OBJECT:();

~PlayerField();blackout(QColor bColor, QColor lColor, QColor hitColor); //закрывает вражеское поле

void calcPos(int x, int y); //сопоставляет позицию нажатия ЛКМ с player[][]

void mousePressEvent(QMouseEvent *event); //мышьdeleteDeck(); //удаляет выделенную палубу

:comp();slots:four();three();two();one();compFire();randCalc();

:checkAround(int x, int y);


};


#endif // PLAYERFIELD_H


Файл playerfield.cpp

#include "playerfield.h"

::PlayerField()

{>setScene(&scene);

}

PlayerField::blackout(QColor bColor, QColor lColor, QColor hitColor)

{i, j;(bColor, lColor);

(i=0;i<sizeField;i++)(j=0;j<sizeField;j++)

{(player[i][j]==0&&player[i][j]==-1).addRect((j+1)*sizeDeck, (i+1)*sizeDeck, sizeDeck, sizeDeck, QPen(lColor), QBrush(bColor));if(player[i][j]==2) past(lColor, i+1, j+1);if(player[i][j]==1)wound(i+1, j+1, lColor, hitColor);

}

}

PlayerField::mousePressEvent(QMouseEvent *event)

{x, y;= event->pos().x()-30;= event->pos().y()-20;(x, y);

(event->button() == Qt::LeftButton)

{

(x>=30&&x<=330&&y>=30&&y<=330)

{(size>0) selectShip(flag, t, size);if(amount!=10)::warning(NULL, "Warring", tr("Выберите тип корабля!"));emit startFight();

}

}if(event->button()==Qt::RightButton)

{();

}

}

PlayerField::calcPos(int x, int y)

{(x>=30&&x<=330&&y>=30&&y<=330)

{=x/30;=y/30;

}

}

PlayerField::randCalc()

{= (rand() % 10+0)+1;= (rand() % 10+0)+1;

}

PlayerField::deleteDeck()

{i, j, f;=0;=iShip-1;=jShip-1;

(player[i][j]==size)

{(player[i-1][j]==size)

{((player[i][j-1]==size)||(player[i][j+1]==size)||(player[i+1][j])==size)

{=1;::warning(NULL, "Warring", tr("Вы не можете удалить эту палубу!"));

}

}(player[i+1][j]==size)

{((player[i][j-1]==size)||(player[i][j+1]==size))

{=1;::warning(NULL, "Warring", tr("Вы не можете удалить эту палубу!"));

}

}(player[i][j-1]==size)

{(player[i][j+1]==size)

{=1;::warning(NULL, "Warring", tr("Вы не можете удалить эту палубу!"));

}

}(f!=1)

{[i][j]=-1;.addRect(jShip*sizeDeck, iShip*sizeDeck, sizeDeck, sizeDeck,QPen(Qt::black), QBrush(Qt::transparent));(player[i-1][j]==size).addLine(jShip*sizeDeck, iShip*sizeDeck, (jShip*sizeDeck+sizeDeck), iShip*sizeDeck, QPen(Qt::red));if(player[i+1][j]==size).addLine(jShip*sizeDeck, (iShip*sizeDeck+sizeDeck), (jShip*sizeDeck+sizeDeck), (iShip*sizeDeck+sizeDeck), QPen(Qt::red));if(player[i][j-1]==size).addLine(jShip*sizeDeck, iShip*sizeDeck, jShip*sizeDeck, (iShip*sizeDeck+sizeDeck), QPen(Qt::red));if(player[i][j+1]==size).addLine((jShip*sizeDeck+sizeDeck), iShip*sizeDeck, (jShip*sizeDeck+sizeDeck), (iShip*sizeDeck+sizeDeck), QPen(Qt::red));

-;(flag==0)t=0;

}

}

}

PlayerField::four()

{=4;

}

PlayerField::three()

{=3;

}

PlayerField::two()

{=2;

}

PlayerField::one()

{=1;

}

PlayerField::compFire()

{i, j;

comp();

(f!=1)

{

{();

}((player[iShip-1][jShip-1]==2)||(player[iShip-1][jShip-1]==1));(i=0;i<4;i++)

{[i][0]=-1;[i][1]=-1;

}();

}

{(M[h][0], M[h][1]);

}

}

PlayerField::checkAround(int x, int y)

{m, n, p, q;(x==0)m=0;m = x-1;

(y==0)n=0;n=y-1;

(x==9)p=9;p=x+1;

(y==9)q=9;q=y+1;

(player[m][y]<=0)

{= x;= y+1;();(move!=1)

{= x+1;= y+1;

}

}if(player[x][n]<=0)

{= x+1;= y;();(move!=1)

{= x+1;= y+1;

}

}if(player[x][q]<=0)

{= x+1;= y+2;();(move!=1)

{= x+1;= y+1;

}

}if(player[x+1][y]<=0)

{= x+2;= y+1;();(move!=1)

{= x+1;= y+1;

}

}

{++;(M[h][0], M[h][1]);

}

}

::~PlayerField()

{


}


Файл putname.h

#ifndef PUTNAME_H

#define PUTNAME_H


#include <QtGui>PutName : public QDialog

{_OBJECT:();

~PutName();

*label;*edit;*button;*layout;playerName;

:PNSignal();

slots:setName();

:output();

};


#endif // PUTNAME_H


Файл putname.cpp

#include "putname.h"

::PutName()

{= new QLabel("Введите имя игрока:");= new QLineEdit;= new QPushButton(tr("OK"));= new QVBoxLayout;();::connect(button, SIGNAL(clicked()), this, SLOT(setName()));

}

PutName::output()

{>addWidget(label);>addWidget(edit);>addWidget(button);(layout);

}

PutName::setName()

{(!edit->text().isEmpty())

{=edit->text();PNSignal();

}QMessageBox::warning(this, "Внимание!", "Вы не ввели имя!");


}

::~PutName()

{


}

Файл Selectionships.h

#ifndef SELECTIONSHIPS_H

#define SELECTIONSHIPS_H


#include <QtGui>

SelectionShips : public QWidget

{_OBJECT:();

~SelectionShips();

*fourBtn;*threeBtn;*twoBtn;*oneBtn;

*start;

*fourEdit;*threeEdit;*twoEdit;*oneEdit;

*layout;

linkage();

};

#endif // SELECTIONSHIPS_H

Файл Selectionships.cpp

#include "selectionships.h"

::SelectionShips()

{= new QPushButton(tr("4 палубы"));= new QPushButton(tr("3 палубы"));= new QPushButton(tr("2 палубы"));= new QPushButton(tr("1 палуба"));= new QPushButton(tr("Старт"));= new QLineEdit();= new QLineEdit();= new QLineEdit();= new QLineEdit();= new QGridLayout();

();

}

SelectionShips::linkage()

{>setText("1");>setFixedWidth(30);>setReadOnly(true);

>setText("2");>setFixedWidth(30);>setReadOnly(true);

>setText("3");>setFixedWidth(30);>setReadOnly(true);

>setText("4");>setFixedWidth(30);>setReadOnly(true);

>setFixedWidth(90);>setFixedWidth(90);>setFixedWidth(90);>setFixedWidth(90);>setFixedWidth(50);

>addWidget(fourBtn, 1, 0, Qt::AlignLeft);>addWidget(fourEdit, 1, 1);>addWidget(threeBtn, 2, 0, Qt::AlignLeft);>addWidget(threeEdit, 2, 1);>addWidget(twoBtn, 3, 0, Qt::AlignLeft);>addWidget(twoEdit, 3, 1);>addWidget(oneBtn, 4, 0, Qt::AlignLeft);>addWidget(oneEdit, 4, 1);>addWidget(start, 5, 0, Qt::AlignRight);

>setLayout(layout);

}

::~SelectionShips()

{


}

Файл selectmode.h

#ifndef SELECTMODE_H

#define SELECTMODE_H


#include <QDialog>

#include <QtGui>

SelectMode : public QDialog

{_OBJECT:();

~SelectMode();

*label;*man;*computer;*button;*layout;

:SMSignal();slots:newGame();

:output();

};


#endif // SELECTMODE_H

Файл selectmode.cpp

#include "selectmode.h"

::SelectMode()

{= new QLabel("Выберите режим игры");= new QRadioButton(tr("Игра с человеком"));= new QRadioButton(tr("Игра с компьютером"));= new QPushButton(tr("OK"));= new QVBoxLayout;();::connect(button, SIGNAL(clicked()), this, SLOT(newGame()));

}

SelectMode::output()

{>addWidget(label);>addWidget(man);>addWidget(computer);>addWidget(button);(layout);

}

SelectMode::newGame()

{(man->isChecked()||computer->isChecked())

{SMSignal();>close();

}::warning(NULL, "Warring", tr("Вы не выбрали режим игры!"));

}

::~SelectMode()

{


}

Файл ships.h

#ifndef SHIPS_H

#define SHIPS_H


#include <QObject>

Ships : public QObject

{:();

~Ships();

amountDeck;**location;

void checkKilled(int array[10][10]);

};


#endif // SHIPS_H

Файл ships.cpp

#include "ships.h"

::Ships()

{


}

Ships::checkKilled(int array[10][10])

{

}::~Ships()

{


}


Файл startwidget.h

#ifndef STARTWIDGET_H

#define STARTWIDGET_H


#include <QtGui>

#include <QFile>

#include <QApplication>

#include "putname.h"

#include "selectmode.h"

#include "mainwindow.h"

StartWidget : public QWidget

{_OBJECT:();

~StartWidget();

*newGame;*loadGame;*quitGame;*layout;*PN;*SM;*MW;mode;load;pName[2];i;

:SWSignal();

slots:setName();setMode();getCfg();showMW();setSecondName();checkFile();Exit();

:output();paintEvent(QPaintEvent *event);


};


#endif // STARTWIDGET_H


Файл startwidget.cpp

#include "startwidget.h"

::StartWidget()

{= new QPushButton(tr("Новая игра"));= new QPushButton(tr("Загрузить игру"));= new QPushButton(tr("Выход"));= new QVBoxLayout;= new PutName;= new SelectMode;= new MainWindow;

>setModal(true);>setModal(true);=0;=0;=0;

(500,500);();

::connect(quitGame, SIGNAL(clicked()), this, SLOT(Exit()));::connect(newGame, SIGNAL(clicked()), this, SLOT(setMode()));::connect(loadGame, SIGNAL(clicked()), this, SLOT(checkFile()));::connect(SM, SIGNAL(SMSignal()), this, SLOT(setName()));::connect(MW, SIGNAL(loadGame()), this, SLOT(checkFile()));::connect(MW, SIGNAL(startNew()), this, SLOT(setMode()));

}

StartWidget::output()

{font;.setPointSizeF(18);.setBold(true);>setFont(font);>setStyleSheet("background-color: yellow");

>setFont(font);>setStyleSheet("background-color: yellow");

>setFont(font);>setStyleSheet("background-color: yellow");

>setFixedSize(200, 70);>setFixedSize(200, 70);>setFixedSize(200, 70);

>setAlignment(Qt::AlignCenter);>setSpacing(30);>addWidget(newGame, Qt::AlignCenter);>addWidget(loadGame, Qt::AlignCenter);>addWidget(quitGame, Qt::AlignCenter);

(layout);

}

StartWidget::paintEvent(QPaintEvent *event)

{path=QApplication::applicationDirPath()+"/sea.jpeg";background(path);painter(this);.fillRect(0, 0, 500, 500, QBrush(Qt::black, background));.end();

}StartWidget::setName()

{(SM->man->isChecked())

{>label->setText("Введите имя первого игрока:");>show();::connect(PN, SIGNAL(PNSignal()), this, SLOT(getCfg()));::connect(PN->button, SIGNAL(clicked()), this, SLOT(setSecondName()));

}

{[1]="Компьютер";=1;>label->setText("Введите Ваше имя:");>show();::connect(PN, SIGNAL(PNSignal()), this, SLOT(getCfg()));::connect(PN->button, SIGNAL(clicked()), this, SLOT(showMW()));>edit->clear();

}

}

StartWidget::setSecondName()

{(!PN->edit->text().isEmpty())

{::disconnect(PN->button, SIGNAL(clicked()), this, SLOT(setSecondName()));++;>edit->clear();>label->setText("Введите имя второго игрока:");>show();::connect(PN, SIGNAL(PNSignal()), this, SLOT(getCfg()));::connect(PN->button, SIGNAL(clicked()), this, SLOT(showMW()));>edit->clear();

}

}

StartWidget::setMode()

{::disconnect(PN, SIGNAL(PNSignal()), this, SLOT(checkFile()));>edit->clear();>show();

}StartWidget::getCfg()

{[i]=PN->playerName;

}

StartWidget::showMW()

{(load!=0)

{>difinMode(mode, pName[0], pName[1], load);>show();>newGameWidget();>close();>close();::disconnect(PN, SIGNAL(PNSignal()), MW, SLOT(newGameWidget()));

}(!PN->edit->text().isEmpty())

{>difinMode(mode, pName[0], pName[1], load);>show();

>close();>close();>newGameWidget();

}

}

StartWidget::checkFile()

{str=QApplication::applicationDirPath()+"/users/";::disconnect(PN, SIGNAL(PNSignal()), this, SLOT(checkFile()));fileName=QFileDialog::getOpenFileName(this, tr("Откройте файл"), str, tr("Save Files (*.xml)"));file;.setFileName(fileName);(file.exists())

{>close();>show();>path = fileName;>readFile(fileName);>close();

}

}StartWidget::Exit()

{res = QMessageBox::warning(this, "Внимание!", tr("Вы уверены, что хотите выйти?"), QMessageBox::Yes, QMessageBox::No);

(res==QMessageBox::Yes)

{(0);

}

}::~StartWidget()

{

}


МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ Федеральное государственное бюджетное образовательное учреждение высшего профессионального образо

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ