Blame game.py

Ivan Mahonin 3c1a85
Ivan Mahonin 3c1a85
import config
Ivan Mahonin 3c1a85
Ivan Mahonin 3c1a85
import os
Ivan Mahonin 3c1a85
import uuid
Ivan Mahonin 3c1a85
import random
Ivan Mahonin 3c1a85
Ivan Mahonin 3c1a85
Ivan Mahonin 3c1a85
class Player:
Ivan Mahonin 3c1a85
    def __init__(self, game, name):
Ivan Mahonin 3c1a85
        self.game = game
Ivan Mahonin 3c1a85
        self.name = name
Ivan Mahonin 3c1a85
        self.id = str(uuid.uuid4())
Ivan Mahonin 33a545
        self.joined = False
Ivan Mahonin 33a545
        self.word = ""
Ivan Mahonin 50846a
        self.wordused = False
Ivan Mahonin 33a545
        self.ready = False
Ivan Mahonin 33a545
        self.selection = -1
Ivan Mahonin e935b2
        self.shuffle = []
Ivan Mahonin e935b2
        self.shuffleinv = []
Ivan Mahonin 3c1a85
        players[self.id] = self
Ivan Mahonin 3c1a85
Ivan Mahonin 3c1a85
    def beginturn(self):
Ivan Mahonin 50846a
        self.wordused = self.word and self.word == self.game.word
Ivan Mahonin 3c1a85
        self.ready = False
Ivan Mahonin 3c1a85
        self.selection = -1
Ivan Mahonin e935b2
        self.shuffle = list(range( len(self.game.cards) - 1)) # do not shuffle the last card (the skip turn card)
Ivan Mahonin e935b2
        random.shuffle(self.shuffle)
Ivan Mahonin e935b2
        self.shuffleinv = list(range(len(self.shuffle)))
Ivan Mahonin e935b2
        for i in range(len(self.shuffle)):
Ivan Mahonin e935b2
            self.shuffleinv[self.shuffle[i]] = i;
Ivan Mahonin e935b2
Ivan Mahonin e935b2
    def realindex(self, index):
Ivan Mahonin e935b2
        return self.shuffle[index] if index >= 0 and index < len(self.shuffle) else index
Ivan Mahonin e935b2
    def virtualindex(self, index):
Ivan Mahonin e935b2
        return self.shuffleinv[index] if index >= 0 and index < len(self.shuffleinv) else index
Ivan Mahonin e935b2
    def realselection(self):
Ivan Mahonin e935b2
        return self.realindex(self.selection)
Ivan Mahonin 3c1a85
Ivan Mahonin 33a545
    def join(self, word):
Ivan Mahonin 33a545
        if not self.joined:
Ivan Mahonin 33a545
            del players[self.id]
Ivan Mahonin 33a545
            self.id = str(uuid.uuid4())
Ivan Mahonin 33a545
            players[self.id] = self
Ivan Mahonin 400611
            self.word = " ".join(str(word).split()) # replace all whitespace character sequences to single space
Ivan Mahonin 33a545
            self.joined = True
Ivan Mahonin 33a545
            self.game.playerJoin()
Ivan Mahonin 33a545
Ivan Mahonin 3c1a85
    def select(self, i):
Ivan Mahonin 3c1a85
        if self.selection < 0 and i >= 0 and i < len(self.game.cards):
Ivan Mahonin 3c1a85
            self.selection = i
Ivan Mahonin 3c1a85
            self.game.playerSelect()
Ivan Mahonin 3c1a85
Ivan Mahonin 3c1a85
    def nextturn(self, word):
Ivan Mahonin 3c1a85
        if self.game.selected and not self.ready:
Ivan Mahonin 3c1a85
            self.word = str(word).strip()
Ivan Mahonin 3c1a85
            self.ready = True
Ivan Mahonin 3c1a85
            self.game.playerReady()
Ivan Mahonin 3c1a85
Ivan Mahonin 3c1a85
    def status(self):
Ivan Mahonin 3c1a85
        friend = self.game.players[1] if self.game.players[0] == self else self.game.players[0]
Ivan Mahonin 33a545
        friendId = None if friend.joined else friend.id
Ivan Mahonin e935b2
        friendSelection = self.virtualindex( friend.realselection() if self.game.selected else -1 )
Ivan Mahonin dc845c
Ivan Mahonin dc845c
        percent = None
Ivan Mahonin dc845c
        turns = self.game.turn - self.game.skips
Ivan Mahonin dc845c
        if not self.game.selected: turns -= 1
Ivan Mahonin dc845c
        if turns:
Ivan Mahonin dc845c
            percent = round(self.game.score/turns*100, 2)
Ivan Mahonin dc845c
Ivan Mahonin 3c1a85
        cards = []
Ivan Mahonin 3c1a85
        for i in range(0, len(self.game.cards)):
