Приложение "Шахматы"

Разработка приложения, реализующее сетевую игру "Шахматы". Анализ предметной области. Выбор дополнительных функций и способа использования приложения. Кодирование и отладка функций, их параметры. Тестирование программного приложения; описание интерфейса.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 04.05.2016
Размер файла 737,3 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

ГОУ ВПО

Сургутский государственный университет Ханты-Мансийского автономного округа - Югры

Факультет автоматики и телекоммуникаций

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

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

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

«Технология разработки программного обеспечения»

Тема:

Приложение «Шахматы»

Сургут, 2016

Аннотация

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

В разделе «анализ» происходит изучение предметной области, разбор задания на курсовое проектирование, рассмотрение дополнительных функций, которые представлены в задании, выбор из них наиболее актуальных и выбор оптимального способа реализации.

В разделе «проектирование» осуществляется рассмотрение проектных решений и выбор наиболее подходящего метода для реализации поставленной задачи.

Раздел «кодирование и отладка» описывает функции и их параметры, при помощи которых производится решение поставленных задач.

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

Сопровождение - это некая инструкция приложения, которая содержит подробное описание интерфейса и правил использования приложения.

Задание курсового проекта

Разработать приложение, реализующее сетевую игру “Шахматы”.

Приложение должно обладать следующими функциями:

· жеребьевка;

· поддержка сетевой игры;

· регистрация игроков;

· возможность автоматической и ручной расстановки комбинаций;

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

· сохранение игры;

· сохранение последовательности ходов;

· обмен сообщениями;

· накопление и просмотр статистики.

Содержание

  • Введение
  • 1. Анализ
    • 1.1 Изучение предметной области
    • 1.2 Анализ задания
  • 2. Проектирование
  • 3. Кодирование и отладка
  • 4. Тестирование
  • 5. Сопровождение
    • 5.1 Установка программы
    • 5.2 Руководство пользователя
  • Заключение
  • Список используемой литературы
  • Приложения

Введение

Курсовой проект по дисциплине «Технология разработки программного обеспечения» направлен на укрепление знаний по курсу программирования, основы которого были рассмотрены при изучении нескольких профильных дисциплин:

· объектно-ориентированное программирование;

· системное программное обеспечение;

· технология разработки программного обеспечения.

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

Целью курсового проекта является разработка приложения, которое будет выполнять функции сетевой игры «Шахматы».

Изучение языка C++ на примере создания небольших игрушек -- это самый интересный и эффективный способ получения и усовершенствования навыков программирования.

1. Анализ

1.1 Изучение предметной области

Шахматная партия играется между двумя партнерами, которые поочередно перемещают фигуры на квадратной доске, названной "шахматной". Играющий белыми начинает партию. Игрок получает право хода, когда его партнер сделал ход.

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

Если позиция такова, что никто из партнеров не может поставить мат, партия заканчивается вничью. Шахматная доска состоит из 64 равных квадратов (8х8), поочередно светлых ("белые" поля) и темных ("черные" поля). В начале партии один игрок имеет 16 светлых фигур ("белые"); другой - 16 темных фигур ("черные"): Белый король, Белый ферзь, Две белые ладьи, Два белых слона, Два белых коня, Восемь белых пешек, Черный король, Черный ферзь, Две черные ладьи, Два черных слона, Два черных коня, Восемь черных пешек. Начальная позиция фигур на шахматной доске представлена на рисунке 1:

Рисунок 1

Ни одна из фигур не может быть перемещена на поле, занятое фигурой того же цвета. Если фигура переходит на поле, занимаемое фигурой партнера, последняя считается взятой и убирается с шахматной доски как часть того же самого хода.

Слон может ходить на любое поле по диагоналям, на которых он стоит.

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

Ферзь ходит на любое поле по вертикали, горизонтали или диагонали, на которых он стоит.

Когда делаются эти ходы, ферзь, ладья или слон не могут перемещаться через поле, занятое другой фигурой.

Конь может ходить на одно из ближайших полей от того, на котором он стоит, но не на той же самой вертикали, горизонтали или диагонали.

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

Король может перемещаться двумя различными путями:

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

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

Партия выигрывается игроком, который поставил мат королю партнера.

Партия выигрывается игроком, партнер которого заявляет, что он сдается.

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

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

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

1.2 Анализ задания

На данном этапе производится рассмотрение задания на проектирование, создание технического задания, а так же принимается решение о функциональных возможностях продукта.

При создании приложения, реализующего сетевую игру «Шахматы», необходимо реализовать следующие функции:

· жеребьевка - функция необходимая для того, чтобы выяснить какая из сторон ходит первой;

· поддержка сетевой игры - важнейшая функция, без которой приложение не имеет своего смысла;

· регистрация игроков - свойство приложения необходимое для того, чтобы назначать игрокам какие-либо идентифицирующие значения;

· возможность автоматической и ручной расстановки комбинаций;

· контроль правильность хода и расстановки шашек - функция необходимая для того, чтобы исключить факт, когда игрок ставит шашку или ходит ей в запрещенную правилами игры позицию;

· сохранение игры - необходимо для того, чтобы игрок мог продолжить незаконченную игру;

· сохранение последовательности ходов - можно применить для последующего анализа уровня мастерства игрока;

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

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

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

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

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

Для поддержки сетевой игры были выбраны сокеты - стандартный, а так же простой и удовлетворяющий требованиям способ. Сокеты -вид соединения при котором всегда выделяется серверная сторона (та, к которой подключаются) и клиентская сторона (та, которая подключается).

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

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

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

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

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

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

