-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathwordle_game.py
136 lines (111 loc) · 4.08 KB
/
wordle_game.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
import random
from typing import List, Dict
import discord
from discord.abc import GuildChannel
from discord.ext import commands
from discord.guild import Guild
from discord.user import User
from utils import WORDLEBANK
WORDS = WORDLEBANK
WORDS_SET = set(WORDS)
class WordleGame:
def __init__(self, host: User, guild_name: str, channel: str, word: str):
self.game_started = True
self.host = host
self.guild_name = guild_name
self.channel = channel
self.word = word
self.turns = 0
self.history = ""
self.letters = {
"open": list(map(chr, range(ord("A"), ord("Z") + 1))),
"good": [],
}
print(f"Game started by {host} in guild [{guild_name}] with word {word}.")
def process_guess(self, guess: str):
out_string = ""
letters_open = self.letters["open"]
letters_good = self.letters["good"]
# Make a pretty history first
for i in range(5):
out_string += f":regional_indicator_{guess[i].lower()}: "
out_string += "\n"
for i in range(5):
if guess[i] in letters_open:
letters_open.remove(guess[i])
if guess[i] == self.word[i]:
out_string += ":green_circle: "
if guess[i] not in letters_good:
letters_good.append(guess[i])
elif guess[i] in self.word:
out_string += ":yellow_circle: "
if guess[i] not in letters_good:
letters_good.append(guess[i])
else:
out_string += ":black_circle: "
out_string += "\n"
self.history += out_string
self.turns += 1
if guess == self.word:
return (1, f"You won in {self.turns} turns!") # win
if self.turns == 6:
return (-1, f"You lost! The word was {self.word}.") # loss
return (
0,
f"You still have {6-self.turns} "
+ ("turn" if self.turns == 5 else "turns")
+ " left!",
)
def getWord(self):
return self.word
def getHistory(self):
if self.history == "":
return "No guesses."
return self.history
def getLetters(self):
return self.letters
class Party:
def __init__(self, host: User, guild_name: str, base_channel: GuildChannel):
self.host = host
self.guild_name = guild_name
self.base_channel = base_channel
self.members = []
self.magic = f"{host.name}'s party in [{guild_name}]"
self.games = dict()
self.channels = dict()
self.open = True
def getMembers(self) -> List[User]:
return self.members
def addMember(self, member: User):
if self.open:
print(f"{member.name} has joined {self.magic}.")
self.members.append(member)
def removeMember(self, member: User):
if self.open:
print(f"{member.name} has left {self.magic}.")
self.members.remove(member)
def closeParty(self):
print(f"{self.magic} has closed.")
self.open = False
def isPartyOpen(self) -> bool:
return self.open
def getGame(self, member: User) -> WordleGame:
return self.games[member] if member in self.games else None
def deleteGame(self, member: User):
del self.games[member]
def allGamesDone(self):
return not self.games
def addGame(self, game: WordleGame, member: User) -> bool:
if member in self.members and member not in self.games:
self.games[member] = game
print(f"{self.magic} has added a game for {member.name}.")
return True
return False
def getChannels(self) -> Dict[User, GuildChannel]:
return self.channels
def addChannel(self, member: User, channel: GuildChannel) -> bool:
if member in self.members and member not in self.channels:
self.channels[member] = channel
print(f"{self.magic} has added channel [{channel.name}] for {member.name}.")
return True
return False