11 сентября 2018 г.

Сетевые шахматы (Network Chess). С исходным кодом на C# скачать бесплатно.


Описание


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


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



Используемые технологии и внешние сборки.


  • Клиентский интерфейс создан с использованием WPF.
  • Серверная часть размещена на IIS Express.
  • Сетевое взаимодействие происходит через WCF. Используются два контракта, один работающий по принципу Request-Responce, второй используя дуплексную связь (Contract + Callback). Оба сервиса являются WAS.
  • В качестве привязки используется HTTP based привязка wsDualHttpBinding, дающая возможность использовать в режиме SessionMode.Required и поддерживающая работу с Callback контрактом.
  • В качестве IoC контейнера используется Autofac для серверной и клиентской части.
  • Что бы WCF службы могли поддерживать DI, используется пакет Autofac.Wcf из NuGet.
  • Для регистрации контейнера Autofac на сервере в момент запуска сервера, использовался предложенный Autofac вариант с OWIN.

Демонстрация работы


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



С какими сложностями столкнулся я.


Казалось бы, зная правила хождения каждой фигур можно достаточно легко запрограммировать шахматы. Так то оно так, но самым сложным было:
  • Написание логики хождения короля, поскольку он может ходить лишь так, что бы не подпасть под шах. При этом, в случае если ему шах, то избавиться от него можно либо отходом в сторону, либо ходом другой фигуры, что накладывает на ход вычисления доступных для передвижения ячеек.
  • То же самое относится и к выяснению "Шах" или "Шах и Мат", приходится рекурсивно обходить все фигуры и выяснять есть ли какой либо ход, после которого мы "выживаем". Если да, то мы должны давать возможность игроку сходить только этим ходом.
  • Не менее трудоемким, на начальном этапе, было рисование поля с нуля. Для этого я создал отдельный Control, который был наделён универсальностью, и не составит труда, например, создать игру "Шашки" на основе поля "Шахмат".

Программа неплохо зайдёт в качестве курсовой работы. Ссылка на скачивание в начале статьи.

Спасибо за внимание!

17 комментариев:

  1. Здравствуйте! Очень благодарен за предоставленный исходник, но не могу запустить саму игру. Как правильно настроить солюшн для запуска непосредственно в Visual Studio? Заранее спасибо

    ОтветитьУдалить
    Ответы
    1. Добрый день.

      Студия должна быть минимум 2015 желательно с Upgrade 3 так как используется синтаксис C# 6.0, в остальном должно запускаться по F5.

      Удалить
    2. Работает! По крайней мере запускается) Осталось проверить игру на разных пк. Или можно запустить на одном?

      Удалить
  2. Кстати, в поле "localhost" что именно требуется ввести? Извините за расспрос)

    ОтветитьУдалить
    Ответы
    1. Без проблем, спрашивайте. Если вам просто хочется поглядеть как все выглядит, то все без проблем работает на одном компьтере. Для этого в свойствам ставить запускать одновременно клиент и сервер, затем как клиент запустится жмёте подключиться. Затем запускаете 2-й экземпляр .exe и в нем тоже жмёте подключиться (как на мини видео выше).

      Удалить
    2. Получилось! Наконец-то понял принцип запуска и взаимодействия. Спасибо огромное! Если возникнут еще вопросы, буду признателен за консультацию :)

      Удалить
  3. Здравствуйте! Подскажите пожалуйста, как создать диаграмму взаимодействия классов, диаграмму работы клиент-сервера и блок-схему одного из алгоритмво? Для этого есть какие-то программы, сервисы?

    ОтветитьУдалить
    Ответы
    1. Диаграммы студия делать умеет, можете искать "Visual Studio Class Diagram"

      Вот пример создания на 2017

      https://docs.microsoft.com/en-us/visualstudio/ide/class-designer/how-to-add-class-diagrams-to-projects?view=vs-2017

      Удалить
  4. Здравствуйте, подскажите как опубликовать серверную часть на winsows 10 pro в iis? Клиент запускается, а сервер не могу подключить. Спасибо

    ОтветитьУдалить
    Ответы
    1. Добрый день.

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

      Удалить
  5. Можно объяснение, как запустить сервер и клиент одновременно? Просто пытаясь это сделать выдает ошибку, а мне нужно запустить игру на одном ПК.

    ОтветитьУдалить
    Ответы
    1. Очень просто, для этого надо

      1. У Solution 'ChessBuild' нажать контекстное меню
      2. Выбрать "Set Startup Projects"
      3. Выбрать в подразделе "Startup project" выбрать "Multiple startup prjects"
      4. Указать напротив NC.Client и NC.WebServer значение Action=Start

      Запустить решение

      Удалить
    2. В этом случае появляется немного другая проблема: при открытии окна программы вместе с этим открывается браузер с ошибкой "HTTP Error 403.14 - Forbidden", при этом программа работает и при нажатии "Connect" происходит "Awaiting new opponent" и вроде все как надо, но если закрыть браузер с ошибкой, о которой я написал выше, то также закроется и окно программы. А если не закрывать браузер с ошибкой, то идет бесконечная загрузка.

      Удалить
    3. В свойствах сервера поставь что бы страница не отрывалась, она не нужна. ЕСли видно Awaiting new opponent то запускай 2 окно клиента и подключайся что бы игра началась

      Удалить
  6. Здравствуйте, а я хочу изменить эти шахматы с 8 на 8, на 9 на 9, добавить 2 пешки чёрную и белую, и новую фигуру, получится это сделать в этом проекте?

    ОтветитьУдалить