2. Проектирование

Разрабатываемое приложение будет графическим. Следовательно, для его реализации необходимо на главную форму программы поместить готовые компоненты среды разработки C++ Builder 6.0 (Рисунок 2).

Рисунок 2

На форме Form1 расположены следующие компоненты:

· компонент TmainMenu MainMenu1 - компонент, реализующий меню приложения. Будет использоваться для организации взаимодействия пользователя и приложения.

Элементы меню представлены на рисунке 3.

Рисунок 3

· компоненты TImage (рисунки):

Board - доска;

BRHors, BLHors - черные лошади;

BRQuen, BLGuen - черные король и королева;

BRTura, BLTura - черные ладьи;

BRClon, BLSlon - черные слоны;

BAPesh,BBPeshBHPesh - черные пешки;

WRHors, WLHors - белые лошади;

WRQuen, WLGuen - белые король и королева;

WRTura, WLTura - белые ладьи;

WRClon, WLSlon - белые слоны;

WAPesh,BBPeshWHPesh - белые пешки.

· компоненты TServerSocket ServerSocket,TclientSocket ClientSocket для организации клиент-серверского соединения посредством сокетов;

· компонент TMemo Memo1 - для ведения журнала

· компонент TMemo Memo2 - для вывода принятых сообщений;

· компонент TMemo Memo3 - для вывода сделанных ходов;

· компонент Tedit EditChat - для ввода передаваемых сообщений;

· компонент TButton Button1 - по событию нажатия на кнопку «Послать» происходит передача сообщения по сети;

· компонент TLabel Label1 - надпись «Журнал».

Разработана стартовая форма программы Form2 (Рисунок 4).

Рисунок 4

На форме Form2 расположены следующие компоненты:

· компонент TImage Image1 - рисунок;

· компоненты TLabel Label1, Label3, Label4 - надписи «Ник», «IP address», «Port 9999»;

· компоненты TRadioGroup RadioGroup1, RadioGroup2 - наборы переключателей для выбора;

· компонент Tedit EditNik - для ввода ника игрока

· компонент Tedit Edit1 - для ввода IP адреса клиента

· компонент TButton Button1 - по событию нажатия на кнопку «Жеребьевка» происходит случайным образом выбор цвета фигур;

· компонент TButton Button2 - по событию нажатия на кнопку «Начать» вызывается главная форма программы.

3. Кодирование и отладка

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

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

· TImage *ThisFigure - рисунок текущей фигуры;

· bool Flag - переменная, которая будет определять последовательность ходов;

· __int8 ThisX, ThisY, NewX, NewY - координаты хода (было/стало);

· short Doska[8][8] - массив, хранящий положение фигур;

· short SelComplete - SelComplete=0 - фигура в покое, SelComplete=1 - фигура выбрана, SelComplete=2 - фигурара сделала ход;

В программе реализованы следующие функции:

· WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) - точка входа в программу, функция, в которую будет передано управление сразу после запуска программы;

· void __fastcall TForm2::Button1Click(TObject *Sender) - обработка события нажатия на кнопку «жеребьевка» на стартовой форме;

· void __fastcall TForm2::Button2Click(TObject *Sender) - обработка события нажатия на кнопку «начать» на стартовой форме;

· void TForm1::Initialize ( ) - инициализация переменных;

· void TForm1::CheckGo() - функция, которая описывает действия при сделанном игроком ходе;

· void TForm1::Perehod() - переход хода противнику, функция меняет значение переменной Flag;

· void TForm1::DrawRect ( int X , int Y , TColor Color ) - выделение одной клетки доски по координатам;

· void TForm1::VisHod() - визуализация хода, выбранная фигура перерисовывается по новым координатам;

· void TForm1::SendCoord( ) - функция, в которой координаты сделанного хода посылаются по сети противнику;

· void TForm1::SendMessage( ) - функция посылающая по сети сообщение противнику;

· void TForm1::SendDoska ( ) -функция посылающая по сети массив Doska, в котором содкржится положение всех фигур;

· void __fastcall TForm1::BoardMouseUp(TObject *Sender, TMouseButton Button,TShiftState Shift, int X, int Y) - обработка события щелчка мыши по доске (проверяется область попадания по доске, выделяется выбранная клетка и делается ход);

· TImage* TForm1::WhoIsClicked ( __int8 Y, __int8 X ) - функция, в которой по координатам выбирается фигура;

· void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,

· TCustomWinSocket *Socket) - обработка события чтения сокета (прием информации по сети );

· void __fastcall TForm1::ServerSocket1ClientConnect(TObject *Sender,

· TCustomWinSocket *Socket) - обработка события соединения с клиентом;

· void __fastcall TForm1::ServerSocket1ClientDisconnect(TObject *Sender,

· TCustomWinSocket *Socket) - обработка события потери связи;

· void __fastcall TForm1::ServerSocket1ClientError(TObject *Sender,

· TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode) - обработка события, возникающее при возникновении ошибки соединения;

· void __fastcall TForm1::ClientSocket1Connect(TObject *Sender,

· TCustomWinSocket *Socket) - обработка события, возникающего при установке соединения;

· bool TForm1 :: IsGo ( ) - проверка правильности хода фигуры;

· void __fastcall TForm1::N4Click(TObject *Sender) - обработка события, возникающего при нажатии на пункт меню «о программе»;

· void __fastcall TForm1::Button1Click(TObject *Sender) - обработка события, возникающего при нажатии на кнопку «послать»;

