Реализация клиентской части

При разборе программного кода клиента следует еще раз вернутся к особенностям функционирования сервера. В программе сервера строка 229 начинается с цикла, повторяющегося до тех пор, пока свойство Socket.Available не проинформирует о наличии сведений, необходимых для получения информации с сокета (либо, пока сервер не отключится от клиента). При отсутствии такой информации поток на одну секунду "засыпает". После "пробуждения" поток использует свойство Disconnected для проверки установки переменной сервера disconnect на истинность его значения. Если это значение истинно, то тогда поток выходит из метода потому, что он прерывается. В противном случае поток повторяется еще раз. Однако, если свойство Available указывает на наличие данных для приема, то цикл прерывается (стр.229-235) и информация обрабатывается.

Данная информация содержит переменную целого типа, обозначающую местоположение, в которое клиент хочет поместить свой знак. В строке 238 вызывается метод BinaryReader.ReadInt32 (), считывающий значение этой переменной из потокового объекта, который был создан вместе с объектом сокета. После этого (в строке 242) данная переменная передается в метод сервера Server.ValidMove (). Если этот метод подтверждает допустимость хода, то игрок помещает свой знак в выбранную клетку.

С помощью метода ValidMove () (стр.101-131) клиенту направляется сообщение, извещающее его о допустимости хода. Местоположения на игровом поле соответствуют цифрам от 0 до 8 (0-2 – для первого ряда, 3-5 – для второго ряда и 6-8 – для третьего). Все операторы метода ValidMove () заключены в оператор lock, позволяющий сделать за один раз только один ход. Этим игрок, предотвращается изменение информации о состоянии игры одновременно двумя игроками. Если игрок, предпринимающий попытку подтверждения допустимости хода, не является текущим игроком, имеющим право на ход, тогда он помещается в состояние ожидания своей очереди на ход. Если пользователь пытается ввести знак в уже занятую клетку поля, тогда метод ValidMove () возвращает ложное значение. Однако, если пользователь выбрал свободную клетку (стр.111), тогда в строках 114 и 115 знак помещается в локальное представление игрового поля. Строка 121 извещает другого игрока о сделанном ходе, а в строке 124 активизируется метод Pulse () для того, чтобы ожидающий тгрок смог подтвердить допустимость хода. После этого данный метод возвращает истинное значение, подтверждающее допустимость хода.

При исполнении приложения клиента создается текстовое поле (TextBox) для отображения сообщений сервера и изображения игрового поля. Игровое поле создается из девяти объектов типа Square (его текст приведен ниже), содержащий панели, на которых пользователь может щелкать клавишей мыши, указывая нужное положение, куда следует поместить знак. Конструктор клиентского приложения (стр.50-82) открывает соединение с сервером (стр.73) и получает ссылку на потоковый объект, относящийся к данному соединению, из объекта класса TcpClient (стр.74). В строках 80 и 81 запускается поток для считывания сообщений, отправленных клиенту от сервера. Сервер передает сообщения (например, о допустимости кода) в метод ProcessMessage () (стр.163-207). Если в сообщении указано, что ход – допустим (стр.168), то клиент ставит свой знак в текущую клетку, на которой пользователь щелкнул мышкой, и обновляет поле. Если сообщение указывает, что ход не допустимый (стр.178), то программа клиента уведомляет пользователя о необходимости выбора другой клетки. Если же сообщение указывает на то, что противник сделал ход (стр.185), тогда в соответствии со строкой 188, считывается переменная типа целого, задающая местоположение на поле, в которую клиент должен поместить знак противника.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: