Answering questions works

This commit is contained in:
Sebastian Lohff 2013-11-11 00:52:37 +01:00
parent 17b8ba4047
commit a6742ddfc5
5 changed files with 86 additions and 24 deletions

53
game.py
View File

@ -12,6 +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._createGui() self._createGui()
@ -40,9 +41,10 @@ class SeopardyGame(QtGui.QWidget):
b.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) b.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
b.setAutoDefault(False) b.setAutoDefault(False)
b.setStyleSheet("QPushButton { font-size: 60px; }") b.setStyleSheet("QPushButton { font-size: 60px; }")
b.clicked.connect(lambda sec=sec, j=j: self.tfunc(sec, j+1)) b.clicked.connect(lambda sec=sec, j=j: self.go_to_question(sec, j+1))
board.addWidget(b, j+1, i) board.addWidget(b, j+1, i)
layout.addLayout(board) layout.addLayout(board)
self.board = board
# create player bar # create player bar
self.playerBar = QtGui.QHBoxLayout() self.playerBar = QtGui.QHBoxLayout()
@ -54,19 +56,60 @@ class SeopardyGame(QtGui.QWidget):
self.setLayout(layout) self.setLayout(layout)
def keyPressEvent(self, e): def keyPressEvent(self, e):
print("Mainwindow", e) print("Mainwindow", e)
if e.key() == QtCore.Qt.Key_Escape: if e.key() == QtCore.Qt.Key_Escape:
self.close() self.close()
def tfunc(self, section, number): def go_to_question(self, section, number):
if self._inQuestion:
return
self._inQuestion = True
print("question window", section, number) print("question window", 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), self)
qwin.showFullScreen() qwin.showFullScreen()
qwin.exec_() qwin.exec_()
results = qwin.get_results() self._inQuestion = False
for result in results:
print("result", result)
answers = qwin.get_answers()
# add points to players
# FIXME: Note that we cannot add points when revisiting a question
for player, correct in answers.get_tries():
points = number*100
if not correct:
points *= -1
player.add_points(points)
# restyle the button
self._restyle_button(section, number, answers)
def _restyle_button(self, sec, qno, answers):
secno = self.questions.get_number_from_section(sec)
btn = self.board.itemAtPosition(qno, secno-1).widget()
print("btn", btn, type(btn))
btnstr = ""
btncolor = None
# restrict number of tries shown
numTries = 4 if answers.got_answered() else 3
tries = answers.get_tries()
if len(tries) > numTries:
btnstr = "...\n"
for player, correct in answers.get_tries()[-numTries:]:
if correct:
btncolor = player.color
prefix = "+"
else:
prefix = "-"
btnstr += "%s%s\n" % (prefix, player.name)
if not answers.got_answered():
btnstr += "+nobody"
btncolor = QtGui.QColor(128, 128, 128)
btn.setStyleSheet("QPushButton { background-color: %s; color: white; font-size: 20px; border: none; }" % (btncolor.name(),))
btn.setText(btnstr.strip())

View File

@ -4,10 +4,25 @@ class GameState(object):
def __init__(self, statefile=None): def __init__(self, statefile=None):
pass pass
class QuestionAnswer(object): class QuestionAnswers(object):
def __init__(self, section, question, player, answerno, correct): def __init__(self, section, qnumber):
self.section = section self.section = section
self.question = question self.qnumber = qnumber
self.player = player self.nobody_answered = False
self.answerno = answerno
self.correct = correct self.tries = []
def add_try(self, player, correct):
self.tries.append((player, correct))
def nobody_knew(self):
self.nobody_answered = True
def got_answered(self):
return not self.nobody_answered
def get_tries(self):
return self.tries
def is_answered(self):
return self.nobody_answered or any([c for (u, c) in self.tries])

View File

@ -37,7 +37,7 @@ class Player(QtGui.QWidget):
def add_points(self, amount): def add_points(self, amount):
self.points += amount self.points += amount
self.points_label.set_text(str(self.points)) self.points_label.setText(str(self.points))
@classmethod @classmethod
def gen_player(clazz, num): def gen_player(clazz, num):