· void __fastcall TForm1::N2Click(TObject *Sender) ) - обработка события, возникающего при нажатии на пункт меню «выход»;

· void __fastcall TForm1::Cj1Click(TObject *Sender) - обработка события, возникающего при нажатии на пункт меню «сохранить»;

· void __fastcall TForm1::N1Click(TObject *Sender) - обработка события, возникающего при нажатии на пункт меню «загрузить»;

· void __fastcall TForm1::N5Click(TObject *Sender) - обработка события, возникающего при нажатии на пункт меню «смена фигур»;

· void TForm1 :: saveStep( ) - функция, в которой выводится на экран и сохраняется ход;

· void __fastcall TForm1::N6Click(TObject *Sender) обработка события, возникающего при нажатии на пункт меню «сохранить ходы».

Листинг программы приведен в приложении 1.

При отладке программы были исправлены мелкие недочеты, добавлен пункт меню «смена фигур».

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

4. Тестирование

Целью тестирования является обнаружение и в дальнейшем исправление ошибок и недостатков приложения.

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

Рисунок 5

Для исправления ошибки в функцию отправки сообщения в формируемую строку была добавлена подстрока probel(%%) для фиксации окончания строки:

void TForm1 :: SendMessage ( )

{

if ( ServerSocket1->Active )

ServerSocket1->Socket->Connections[0]->SendText(">>"+Form2-

>EditNik->Text +":" + EditChat->Text+probel);

else

ClientSocket1->Socket->SendText(">>"+Form2->EditNik->Text +":" +

EditChat->Text + probel);

}

При приеме сообщения из входного буфера была выделена подстрока с 1 позиции до probel:

AnsiString str=(AnsiString)Buffer;

Memo2->Lines->Add(str.SubString(1,AnsiPos(probel,str)-1));

Результат исправленной ошибки представлен на рисунке 6.

Рисунок 6

В ходе тестирования выяснилось, что для запуска новой игры необходимо перезапускать программу, поэтому было принято решение добавить пункт меню «Новая игра» (Рисунок 7).

Рисунок 7

А также добавить обработку события нажатия на пункт меню «Новая игра»

void __fastcall TForm1::N7Click(TObject *Sender)

{

//Инициализация

ThisX = 0;

ThisY = 0;

SelComplete = 0; // Для полноценого хода надо выбрать

// 2 координаты после того как SelComplete

// будет равен 2 можно ходить

Flag = 0;

NewX = NewY =0;

ThisFigure = BEPesh;

// Положительные - чёрный, а отрицательные - белые

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

{

Doska[0][i] = -i-9; //Белые фигуры

Doska[1][i] = -i-1; //Белые пешки

Doska[6][i] = i+1; //Чёрные пешки

Doska[7][i] = i+9; //Чёрные фигуры

for ( int j=2; j<6; j++)

Doska[j][i] = 0; //Пусто

}

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

{

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

{

ThisFigure = WhoIsClicked ( i,j );

ThisFigure->Left = j*40+32;

ThisFigure->Top = i*40+32;

SendDoska();

}

};

}

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

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

5. Сопровождение

5.1 Установка программы

1. Для установки программы необходимо скопировать на компьютер файл chess.exe.

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

3. Добавить ярлык программы на рабочий стол.

5.2 Руководство пользователя

1. Чтобы запустить программу необходимо щелкнуть по ярлыку программы левой кнопкой мыши.

2. В появившемся окне «жеребьевка» следует:

- ввести ник в текстовое поле;

- выбрать тип соединения (server-client), игрок, запустивший программу первым выбирает тип соединения - server, второй игрок выбирает тип соединения - client;

- нажать кнопку «жеребьевка»;

- ввести в текстовое поле IP адрес компьютера соперника;

- нажать кнопку «Начать».

3. В появившемся окне «шахматы-сервер» Наблюдать в окне «Журнал» процесс присоединения второго игрока.

4. Ввести в текстовое поле сообщение о выбранном цвете фигур и нажать на кнопку «Послать»

5. Если соединение произошло успешно и выбраны белые фигуры, то можно делать ход.

6. Фигуры двигаются по доске с помощью мыши. сначала щелчком левой кнопки мыши выбирается фигура, затем левым щелчком мыши выбирается клетка, в которую необходимо фигуру передвинуть. Если такое перемещение разрешено, фигура сдвигается в выбранную клетку. Ход переходит противнику.

7. Для сохранения игры необходимо щелкнуть левой кнопкой мыши по пункту меню «Сохранить».

8. Для загрузки сохраненной игры необходимо щелкнуть левой кнопкой мыши по пункту меню «Загрузить».

9. Для сохранения ходов игры необходимо щелкнуть левой кнопкой мыши по пункту меню «Сохранить ходы».

10. Для загрузки новой игры необходимо щелкнуть левой кнопкой мыши по пункту меню «Новая игра».

11. Изменить цвет фигур можно щелкнув левой кнопкой мыши по пункту меню «Смена фигур».

12. Закрыть программу можно щелкнув левой кнопкой мыши по пункту меню «Выход».

Заключение

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

Программа имеет интуитивно понятный интерфейс и направлена на взаимодействие с пользователем.

Правила пользования данным приложением были доступно изложены в разделе «Сопровождение».

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

программный сетевой приложение шахматы

Список используемой литературы

1. Гришмановский П.В., Даниленко И.Н. Курсовое проектирование. Разработка программного обеспечения. Методические указания к выполнению курсового проекта. Издательство СурГу, 2004. - 23 с.

