Stworzyłem prostą konsolową grę Scrabble z wykorzystaniem Pythona. Starałem się hermetyzować model gry z I/O tak bardzo, jak to możliwe, co oznacza, że stworzyłem kilka klas, aby opisać grę z jej regułami i aktualnym stanem. Zasadniczo wymyśliłem tych klasach:Połączyć autonomiczny model gry z interfejsem opartym na Qt
LetterSet
: Aby opisać płytek w grze (punktacja łączna kwota, itp)Board
: Reprezentacja Zarządu z jego funkcji płytek i auxiliryPlayer
: wirtualna klasa podklasy rzeczywiste Classes jak istota ludzka lub BOT, dostał jedną z metod, które powinny powrócićplay()
gracze poruszaćGame
: Cóż ...
Wszystko działa dobrze dzięki prostemu, liniowemu i synchronicznemu przepływowi z moją aplikacją konsolową.
Ale okazuje się, że nie jest łatwo przenieść tę koncepcję do Qt. Stworzyłem wszystkie potrzebne widżety, takie jak tablica Dragable, ogólne elementy wizualne opisujące stan gry i proste przyciski, takie jak "Pass", "Continue", "Exchange".
Problem polega na tym, że nie jestem pewien, jak postępować z metodą play()
, która może korzystać z interfejsu Qt utworzonego w celu wygenerowania prawidłowego ruchu. Nie jest to jednak problemem dla Bot
, który po prostu wyszukuje ruch bez żadnej interakcji.
Mój obecny pomysł to utworzenie lokalnej pętli zdarzeń, jak opisano here i oczekiwanie na kliknięcie przycisków w mojej metodzie play()
zdefiniowanej w Human(Bot)
. Jest to trochę brzydkie, więc zastanawiam się, czy istnieje lepszy sposób na zrobienie tego.
Chciałbym, aby główna logika była taka sama, np. klasa Player
obsługuje metodę play()
, która generuje ruch i zwraca go. W ten sposób powinno być możliwe utworzenie dowolnego typu urządzeń typu Player
, takich jak odtwarzacze sieciowe lub boty. Ten synchroniczny sposób robienia tego nie działa dobrze z działaniem Qt na zasadzie sygnału/gniazda. Mam nadzieję, że ktoś ma pomysł na rozwiązanie mojego problemu.
Podsumowując:Jak wygenerować Przesuń Player
„s wewnątrz jego metody play()
i odsyłając je jak zwykłą move = player.play(game)
rozmowy?
Edit: Migawka, aby zorientować się, co mówię: snapshot http://reaktor42.de/~b52/shots/2011-06-26-235749_972x729_scrot.png
Edit2: jest to raczej stary i zakończyła zadanie o dwa lata temu z powodzeniem. Niemniej jednak pomyślałem, że może to być przydatne dla innych, jeśli opublikuję results through github.
Dzięki z góry, Oli
Ale jak zachować to wszystko w metodzie 'play()' i zwróć ruch dopiero po tym, jak gracz naprawdę coś zrobił. Nie rozumiem, jak mogę to zrobić za pomocą sygnałów i gniazd. –