1
0

feat: insert logic into scoring to display on gui

This commit is contained in:
2026-06-04 20:18:02 +08:00
parent f72cf52d10
commit 9101cfeba1
+39 -7
View File
@@ -3,7 +3,7 @@ import sys
from datetime import datetime from datetime import datetime
from enum import Enum from enum import Enum
from PySide6.QtCore import QObject, Signal, Slot, Property, QEnum, QAbstractItemModel from PySide6.QtCore import QObject, Signal, Slot, Property, QEnum
from PySide6.QtGui import QGuiApplication from PySide6.QtGui import QGuiApplication
from PySide6.QtQml import QQmlApplicationEngine, QmlElement from PySide6.QtQml import QQmlApplicationEngine, QmlElement
from sqlalchemy import create_engine from sqlalchemy import create_engine
@@ -11,8 +11,8 @@ from sqlalchemy.orm import Session
from star_resonance_tracer.proto.enum_chit_chat_channel_type_pb2 import ChitChatChannelType from star_resonance_tracer.proto.enum_chit_chat_channel_type_pb2 import ChitChatChannelType
from inventory_wars.game import Game from inventory_wars.game import Game
from inventory_wars.models import Base from inventory_wars.models import Base, ItemShare
from inventory_wars.scoring import Scoring, FirstGuess, FirstThenHighest from inventory_wars.scoring import FirstGuess, FirstThenHighest
from inventory_wars.state import GameOngoing, GameIdle from inventory_wars.state import GameOngoing, GameIdle
QML_IMPORT_NAME = "InventoryWars" QML_IMPORT_NAME = "InventoryWars"
@@ -24,25 +24,57 @@ Base.metadata.create_all(engine)
session = Session(engine) session = Session(engine)
class FirstGuessGui(FirstGuess):
def __init__(self, game: GameService):
super().__init__()
self.game = game
def calculate_score(self, item: ItemShare) -> int:
result = super().calculate_score(item)
elapsed = self.game.elapsedSeconds
if result:
self.game.guessed.emit(item.user.username, elapsed)
self.game.end()
return result
class FirstThenHighestGui(FirstThenHighest):
def __init__(self, game: GameService):
super().__init__()
self.game = game
def calculate_score(self, item: ItemShare) -> int:
previous_max = self.highest.max
result = super().calculate_score(item)
elapsed = self.game.elapsedSeconds
if result:
self.game.guessed.emit(item.user.username, elapsed)
if previous_max is not self.highest.max:
self.game.highest.emit(item.user.username, elapsed)
return result
class GameScoring(Enum): class GameScoring(Enum):
FirstGuess = 0 FirstGuess = 0
FirstGuessThenHighestAmount = 1 FirstGuessThenHighestAmount = 1
@property @property
def as_scoring(self) -> type[Scoring]: def as_scoring(self) -> type[FirstGuessGui | FirstThenHighestGui]:
match self: match self:
case self.FirstGuess: case self.FirstGuess:
return FirstGuess return FirstGuessGui
case self.FirstGuessThenHighestAmount: case self.FirstGuessThenHighestAmount:
return FirstThenHighest return FirstThenHighestGui
case _: case _:
raise NotImplementedError raise NotImplementedError
class GameState(Enum): class GameState(Enum):
Hidden = 0 Hidden = 0
Revealed = 1 Revealed = 1
Ended = 3 Ended = 3
@QmlElement @QmlElement
class GameService(QObject): class GameService(QObject):
QEnum(GameScoring) QEnum(GameScoring)
@@ -62,7 +94,7 @@ class GameService(QObject):
@Slot(int, int) @Slot(int, int)
def start(self, item_id: int, mode: int): def start(self, item_id: int, mode: int):
mode = GameScoring(mode) mode = GameScoring(mode)
self.m_game.start(item_id, mode.as_scoring()) self.m_game.start(item_id, mode.as_scoring(self))
self.m_started_at = datetime.now() self.m_started_at = datetime.now()
self.m_revealed_at = None self.m_revealed_at = None
self.stateChanged.emit() self.stateChanged.emit()