2. Работа с ресурсами в Borland C++ Builder [Электронный ресурс]

3. Работа с графиками и рисунками средствами Borland C++ Builder [Электронный ресурс]

4. Работа с сокетами на VCL. [Электронный ресурс]

Приложение 1

Листинг программы Файл chess.cpp

1: //---------------------------------------------------------------------------

2: #include <vcl.h>

3: #pragma hdrstop

4: USEFORM("Unit1.cpp", Form1);

5: USEFORM("Unit2.cpp", Form2);

6: //---------------------------------------------------------------------------

7: WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)

8: {

9: try

10: {

11: Application->Initialize();

12: Application->CreateForm(__classid(TForm2), &Form2);

13: Application->Run();

14: }

15: catch (Exception &exception)

16: {

17: Application->ShowException(&exception);

18: }

19: catch( ... )

20: {

21: try {throw Exception(" ");}

22: catch(Exception &exception)

23: {

24: Application->ShowException(&exception);

25: }

26: }

27: return 0;

28: }

Файл unit1.cpp

1: //---------------------------------------------------------------------------

2: #include <vcl.h>

3: #pragma hdrstop

4: #include <stdio.h>

5: #include "Unit1.h"

6: #include "Unit2.h"

7: //---------------------------------------------------------------------------

8: #pragma package(smart_init)

9: #pragma resource "*.dfm"

10: TForm1 *Form1;

11: AnsiString probel="%%";

12: //---------------------------------------------------------------------------

13: __fastcall TForm1::TForm1(TComponent* Owner)

14: : TForm(Owner)

15: {

16: Initialize ( );

17: }

18: //---------------------------------------------------------------------------

19: void TForm1 :: Initialize ( )

20: {

21: //Инициализация

22: ThisX = 0;

23: ThisY = 0;

24: SelComplete = 0; // Для полноценого хода надо выбрать

25: // 2 координаты после того как SelComplete

26: // будет равен 2 можно ходить

27: Flag = 0;

28: NewX = NewY =0;

29: ThisFigure = BEPesh;

30: // Положительные - чёрный, а отрицательные - белые

31: for ( int i=0; i<8; i++ )

32: {

33: Doska[0][i] = -i-9; //Белые фигуры

34: Doska[1][i] = -i-1; //Белые пешки

35: Doska[6][i] = i+1; //Чёрные пешки

36: Doska[7][i] = i+9; //Чёрные фигуры

37: for ( int j=2; j<6; j++)

38: Doska[j][i] = 0; //Пусто

39: }

40: }

41: //---------------------------------------------------------------------------

42: void TForm1 :: CheckGo ( )

43: {

44: if ( IsGo ( ) )

45: if ( ( Flag && Doska[ThisY][ThisX]>0 ) || ( !Flag &&

Doska[ThisY][ThisX]<0 ) )

46: {

47: SendCoord ( );

48: VisHod ( );

49: Perehod ( );

50: Board->Enabled = false;

51: }

52: }

53: //---------------------------------------------------------------------------

54: void TForm1 :: Perehod ( )

55: {

56: if ( Flag )

57: Memo1->Lines->Add ( "Ходят белые" );

58: else

59: Memo1->Lines->Add ( "Ходят чёрные" );

60: Flag = !Flag;

61: }

62: //---------------------------------------------------------------------------

63: void TForm1::DrawRect ( int X , int Y , TColor Color )

64: {

65: Canvas->Pen->Color = Color;

66: Canvas->MoveTo ( X*40+32 , Y*40+32 );

67: Canvas->LineTo ( X*40+72 , Y*40+32 );

68: Canvas->LineTo ( X*40+72 , Y*40+72 );

69: Canvas->LineTo ( X*40+32 , Y*40+72 );

70: Canvas->LineTo ( X*40+32 , Y*40+32 );

71: }

72: //---------------------------------------------------------------------------

73: void TForm1 :: VisHod ( )

74: { //Делаем не видимой фигуру которую срубили

75: ThisFigure = WhoIsClicked ( NewY, NewX );

76: if ( ThisFigure == WLKing )

77: {

78: Memo1->Lines->Add( "Чёрные победили" );

79: MessageBox( NULL , "Чёрные победили" , ".:МАТ:." , MB_OK );

80: Close ( );

81: }

82: if ( ThisFigure == BLKing )

83: {

84: Memo1->Lines->Add( "Белые победили" );

85: MessageBox( NULL , "Белые победили" , ".:МАТ:." , MB_OK );

86: Close ( );

87: }

88: if ( ThisFigure!=Null_Image )

89: ThisFigure->Visible = false;

90: //Визуализация хода

91: ThisFigure = WhoIsClicked ( ThisY, ThisX );

92: ThisFigure->Left = NewX*40+32;

93: ThisFigure->Top = NewY*40+32;

94: // Редактирование фиртуальной шахматной доски Doska [][]

95: Doska[NewY][NewX]=Doska[ThisY][ThisX];

96: Doska[ThisY][ThisX]=0;

97: }

98: //--------------------------------------------------------------------------

99: void TForm1 :: SendCoord ( )

100: {

101: char Data[5];

102: Data[0]=10;

103: Data[1] = ThisX;

104: Data[2] = ThisY;

105: Data[3] = NewX;

106: Data[4] = NewY;

107: if ( ServerSocket1->Active )

108: ServerSocket1->Socket->Connections[0]->

109: SendBuf( (void*) Data, sizeof( Data ) );

110: else

111: ClientSocket1->Socket->

112: SendBuf( (void*) Data, sizeof( Data ) );

113: }

