В данной курсовой работе речь пойдет о создании клиент-серверного приложения для игры «Морской бой».
«Морской бой» - традиционная настольная игра, в которую все мы любим играть с детства. Расчертить тетрадный лист, расставив в периметре корабли флота – любимое занятие на переменке или скучном уроке. Теперь эта забава доступна, чтобы играть и в новом качестве – на компьютере. Расставив на поле боя корабли разного размера, стреляйте по полю врага, стараясь угадать координаты, по которым находится корабль противника. Кто первый уничтожит все корабли противника - тот и победитель в этом морском бою!
Игра «морской бой» достаточно хорошо известна и популярна. Практически каждый школьник в тот или иной период своей жизни играл в эту игру. В последние годы в связи с появлением компьютеров и новых обучающих и развивающих программ вновь возрос интерес к ней. Если набрать запрос о поиске игры в Интернет, то поисковая машина выдаст несколько тысяч ссылок. Здесь и реклама, и различные варианты игры, и качественные исследования оптимальных стратегий игры и т.д. Но мало кто знает о том, что эта игра имеет серьезное научное и практическое приложение, и для ее анализа могут быть использованы современные математические и компьютерные методы. В качестве примера такого приложения можно привести проблему эффективного поиска записей в больших базах данных, обладающих сложной многоуровневой структурой.
Остановимся на некоторых основных правилах классического варианта игры. Первый игрок, игрок А, расставляет корабли на квадратном игровом поле из n клеток (обычно это поле клеток). Корабли делятся на классы: одноклеточные, двухклеточные, трехклеточные и четырехклеточные. Игрок В на своем поле расставляет свои корабли. Заметим, что корабли не должны касаться друг друга. Игра состоит в том, что игроки по очереди называют координаты клеток, в которых, как они предполагают, расположены корабли противника, то есть как бы производят выстрел по выбранной клетке. О попадании или промахе игроку сообщается после выстрела. Игра продолжается до тех пор, пока у одного из игроков не будут уничтожены все корабли.
На первый взгляд, эта игра носит чисто вероятностный характер, так как игроки ведут обстрел, не зная расположения кораблей противника. Но, приобретя некоторый опыт игры, можно заметить, что существуют стратегии расстановки кораблей, которые уменьшают вероятность попадания в последний одноклеточный корабль. Например, можно расположить весь флот таким образом, чтобы он занимал минимальное место на игровом поле, а один или два корабля ставят на оставшемся пространстве как на рисунке 1. Поиск кораблей также можно проводить, придерживаясь определенной системы, которая позволяет наиболее быстро обнаружить в начале игры многоклеточные корабли, а затем на оставшемся пространстве искать одноклеточные корабли.
В проекте необходимо реализовать клиент-серверное приложение с отдельной клиентской и серверной частями.
В клиентской части необходимо создать визуальный пользовательский интерфейс, реализовать обмен сообщениями с севером, разработать основные функции игры создать два поля 10х10, на которых размещаются по 10 кораблей разного размера (один – размера четыре, два – размера три, три – размера два и четыре – размера один). Корабли могут располагаться горизонтально и вертикально. Два корабля не могут находиться в соседних полях. Каждый игрок видит только свои корабли и обстрелянные поля противника. Стрелять разрешается только по тем полям, по которым еще не было выстрела. Игрок стреляет до первого промаха, далее ход переходит к противнику. Как только кто-то из игроков убьёт все корабли противника, он выигрывает.
В серверной части необходимо реализовать возможность подключения нескольких клиентов, обмен сообщениями с клиентами.
Задача заключается в разработке алгоритма, по которому компьютер сможет играть в «Морской бой» с максимальным качеством, и при этом не подглядывая расположение флота игрока.
Дополнительное и очевидное условие: при каждой новой игре вне зависимости от размещения сил противника компьютер должен играть по-разному, т.е. его ходы должны быть не предсказуемы.
Необходимо вспомнить правила игры: участники поединка делают ходы поочередно, причем, если один из игроков попадает по кораблю соперника, то он получает право следующего хода. Если реализовать поиск цели компьютером в виде отдельной процедуры, то надо как-то научить его запоминать исходы прошлых выстрелов, чтобы адекватно произвести следующий. Из этого факта вытекает, что самое простое и рациональное решение данной проблемы можно оформить в виде конечного автомата, наиболее точно описывающего последовательность действий.
Можно выделить три состояния:
1) прострел игрового поля по случайным координатам до попадания по кораблю, после чего переход во второе состояние;
2) обстрел вокруг подбитой ячейки поля для определения направления корабля (вертикальное или горизонтальное), после очередного попадания – переход в третье состояние;
3) расстрел корабля в полученном направлении до полного его уничтожения, после чего переход в первое состояние.
И так, вся игра зациклена на трех основных действиях: прострел, обстрел и расстрел. Все эти действия должны продолжаться до тех пор, пока у одной из сторон не будут уничтожены все корабли.
Прострел
На этом этапе компьютер должен поймать какой-либо из кораблей противника. Для этого он будет стрелять по произвольным незанятым клеткам поля игрока. Гораздо эффективнее сначала разделаться с большими кораблями, поэтому выбирая координаты для выстрела надо проверять, чтобы в этой позиции мог разместиться самый большой из оставшихся кораблей. Процесс прекращается, как
Выбор языка программирования осуществлялся среди таких языков как: Java, Delhi, C++.
Был выбран язык С++ так как он широко используется для разработки программного обеспечения, являясь одним из самых популярных языков программирования. Область его применения включает создание операционных систем, разнообразных прикладных программ, драйверов устройств, приложений для встраиваемых систем, высокопроизводительных серверов, а также развлекательных приложений.
К существенным характерным свойствам С++ следует отнести прежде всего мощную поддержку объектно-ориентированного подхода к разработке программ и механизм параметризации типов и алгоритмов. Широкий диапазон типов и развитые возможности построения пользовательских типов позволяют адекватно отразить особенности предметной области; строгие правила обращения с константными типами способствуют надежности программ. Повышению надежности создаваемых программ служит простой и гибкий аппарат управления исключительными ситуациями. Развитые схемы преобразования и приведения типов позволяют обеспечить достаточный компромисс между строгой типизацией и эффективностью исполнения программ. Средства явного управления областями действия ("пространства имен") предоставляют удобный механизм структурирования больших программ.
Помимо широкой распространенности и популярности, язык С++ служит технологической основой перспективной парадигмы, возникшей в недавнее время, – обобщенного программирования – парадигма программирования, заключающаяся в таком описании данных и алгоритмов, которое можно применять к различным типам данных, не меняя само это описание.
Еще одно обстоятельство, обусловившее выбор языка С++, – принятие в конце 1998 г. Международного Стандарта ANSI/ISO этого языка. Факт стандартизации для такого большого, сложного и современного языка, как С++, трудно переоценить. Приверженность все большего числа корпоративных разработчиков программного обеспечения к использованию типовых решений и стандартизованных инструментальных средств дает твердую уверенность в успешности С++.
Выбор среды разработки осуществлялся среди:
MS Visual Studio и Embarcadero RAD Studio.
Была выбрана Embarcadero RAD Studio так как RAD Studio позволяет один раз написать приложение на языке C++, а затем автоматически оптимизировать его для различных платформ. Другие платформы разработки приложений используют скриптовые языки и среды выполнения, которые ограничивают доступ к аппаратным возможностям устройства и увеличивают риск нарушения безопасности. Код, созданный с помощью RAD Studio, выполняется непосредственно на устройстве —и можно делать более функциональные приложения, не опасаясь за производительность или безопасность. А так же она имеет большой выбор визуальных компонентов, которые позволяют быстро разработать пользовательский интерфейс, а так же помочь в быстрой реализации оставленной задачи.
4.1. Исходный код клиентской части
Unit.cpp:
/---------------------------------------------------------------------------
#include
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
//Объявление перменных
enum {call, ships, wait, move} mode;
Byte player = 0;// номер игрока: 1 - первый, 2 - второй
const N=10; // размер поля
const K=10; // число кораблей
Byte nk=0; // число введенных кораблей и убитых противником
Byte nk2=0; // число убитых кораблей противника
int mk[K]={1,1,1,1,2,2,2,3,3,4};
Byte i,j;
HANDLE H;
bool FirstPoint;
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
// Отправка на сервер имени игрока
void Send(Byte code, Byte x, Byte y)
{
Form1->ClientSocket1->Socket->SendText(Form1->EWho->Text + "#^" + IntToStr(code) + ' ' +IntToStr(x) + ' ' + IntToStr(y));
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormShow(TObject *Sender)
{
StringGrid1->ColCount = N + 1;
StringGrid2->ColCount = N + 1;
StringGrid1->RowCount = N + 1;
В данной курсовой работе разработано клиент-серверное приложение для игры «Морской бой». Был использован язык С++, который без всяких трудностей позволил реализовать всю поставленную задачу. Были проведены все этапы разработки программы, начиная с постановки самой задачи до её непосредственной реализации.
Дальнейшую модификацию программы вижу в возможности иметь собственную учетную запись, в которой можно будет просмотреть статистику боев, сменить интерфейс. Введение системы достижений. Создание чата. Увеличить количество человек, одновременно подключенных к серверу.
Приведенный пример анализа игры «Морской бой» показывает возможность использования логических игр для углубленного изучения таких разделов математики, как комбинаторика, теория множеств и теория вероятностей. Заметим, что изучение даже простейших игровых ситуаций позволяет сформулировать проблемы, которые представляют интерес для современной информатики и теории поиска.
Итогом работы можно считать созданную функциональную модель реализации стратегии игры «Морской бой». Созданная функциональная модель и ее программная реализация могут служить органической частью решения более сложных задач.
Скриншоты программы