Подключить автономную игровую модель к пользовательскому интерфейсу на основе Qt

Я создал простую консольную игру Scrabble с использованием Python. Я попытался максимально инкапсулировать игровую модель из ввода-вывода, то есть я создал несколько классов для описания игры с ее правилами и текущим состоянием. В основном я придумал следующие классы:

  • LetterSet : для описания плиток в игре (счет, общая сумма и т. Д.)
  • Board : представление доски с ее плитками и вспомогательными элементами functions
  • Player : виртуальный класс для создания подкласса реальных классов, таких как Human или Bot, получил один метод play () , который должен возвращать ход игрока
  • Game : Ну .. .

Все работает нормально, используя простой линейный и синхронный поток с моим консольным приложением.

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

Проблема в том, что я не знаю, как это сделать. обработать метод play () , который может использовать созданный мной интерфейс Qt для генерации допустимого хода. Это не проблема для бота , который просто ищет ход без какого-либо взаимодействия.

Моя текущая идея - создать локальный цикл событий, как описано здесь , и дождаться кнопки для нажатия в моем методе play () , определенном в Human (Bot) . Это довольно уродливо, поэтому мне интересно, есть ли лучший способ сделать это.

Я бы хотел, чтобы основная логика была такой же, например, класс Player обслуживает метод play () , который генерирует ход и возвращает его. Таким образом, должно быть возможно создание любого типа Player , например сетевых игроков или ботов. Этот синхронный способ сделать это не очень хорошо работает с основанным на Qt способом работы с сигналами / слотами. Надеюсь, у кого-то есть отличная идея решить мою проблему.

Резюме: Как сгенерировать ход Player внутри его метода play () и вернуть его как простой move = player.play (game) вызов?

Изменить: Снимок, чтобы понять, о чем я говорю: snapshot
(источник: b52 на reaktor42.de )

Edit2: Это довольно давно, и я успешно выполнил задание около двух лет назад. Тем не менее, я подумал, что это может быть полезно для других, если я опубликую результаты через github .

Заранее спасибо, Оли

6
задан Glorfindel 11 August 2019 в 11:15
поделиться