114: //--------------------------------------------------------------------------

115: void TForm1 :: SendMessage ( )

116: {

117: if ( ServerSocket1->Active )

118: ServerSocket1->Socket->Connections[0]->SendText(">>"+Form2-

>EditNik->Text +":" + EditChat->Text);

119: else

120: ClientSocket1->Socket->SendText(" "+Form2->EditNik->Text +":" +

EditChat->Text);

121: }

122: //--------------------------------------------------------------------------

123: void TForm1 :: SendDoska ( )

124: {

125: char Data[65];

126: Data[0]=20;

127: int count=1;

128: for(int i=0;i<=7;i++)

129: {

130: for(int j=0;j<=7;j++)

131: {

132: Data[count]=(char)Doska[i][j];

133: count++;

134: }

135: };

136: if ( ServerSocket1->Active )

137: ServerSocket1->Socket->Connections[0]->

138: SendBuf( (void*) Data, sizeof( Data ) );

139: else

140: ClientSocket1->Socket->

141: SendBuf( (void*) Data, sizeof( Data ) );

142: }

143: //--------------------------------------------------------------------------

144: void __fastcall TForm1::BoardMouseUp(TObject *Sender,

TMouseButton Button,TShiftState Shift, int X, int Y)

145: {

146: if ( ( X>352 )

147: || ( X<32 )

148: || ( Y<32 )

149: || ( Y>352 ) )

150: return;

151: SelComplete++;

152: switch ( SelComplete )

153: {

154: case 1:

155: ThisX = div ( X-32,40 ).quot;

156: ThisY = div ( Y-32,40 ).quot;

157: DrawRect ( ThisX , ThisY , clRed );

158: break;

159: case 2:

160: DrawRect ( ThisX , ThisY , clLtGray );

161: NewX = div ( X-32,40 ).quot;

162: NewY = div ( Y-32,40 ).quot;

163: SelComplete = 0;

164: CheckGo ( );

165: break;

166: default: SelComplete = 0;

167: }

168: }

169: //---------------------------------------------------------------------------

170: TImage* TForm1 :: WhoIsClicked ( __int8 Y, __int8 X )

171: {

172: switch ( Doska[Y][X] )

173: {

174: case -9 : return WLTura;

175: case 9 : return BLTura;

176: case -16 : return WRTura;

177: case 16 : return BRTura;

178: case -10 : return WLHors;

179: case 10 : return BLHors;

180: case -15 : return WRHors;

181: case 15 : return BRHors;

182: case -11 : return WLSlon;

183: case 11 : return BLSlon;

184: case -14 : return WRSlon;

185: case 14 : return BRSlon;

186: case -12 : return WLKing;

187: case 12 : return BLKing;

188: case -13 : return WRQuen;

189: case 13 : return BRQuen;

190: case -1 : return WAPesh;

191: case -2 : return WBPesh;

192: case -3 : return WCPesh;

193: case -4 : return WDPesh;

194: case -5 : return WEPesh;

195: case -6 : return WFPesh;

196: case -7 : return WGPesh;

197: case -8 : return WHPesh;

198: case 1 : return BAPesh;

199: case 2 : return BBPesh;

200: case 3 : return BCPesh;

201: case 4 : return BDPesh;

202: case 5 : return BEPesh;

203: case 6 : return BFPesh;

204: case 7 : return BGPesh;

205: case 8 : return BHPesh;

206: default : return Null_Image;

207: };

208: }

209: //---------------------------------------------------------------------------

210: void __fastcall TForm1::ServerSocket1ClientRead(TObject

*Sender,

211: TCustomWinSocket *Socket)

212: {

213: int Size;

214: char* Buffer;

215: int count;

216: Size = Socket->ReceiveLength( );

217: Buffer = new char[ Size ];

218: Socket->ReceiveBuf( (void*) Buffer, Size );

219: if(Buffer[0]==10)

220: {

221: ThisX = Buffer[1];

222: ThisY = Buffer[2];

223: NewX = Buffer[3];

224: NewY = Buffer[4];

225: delete [] Buffer;

226: Form1->VisHod ( );

227: Form1->Perehod ( );

228: Board->Enabled = true;

229: return;

230: }

231: if(Buffer[0]==20)

232: {

233: count=1;

234: for(int i=0;i<=7;i++)

235: {

236: for(int j=0;j<=7;j++)

237: {

238: Doska[i][j]=Buffer[count];

239: ThisFigure = WhoIsClicked ( i,j );

240: ThisFigure->Left = j*40+32;

241: ThisFigure->Top = i*40+32;

242: count++;

243: }

244: };

245: delete [] Buffer;

246: return;

247: }

248: Memo2->Lines->Add(Buffer);

249: delete [] Buffer;

250: }

251: //---------------------------------------------------------------------------

252: void __fastcall TForm1::ServerSocket1ClientConnect(TObject

*Sender,

253: TCustomWinSocket *Socket)

254: {

255: Memo1->Lines->Add ( "Присоединился " + Socket->RemoteHost);

256: }

257: //---------------------------------------------------------------------------

258: void __fastcall TForm1::ServerSocket1ClientDisconnect(TObject

*Sender,

259: TCustomWinSocket *Socket)

260: {

261: Memo1->Lines->Add ( "Связь потеряна" );

262: }

263: //---------------------------------------------------------------------------

264: void __fastcall TForm1::ServerSocket1ClientError(TObject

*Sender,

265: TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int

&ErrorCode)