View File

@ -32,6 +32,12 @@ class Questions(object):
raise ValueError("question parameter needs to be an integer between 1 and 5") raise ValueError("question parameter needs to be an integer between 1 and 5")
return self.get_questions(section)[question-1] return self.get_questions(section)[question-1]
def get_number_from_section(self, section):
for i,s in enumerate(self._questions, 1):
if s["Section"] == section:
return i
raise ValueError("Section '%s' does not exist" % section)
def _read_questions(self): def _read_questions(self):
f = None f = None

View File

@ -1,6 +1,6 @@
from PySide import QtGui, QtCore from PySide import QtGui, QtCore
from gamestate import QuestionAnswer from gamestate import QuestionAnswers
#class QuestionWindow(QtGui.QWidget): #class QuestionWindow(QtGui.QWidget):
class QuestionWindow(QtGui.QDialog): class QuestionWindow(QtGui.QDialog):
@ -11,13 +11,13 @@ class QuestionWindow(QtGui.QDialog):
self.section = section self.section = section
self.qnumber = qnumber self.qnumber = qnumber
self.question = question self.question = question
self.results = [] self.answers = QuestionAnswers(self.section, self.qnumber)
self._setupGui() self._setupGui()
self.setWindowTitle("Seopardy") self.setWindowTitle("Seopardy - %s - %d" % (section, qnumber*100))
def get_results(self): def get_answers(self):
return self.results return self.answers
def _mkQuestionLabel(self, text): def _mkQuestionLabel(self, text):
question = QtGui.QLabel(text, alignment=QtCore.Qt.AlignCenter) question = QtGui.QLabel(text, alignment=QtCore.Qt.AlignCenter)
@ -56,19 +56,19 @@ class QuestionWindow(QtGui.QDialog):
def keyPressEvent(self, e): def keyPressEvent(self, e):
print("question", e, e.key()) print("question", e, e.key())
if e.key() == QtCore.Qt.Key_Escape: if e.key() == QtCore.Qt.Key_Escape:
if not self.answers.is_answered():
self.answers.nobody_knew()
self.close() self.close()
elif e.key() >= ord('1') and e.key() <= ord(str(len(self.players))): elif not self.answers.is_answered() and e.key() >= ord('1') and e.key() <= ord(str(len(self.players))):
player = self.players[e.key() - ord('1')] player = self.players[e.key() - ord('1')]
qawin = QuestionAnswerWindow(player, self) qawin = QuestionAnswerWindow(player, self)
res = qawin.exec_() res = qawin.exec_()
if res == QuestionAnswerWindow.CORRECT: if res == QuestionAnswerWindow.CORRECT:
print("Done!") print("Done!")
q = QuestionAnswer(self.section, self.qnumber, player, len(self.results)+1, True) self.answers.add_try(player, correct=True)
self.results.append(q)
self.accept() self.accept()
elif res == QuestionAnswerWindow.WRONG: elif res == QuestionAnswerWindow.WRONG:
q = QuestionAnswer(self.section, self.qnumber, player, len(self.results)+1, False) self.answers.add_try(player, correct=False)
self.results.append(q)
class QuestionAnswerWindow(QtGui.QDialog): class QuestionAnswerWindow(QtGui.QDialog):
CORRECT = 1 CORRECT = 1
@ -87,7 +87,6 @@ class QuestionAnswerWindow(QtGui.QDialog):
cPos = self.rect() cPos = self.rect()
self.move(g.width() - cPos.width(), g.height() - cPos.height()) self.move(g.width() - cPos.width(), g.height() - cPos.height())
def _setupGui(self): def _setupGui(self):
self.layout = QtGui.QVBoxLayout() self.layout = QtGui.QVBoxLayout()
@ -109,4 +108,3 @@ class QuestionAnswerWindow(QtGui.QDialog):
self.layout.addLayout(btnbox) self.layout.addLayout(btnbox)
self.setLayout(self.layout) self.setLayout(self.layout)