|
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 |
|