266: {

267: Memo1->Lines->Add ( "Ошибка в соединении" );

268: }

269: //---------------------------------------------------------------------------

270: void __fastcall TForm1::ClientSocket1Connect(TObject *Sender,

271: TCustomWinSocket *Socket)

272: {

273: Memo1->Lines->Add ( "Соединение установлено" );

274: }

275: //---------------------------------------------------------------------------

276: bool TForm1 :: IsGo ( )

277: {

278: if ( ( ( Doska[NewY][NewX]>=0 ) && ( Doska[ThisY][ThisX]<0 ) )

279: || ( ( Doska[NewY][NewX]<=0 ) && ( Doska[ThisY][ThisX]>0 ) ) )

280: switch ( Doska[ThisY][ThisX] )

281: {

282: // Это ходы ферзя комбинация туры и слона

283: case -13 :

284: case 13 :

285: // Это обработка хода турой

286: case -9 :

287: case -16 :

288: case 9 :

289: case 16 :

290: // если ход по вертикали

291: if ( ThisX == NewX )

292: {

293: if ( ThisY < NewY )

294: {

295: for ( int i=ThisY+1; i<NewY; i++)

296: if ( Doska[i][ThisX]!=0 )

297: return false;

298: // Всё OK ходить можно

299: return true;

300: }

301: if ( ThisY > NewY )

302: {

303: for ( int i=ThisY-1; i>NewY; i--)

304: if ( Doska[i][ThisX]!=0 )

305: return false;

306: // Всё OK ходить можно

307: return true;

308: }

309: }

310: // если ход по горизонтали

311: if ( ThisY == NewY )

312: {

313: if ( ThisX < NewX )

314: {

315: for ( int i=ThisX+1; i<NewX; i++)

316: if ( Doska[ThisX][i]!=0 )

317: return false;

318: // Всё OK ходить можно

319: return true;

320: }

321: if ( ThisX > NewX )

322: {

323: for ( int i=ThisX-1; i>NewX; i--)

324: if ( Doska[ThisX][i]!=0 )

325: return false;

326: // Всё OK ходить можно

327: return true;

328: }

329: }

330: // case 16

331: case -11 :

332: case -14 :

333: case 11 :

334: case 14 : //Ходы слонов

335: if ( abs( ThisY-NewY )==abs ( ThisX-NewX ) )

336: {

337: if ( NewY > ThisY )

338: {

339: if ( NewX > ThisX )

340: {

341: for (int i=ThisY+1 , j=ThisX+1; i<NewY , j<NewX; i++ , j++)

342: if ( Doska[i][j]!=0 )

343: return false;

344: }

345: else

346: for (int i=ThisY+1, j=ThisX-1; i<NewY, j>NewX; i++ , j-- )

347: if ( Doska[i][j]!=0 )

348: return false;

349: }

350: else

351: {

352: if ( NewX > ThisX )

353: {

354: for (int i=ThisY-1, j=ThisX+1; i>NewY, j<NewX; i--, j++ )

355: if ( Doska[i][j]!=0 )

356: return false;

357: }

358: else

359: for (int i=ThisY-1, j=ThisX-1; i>NewY, j>NewX; i--, j-- )

360: if ( Doska[i][j]!=0 )

361: return false;

362: }

363: return true; // if после case 14

364: }

365: break; // case 9 -9 11 -11 13 -13 14 -14 16 -16

366: // тут заканчиваеться обработка ходов и белых и чёрных

367: // туры слона и ферзя

368: case -10 :

369: case 10 :

370: case -15 :

371: case 15 :

372: if ( ( abs ( NewX-ThisX )==1 && abs ( NewY-ThisY )==2 )

373: || ( abs ( NewX-ThisX )==2 && abs ( NewY-ThisY )==1 ) )

374: return true;

375: break; // лошади 8)

376: case -12 :

377: case 12 :

378: if ( ( abs ( ThisY-NewY )<=1 )

379: || ( abs ( ThisX-NewX )<=1 ) )

380: return true;

381: break; //case 12 -12 короли

382: case -1 :

383: case -2 :

384: case -3 :

385: case -4 :

386: case -5 :

387: case -6 :

388: case -7 :

389: case -8 :

390: if ( ( Doska[NewY][NewX]==0 )

391: && ( NewX==ThisX )

392: && ( ( NewY-ThisY==1 )

393: || ( ( NewY==3 ) && ( ThisY == 1 ) ) ) )

394: {

395: return true;

396: }

397: else if ( ( Doska[NewY][NewX]>0 )

398: && ( abs ( NewX-ThisX )==1 )

399: && ( NewY-ThisY ==1 ) )

400: return true;

401: break; // case -8

402: case 1 :

403: case 2 :

404: case 3 :

405: case 4 :

406: case 5 :

407: case 6 :

408: case 7 :

409: case 8 :

410: if ( ( Doska[NewY][NewX]==0 )

411: && ( NewX==ThisX )

412: && ( ( NewY-ThisY==-1 )

413: || ( ( NewY==4 ) && ( ThisY == 6 ) ) ) )

414: {

415: return true;

416: }

417: else if ( ( Doska[NewY][NewX]<0 )

418: && ( abs ( NewX-ThisX )==1 )

419: && ( NewY-ThisY ==-1 ) )

420: return true;

421: break; // case 8

422: default : return false;

423: } //switch

424: return false;

425: }

426: void __fastcall TForm1::ServerSocket1Listen(TObject *Sender,

427: TCustomWinSocket *Socket)