Ivan Mahonin e935b2
            cards.append({ "index": i, "name": self.game.cards[self.realindex(i)], "my": self.selection == i, "friends": friendSelection == i })
Ivan Mahonin dc845c
Ivan Mahonin 3c1a85
        return {
Ivan Mahonin 9ae076
            "vocabulary": self.game.vocabulary,
Ivan Mahonin 3c1a85
            "turn": self.game.turn,
Ivan Mahonin dc845c
            "skips": self.game.skips,
Ivan Mahonin 3c1a85
            "score": self.game.score,
Ivan Mahonin dc845c
            "turns": turns,
Ivan Mahonin dc845c
            "percent": percent,
Ivan Mahonin 3c1a85
            "word": self.game.word,
Ivan Mahonin 3c1a85
            "wordSource": self.game.wordSource,
Ivan Mahonin 3c1a85
            "cards": cards,
Ivan Mahonin 33a545
            "started": self.game.started,
Ivan Mahonin 3c1a85
            "selected": self.game.selected,
Ivan Mahonin 3c1a85
            "host": config.externalHost,
Ivan Mahonin 3c1a85
            "prefix": config.prefix,
Ivan Mahonin 3c1a85
            "cardsPrefix": config.cardsPrefix,
Ivan Mahonin 33a545
            "waiting": (self.joined and not self.game.started) or (self.selection >= 0 and not self.game.selected) or self.ready,
Ivan Mahonin dc845c
            "lose": self.game.turnResult == 1,
Ivan Mahonin dc845c
            "win": self.game.turnResult == 2,
Ivan Mahonin dc845c
            "skipped": self.game.turnResult == 3,
Ivan Mahonin 3c1a85
            "me": {
Ivan Mahonin 3c1a85
                "id": self.id,
Ivan Mahonin 3c1a85
                "name": self.name,
Ivan Mahonin 400611
                "word": self.word,
Ivan Mahonin 50846a
                "wordused": self.wordused,
Ivan Mahonin 3c1a85
                "selection": self.selection,
Ivan Mahonin 3c1a85
                "selected": self.selection >= 0,
Ivan Mahonin 3c1a85
                "ready": self.ready },
Ivan Mahonin 3c1a85
            "friend": {
Ivan Mahonin 3c1a85
                "id": friendId,
Ivan Mahonin 3c1a85
                "selection": friendSelection } }
Ivan Mahonin 3c1a85
Ivan Mahonin 3c1a85
Ivan Mahonin 3c1a85
class Game:
Ivan Mahonin 9ae076
    def __init__(self, vocabulary, word):
Ivan Mahonin 9ae076
        self.vocabulary = vocabulary
Ivan Mahonin 9ae076
        self.words = words.get(vocabulary, ["no words for choose, sorry..."])
Ivan Mahonin 3c1a85
        self.players = ( Player(self, "Player1"), Player(self, "Player2") )
Ivan Mahonin 3c1a85
        self.turn = 1
Ivan Mahonin 3c1a85
        self.score = 0
Ivan Mahonin dc845c
        self.skips = 0
Ivan Mahonin 33a545
        self.started = False
Ivan Mahonin 33a545
        self.selected = False
Ivan Mahonin dc845c
        self.turnResult = 0
Ivan Mahonin 3c1a85
        self.cards = []
Ivan Mahonin 33a545
        self.word = ""
Ivan Mahonin 33a545
        self.wordSource = ""
Ivan Mahonin 33a545
        self.players[0].join(word)
Ivan Mahonin 3c1a85
Ivan Mahonin 3c1a85
    def beginturn(self):
Ivan Mahonin 3c1a85
        assert(cards)
Ivan Mahonin 3c1a85
        self.cards.clear()
Ivan Mahonin 3c1a85
        for i in range(0, config.cardsCount):
Ivan Mahonin 3c1a85
            for j in range(0, 100):
Ivan Mahonin 3c1a85
                card = cards[ random.randrange(0, len(cards)) ]
Ivan Mahonin 3c1a85
                if not card in self.cards:
Ivan Mahonin 3c1a85
                    self.cards.append(card)
Ivan Mahonin 3c1a85
                    break
Ivan Mahonin c463bf
        self.cards.append(skipname)
Ivan Mahonin 3c1a85
        w0 = self.players[0].word
Ivan Mahonin 3c1a85
        w1 = self.players[1].word
Ivan Mahonin 50846a
        w0u = self.players[0].wordused
Ivan Mahonin 50846a
        w1u = self.players[1].wordused
Ivan Mahonin 3c1a85
        if not w0 and not w1:
Ivan Mahonin 9ae076
            self.word = random.choice(self.words)
Ivan Mahonin 3c1a85
            self.wordSource = "choosen by random"
Ivan Mahonin 3c1a85
        elif not w1:
Ivan Mahonin 3c1a85
            self.word = w0
Ivan Mahonin 3c1a85
            self.wordSource = "suggested by player1"
Ivan Mahonin 3c1a85
        elif not w0:
Ivan Mahonin 3c1a85
            self.word = w1
Ivan Mahonin 3c1a85
            self.wordSource = "suggested by player2"
Ivan Mahonin 3c1a85
        elif w0 == w1:
Ivan Mahonin 3c1a85
            self.word = w0
Ivan Mahonin 3c1a85
            self.wordSource = "suggested by both players"
Ivan Mahonin 50846a
        elif w0u < w1u or (w0u == w1u and random.randrange(2)):
Ivan Mahonin 3c1a85
            self.word = w0
Ivan Mahonin 3c1a85
            self.wordSource = "suggested by player1 (player2 may be lucky next time)"
Ivan Mahonin 3c1a85
        else:
Ivan Mahonin 3c1a85
            self.word = w1
Ivan Mahonin 3c1a85
            self.wordSource = "suggested by player2 (player1 may be lucky next time)"
Ivan Mahonin dc845c
        self.turnResult = 0
Ivan Mahonin 3c1a85
        self.selected = False
Ivan Mahonin 50846a
        for p in self.players:
Ivan Mahonin 50846a
            p.beginturn()
Ivan Mahonin 3c1a85
Ivan Mahonin 33a545
    def playerJoin(self):
Ivan Mahonin 33a545
        if not self.started and all(p.joined for p in self.players):
Ivan Mahonin 33a545
            self.started = True
Ivan Mahonin 33a545
            self.beginturn()
Ivan Mahonin 33a545
Ivan Mahonin 3c1a85
    def playerSelect(self):
Ivan Mahonin 33a545
        if self.started and not self.selected and all(p.selection >= 0 for p in self.players):
Ivan Mahonin 3c1a85
            self.selected = True
Ivan Mahonin dc845c
            self.turnResult = 1
Ivan Mahonin e935b2
            if any(p.realselection() == len(self.cards) - 1 for p in self.players):
Ivan Mahonin dc845c
                self.skips += 1
Ivan Mahonin dc845c
                self.turnResult = 3
Ivan Mahonin e935b2
            elif self.players[0].realselection() == self.players[1].realselection():
Ivan Mahonin dc845c
                self.score += 1
Ivan Mahonin dc845c
                self.turnResult = 2
Ivan Mahonin dc845c
            else:
Ivan Mahonin dc845c
                self.turnResult = 1
Ivan Mahonin 400611
            if self.turnResult != 3:
Ivan Mahonin 400611
                for p in self.players:
Ivan Mahonin 400611
                    if p.word == self.word:
Ivan Mahonin 400611
                        p.word = ""
Ivan Mahonin 3c1a85
Ivan Mahonin 3c1a85
    def playerReady(self):
Ivan Mahonin 33a545
        if self.started and self.selected and all(p.ready for p in self.players):
Ivan Mahonin 3c1a85
            self.turn = self.turn + 1
Ivan Mahonin 3c1a85
            self.beginturn()
Ivan Mahonin 3c1a85
Ivan Mahonin 3c1a85
Ivan Mahonin 3c1a85
def mergeCards(path):
Ivan Mahonin 3c1a85
    for f in os.scandir(path):
Ivan Mahonin 9ae076
        if f.is_file() and f.name.endswith(".jpg") and f.name != skipname:
Ivan Mahonin 3c1a85
            cards.append(f.name)
Ivan Mahonin 3c1a85
Ivan Mahonin 3c1a85
def mergeWords(path):
Ivan Mahonin 9ae076
    for f in os.scandir(path):
Ivan Mahonin 9ae076
        if f.is_file() and f.name.endswith(".txt"):
Ivan Mahonin 9ae076
            n = f.name[:-4]
Ivan Mahonin 9ae076
            ws = set(words.get(n, []))
Ivan Mahonin 9ae076
            with open(path + "/" + f.name, "r") as ff:
Ivan Mahonin 9ae076
                for word in ff.readlines():
Ivan Mahonin 9ae076
                    w = word.strip()
Ivan Mahonin 9ae076
                    if w != "":
Ivan Mahonin 9ae076
                        ws.add(w)
Ivan Mahonin 9ae076
            if ws:
Ivan Mahonin 9ae076
                if not n in words:
Ivan Mahonin 9ae076
                    words[n] = []
Ivan Mahonin 9ae076
                words[n].clear()
Ivan Mahonin 9ae076
                words[n] += ws
Ivan Mahonin 9ae076
Ivan Mahonin 9ae076
skipname = "skip.jpg"
Ivan Mahonin 3c1a85
players = {}
Ivan Mahonin 3c1a85
cards = []
Ivan Mahonin 9ae076
words = {}
Ivan Mahonin 3c1a85