Part of gamestate keeping

This commit is contained in:
Sebastian Lohff 2013-11-13 21:16:50 +01:00
parent a6742ddfc5
commit 280544c66d
4 changed files with 73 additions and 14 deletions

39
game.py
View File

@ -12,7 +12,7 @@ class SeopardyGame(QtGui.QWidget):
self.questions = questions self.questions = questions
self.gamestate = gamestate self.gamestate = gamestate
self.players = [Player.gen_player(i) for i in range(1, 4)] self.players = [Player.gen_player(i) for i in range(1, 4)]
self._inQuestion = False self._inOtherWindow = False
self._createGui() self._createGui()
@ -57,35 +57,54 @@ class SeopardyGame(QtGui.QWidget):
self.setLayout(layout) self.setLayout(layout)
#def event(self, e):
# print("Event", e)
# super(SeopardyGame, self).event(e)
def keyPressEvent(self, e): def keyPressEvent(self, e):
print("Mainwindow", e) print("Mainwindow", e)
print("current widget", e.key(), self.focusWidget())
if e.key() == QtCore.Qt.Key_Escape: if e.key() == QtCore.Qt.Key_Escape:
self.close() self.close()
elif e.key() == QtCore.Qt.Key_E:
if self._inOtherWindow:
return
self._inOtherWindow = True
#editResultsWin = EditResultsWindow()
#editResultsWin.exec_()
self._inOtherWindow = False
def go_to_question(self, section, number): def go_to_question(self, section, number):
if self._inQuestion: if self._inOtherWindow:
return return
self._inQuestion = True self._inOtherWindow = True
print("question window", section, number) print("question window", section, number)
answers = self.gamestate.get_answers(section, number)
qwin = QuestionWindow(self.players, section, number, self.questions.get_question(section, number), self) qwin = QuestionWindow(self.players, section, number, self.questions.get_question(section, number), answers, self)
qwin.showFullScreen() qwin.showFullScreen()
qwin.exec_() qwin.exec_()
self._inQuestion = False self._inOtherWindow = False
answers = qwin.get_answers() answers = qwin.get_answers()
self.gamestate.set_answers(section, number, answers)
# add points to players # add points to players
# FIXME: Note that we cannot add points when revisiting a question # FIXME: Note that we cannot add points when revisiting a question
for player, correct in answers.get_tries(): self._set_player_points(answers)
points = number*100
if not correct:
points *= -1
player.add_points(points)
# restyle the button # restyle the button
self._restyle_button(section, number, answers) self._restyle_button(section, number, answers)
def _set_player_points(self, answers, rollback=False):
for player, correct in answers.get_tries():
prefix = 1
if rollback:
prefix *= -1
if not correct:
prefix *= -1
player.add_points(answers.points()*prefix)
def _restyle_button(self, sec, qno, answers): def _restyle_button(self, sec, qno, answers):
secno = self.questions.get_number_from_section(sec) secno = self.questions.get_number_from_section(sec)

View File

@ -1,7 +1,40 @@
from __future__ import print_function from __future__ import print_function
import os
from collections import defaultdict
class GameState(object): class GameState(object):
def __init__(self, statefile=None): """ Represent current gamestate.
players: list of player names + current points
savedir: dir to save gamestate into, should be overwritable
board: dict of section with list of questions
"""
def __init__(self, savedir):
self.savedir = savedir
self._board = defaultdict(lambda: [None]*5)
self._players = None
if not os.path.exists(self.savedir):
os.mkdir(self.savedir)
elif not os.path.isdir(self.savedir):
raise ValueError("'%s' is not a directory but something else!" % self.savedir)
def set_answers(self, section, qnumber, answers):
self._board[section][qnumber-1] = answers
def get_answers(self, section, qnumber):
return self._board[section][qnumber-1]
def set_players(self, players):
self.players = players
def save(self):
pass
@classmethod
def load(clazz, fpath):
pass pass
class QuestionAnswers(object): class QuestionAnswers(object):
@ -15,6 +48,9 @@ class QuestionAnswers(object):
def add_try(self, player, correct): def add_try(self, player, correct):
self.tries.append((player, correct)) self.tries.append((player, correct))
def points(self):
return self.qnumber*100
def nobody_knew(self): def nobody_knew(self):
self.nobody_answered = True self.nobody_answered = True

View File

@ -15,6 +15,7 @@ def _parser():
parser = argparse.ArgumentParser(description="Sebas jeopardy/beopardy clone") parser = argparse.ArgumentParser(description="Sebas jeopardy/beopardy clone")
parser.add_argument("--fifo", action="store", default="/tmp/seopardy-fifo", help="Name of the fifo to create") parser.add_argument("--fifo", action="store", default="/tmp/seopardy-fifo", help="Name of the fifo to create")
parser.add_argument("--gamestate", action="store", default=None, help="Gamestate to load to recover a crashed game") parser.add_argument("--gamestate", action="store", default=None, help="Gamestate to load to recover a crashed game")
parser.add_argument("--savedir", action="store", default="/tmp/seopardy/", help="Directory where to save the temporary gamestates to, in case of game-crash")
parser.add_argument("questions", action="store", help="Path to questionfile") parser.add_argument("questions", action="store", help="Path to questionfile")
return parser return parser
@ -32,7 +33,7 @@ if __name__ == '__main__':
print("Error: Could not create fifo: %s" % (str(e),), file=sys.stderr) print("Error: Could not create fifo: %s" % (str(e),), file=sys.stderr)
questions = Questions(args.questions) questions = Questions(args.questions)
gamestate = GameState(args.gamestate) gamestate = GameState(args.savedir)
# start gui # start gui
app = QtGui.QApplication([]) app = QtGui.QApplication([])

View File

@ -4,13 +4,16 @@ from gamestate import QuestionAnswers
#class QuestionWindow(QtGui.QWidget): #class QuestionWindow(QtGui.QWidget):
class QuestionWindow(QtGui.QDialog): class QuestionWindow(QtGui.QDialog):
def __init__(self, players, section, qnumber, question, parent=None): def __init__(self, players, section, qnumber, question, answers=None, parent=None):
super(QuestionWindow, self).__init__(parent) super(QuestionWindow, self).__init__(parent)
self.players = players self.players = players
self.section = section self.section = section
self.qnumber = qnumber self.qnumber = qnumber
self.question = question self.question = question
if answers is not None:
self.answers = answers
else:
self.answers = QuestionAnswers(self.section, self.qnumber) self.answers = QuestionAnswers(self.section, self.qnumber)
self._setupGui() self._setupGui()