428: {

429: Memo1->Lines->Add ( "Сервер создан" );

430: }

431: //---------------------------------------------------------------------------

432: void __fastcall TForm1::N4Click(TObject *Sender)

433: {

434: MessageBox ( NULL , "Курсовая работа. Шахматы" , "О

программе" , MB_ICONINFORMATION );

435: }

436: //---------------------------------------------------------------------------

437: void __fastcall TForm1::Button1Click(TObject *Sender)

438: {

439: SendMessage();

440: }

441: //---------------------------------------------------------------------------

442: void __fastcall TForm1::N2Click(TObject *Sender)

443: {

444: Close ( );

445: }

446: //---------------------------------------------------------------------------

447: void __fastcall TForm1::FormClose(TObject *Sender,

TCloseAction &Action)

448: {

449: Form2->Close ();

450: }

451: //---------------------------------------------------------------------------

452: void __fastcall TForm1::Cj1Click(TObject *Sender)

453: {

454: char B[255];

455: GetCurrentDirectory(256,B);

456: TStringList *ss = new TStringList;

457: for(int i=0;i<=7;i++)

458: {

459: for(int j=0;j<=7;j++)

460: {

461: ss->Add(IntToStr(Doska[i][j])+probel);

462: }

463: };

464: ss->SaveToFile((AnsiString)B+"\\game.sav");

465: }

466: //---------------------------------------------------------------------------

467: void __fastcall TForm1::N1Click(TObject *Sender)

468: {

469: char B[255];

470: GetCurrentDirectory(256,B);

471: TStringList *ss = new TStringList;

472: ss->LoadFromFile((AnsiString)B+"\\game.sav");

473: for(int i=0;i<=7;i++)

474: {

475: for(int j=0;j<=7;j++)

476: {

477: Doska[i][j]=StrToInt(ss->Text.SubString(1,AnsiPos(probel,ss->Text)-

1));

478: ThisFigure = WhoIsClicked ( i,j );

479: ThisFigure->Left = j*40+32;

480: ThisFigure->Top = i*40+32;

481: SendDoska();

482: ss->Delete(0);

483: }

484: };

485: delete ss;

486: }

487: //---------------------------------------------------------------------------

488: void __fastcall TForm1::N5Click(TObject *Sender)

489: {

490: N5->Checked = !N5->Checked;

491: if(N5->Checked)

492: {

493: Form1->Memo1->Lines->Add (Form2->EditNik->Text + ",Вы

играете белыми" );

494: Form1->Board->Enabled = true;

495: }

496: else

497: {

498: Form1->Memo1->Lines->Add (Form2->EditNik->Text + ",Вы

играете черными" );

499: Form1->Board->Enabled = false;

500: }

501: }

502: void TForm1 :: saveStep( )

503: {

504: int x1,x2,y1,y2;

505: AnsiString tmp="";

506: char h[8]={'a','b','c','d','e','f','g','h'};

507: char v[8]={'8','7','6','5','4','3','2','1'};

508: try

509: {

510: if (!Flag) tmp="белые";

511: else tmp="черные";

512: x1=ThisX;

513: x2=NewX;

514: y1=ThisY;

515: y2=NewY;

516: tmp=tmp+":"+h[x1]+v[y1]+"-"+h[x2]+v[y2];

517: //tmp=tmp+":"+StrToInt(x1)+StrToInt(y1)+"-

"+StrToInt(x2)+StrToInt(y2);

518: Memo3->Lines->Add(tmp);

519: }

520: catch(...)

521: {

522: };

523: }

524: void __fastcall TForm1::N6Click(TObject *Sender)

525: {

526: char B[255];

527: GetCurrentDirectory(256,B);

528: Memo3->Lines->SaveToFile((AnsiString)B+"\\GAME\\"+Form2-

>EditNik->Text+"_game.txt");

529: }

Файл unit2.cpp

1: //---------------------------------------------------------------------------

2: #include <vcl.h>

3: #pragma hdrstop

4: #include "Unit2.h"

5: #include "Unit1.h"

6: //---------------------------------------------------------------------------

7: #pragma package(smart_init)

8: #pragma resource "*.dfm"

9: TForm2 *Form2;

10: //---------------------------------------------------------------------------

11: __fastcall TForm2::TForm2(TComponent* Owner)

12: : TForm(Owner)

13: {

14: }

15: //---------------------------------------------------------------------------

16: void __fastcall TForm2::Button1Click(TObject *Sender)

17: {

18: Form1= new TForm1(this);

19: Form1->ClientSocket1->Host = Edit1->Text;

20: Form1->ClientSocket1->Address = Edit1->Text;

21: Form1->Color = RadioGroup1->ItemIndex;

22: if ( RadioGroup1->ItemIndex )

23: {

24: Form1->Memo1->Lines->Add ( EditNik->Text + ",Вы играете

чёрными" );

25: Form1->Board->Enabled = false;

26: Form1->N5->Checked=false;

27: }

28: else

29: {

30: Form1->Memo1->Lines->Add ( EditNik->Text + ",Вы играете

белыми" );

31: Form1->N5->Checked=true;

32: }

33: //Если Flag 1 - ходят чёрные, 0 - ходят белые

34: if ( RadioGroup2->ItemIndex )

35: {

36: Form1->ServerSocket1->Active = true;

37: Form1->Caption = "Шахматы-Server";

38: }

39: else

40: {

41: Form1->ClientSocket1->Active = true;

42: Form1->Caption = "Шахматы-Client";

43: }

44: Form2->Visible = false;

45: Form1->ShowModal ();

46: Form1->Free();

47: }

48: //---------------------------------------------------------------------------

49: void __fastcall TForm2::Button2Click(TObject *Sender)

50: {

51: float a=rand()/1000;

52: if (a > 15)

53: {

54: RadioGroup1->ItemIndex=1;

55: }

56: else

57: {

58: RadioGroup1->ItemIndex=0;

59: }

60: }

Размещено на Allbest.ru

...

Подобные документы

  • Разработка приложения, которое будет выполнять функции показа точного времени и точной даты. Определение дополнительных функций разработанного приложения. Рассмотрение основных этапов создания программного продукта. Результаты тестирования приложения.

    курсовая работа [2,2 M], добавлен 14.04.2019

  • Анализ предметной области. Диаграмма классов. Проектирование программного продукта "Часы". Тестирование и отладка, руководство программиста. Описание работы приложения. Руководство оператора, модель жизненного цикла. Файл Times.cs, Arrow.cs, Form1.cs.

    курсовая работа [1,7 M], добавлен 20.04.2015

  • Анализ целевой аудитории. Функциональные характеристики пользовательского приложения. Разработка алгоритмов и интерфейса программного продукта, функций рабочей области. Написание скриптов на языке C#. Тестирование программы методом чёрного ящика.

    дипломная работа [1,5 M], добавлен 09.11.2016

  • Автоматизация системы снятия показаний счетчиков энергии. Разработка базы данных и клиентского приложения для структур жилищно-коммунального хозяйства, занимающихся составлением квитанций. Описание предметной области. Тестирование клиентского приложения.

    курсовая работа [953,3 K], добавлен 01.09.2016

  • Основные концепции разработки приложения в трёхуровневой архитектуре. Проектное решение, реализующее модель реляционной БД. Спецификация на разработку интерфейса. Описание выполнения транзакций прибытия и убытия судна. Инсталляционные файлы приложения.

    курсовая работа [4,0 M], добавлен 26.12.2011

  • Разработка программного приложения по автоматизированному учету поступающего довольствия. Описание среды программирования. Тестирование и отладка приложения. Анализ результатов решения. Инструкция пользователю. Требования к техническому обеспечению.

    дипломная работа [946,0 K], добавлен 18.07.2014

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

    курсовая работа [2,8 M], добавлен 25.06.2017

  • Анализ предметной области "Конкурс поэтов" на основе объектно-ориентированного подхода. Разработка оконного приложения и описание информационной модели предметной области. Описание разработанных процедур С++ и результатов тестирования приложения.

    курсовая работа [355,9 K], добавлен 18.06.2013

  • Основные инструменты построения Web-приложения. Язык сценариев PHP. Системный анализ предметной области базы данных. Коды SQL запросов на создание таблиц. Разработка Web-приложения. Описание функциональности модулей. Система управления содержимым статей.

    курсовая работа [4,8 M], добавлен 28.04.2014

  • Создание приложения для получения информации о расписании движения междугороднего транспорта Владимирской области. Параметры совместимости приложения с различными версиями Android. Схема взаимодействия между классами. Описание внешнего вида интерфейса.

    контрольная работа [2,5 M], добавлен 17.02.2016

  • Описание технологии asp.net. Страницы веб-приложения, тестирование системы. Описание функциональной, динамической модели системы. Диаграммы вариантов использования, последовательности, база данных приложения. Реализация программы, интерфейс, тестирование.

    курсовая работа [3,2 M], добавлен 30.01.2013

  • Разработка и реализация демонстрационного многопоточного приложения. Выбор основных средств реализации. Описание логики работы приложения и разработка программного обеспечения. Описание пользовательского интерфейса. Реализация потоков в Delphi.

    курсовая работа [462,5 K], добавлен 10.08.2014

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

    курсовая работа [3,3 M], добавлен 23.07.2012

  • Разработка программного приложения WindowsForms для работы с базой данных на языке высокого уровня C# в автономном режиме с использованием ADO.NET. Проектирование реляционной модели базы данных, интерфейса приложения, основных функций и возможностей.

    курсовая работа [4,3 M], добавлен 30.06.2015

  • Рассмотрение игр, схожих по жанру и модели распространения с разрабатываемым приложением. Выбор среды разработки и сторонних библиотек. Проектирование интерфейса и подготовка графических материалов приложения. Особенности введения в игру микротрансакций.

    дипломная работа [3,1 M], добавлен 18.11.2017

  • Описание предметной области. Компоненты и палитра компонентов. Выбор архитектуры приложения. Структурные и функциональные схемы. Описание разрабатываемых процедур и функций, таблица идентификаторов. Выбор стратегии тестирования и разработка тестов.

    дипломная работа [8,2 M], добавлен 18.06.2014

  • Спецификация требований к разрабатываемому приложению. Разработка структурной схемы интерфейса. Описание алгоритма шифрования DES. Разработка программного кода приложения "DES". Проведение исследования основных шагов для генерации ключей и шифрования.

    курсовая работа [398,4 K], добавлен 13.12.2022

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

    дипломная работа [343,8 K], добавлен 06.06.2010

  • Анализ предметной области, функциональные части и этапы создания web-приложения, которое будет осуществлять интернет-торговлю по схеме "Предприятие – клиенты". Разработка вспомогательного web-приложения, необходимое для работы с базой данных основного.

    курсовая работа [3,3 M], добавлен 05.06.2011

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

    курсовая работа [1,2 M], добавлен 07.07.2012

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.