|
|
@ -45,25 +45,78 @@ class Game:
|
|
|
|
mode = "easy"
|
|
|
|
mode = "easy"
|
|
|
|
|
|
|
|
|
|
|
|
def __init__(self, rules, mode="easy"):
|
|
|
|
def __init__(self, rules, mode="easy"):
|
|
|
|
|
|
|
|
modes = ["easy", "hard", "god"]
|
|
|
|
|
|
|
|
self.mode = mode.lower()
|
|
|
|
|
|
|
|
if mode.lower() not in modes:
|
|
|
|
|
|
|
|
raise ValueError("Invalid mode. Please choose from: " + ', '.join(modes))
|
|
|
|
self.rules = rules
|
|
|
|
self.rules = rules
|
|
|
|
self.choices = {key: 0 for key in self.rules}
|
|
|
|
self.choices = {key: 0 for key in self.rules}
|
|
|
|
self.mode = mode
|
|
|
|
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
|
|
|
|
return "bot: " + str(self.scores["bot"]) + " - player: " + str(self.scores["player"])
|
|
|
|
|
|
|
|
|
|
|
|
def reset(self):
|
|
|
|
def reset(self):
|
|
|
|
self.scores["player"] = 0
|
|
|
|
self.scores["player"] = 0
|
|
|
|
self.scores["player"] = 0
|
|
|
|
self.scores["bot"] = 0
|
|
|
|
|
|
|
|
self.choices = {key: 0 for key in self.rules}
|
|
|
|
|
|
|
|
|
|
|
|
def play(self, players_choice):
|
|
|
|
def match(self, games=5):
|
|
|
|
|
|
|
|
dist = 0
|
|
|
|
|
|
|
|
while sum(self.scores.values()) < games and dist < games / 2:
|
|
|
|
|
|
|
|
self.play()
|
|
|
|
|
|
|
|
dist = abs(self.scores["player"] - self.scores["bot"])
|
|
|
|
|
|
|
|
print("\n")
|
|
|
|
|
|
|
|
if self.scores["player"] > self.scores["bot"]:
|
|
|
|
|
|
|
|
print("The player wins.")
|
|
|
|
|
|
|
|
else:
|
|
|
|
|
|
|
|
print("The bot wins.")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def play(self):
|
|
|
|
|
|
|
|
players_choice = self._get_players_choice()
|
|
|
|
|
|
|
|
bots_choice = self._get_bots_choice(players_choice)
|
|
|
|
|
|
|
|
self.choices[players_choice] += 1
|
|
|
|
|
|
|
|
result = self.rules[players_choice][bots_choice]
|
|
|
|
|
|
|
|
if result > 0:
|
|
|
|
|
|
|
|
self.scores["player"] += 1
|
|
|
|
|
|
|
|
elif result < 0:
|
|
|
|
|
|
|
|
self.scores["bot"] += 1
|
|
|
|
|
|
|
|
print(self)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _get_players_choice(self):
|
|
|
|
|
|
|
|
players_choice = input("Enter your move (" + ', '.join(self.rules.keys()) + "): ")
|
|
|
|
if players_choice not in self.rules:
|
|
|
|
if players_choice not in self.rules:
|
|
|
|
raise ValueError("Invalid choice. Please choose from: " + ', '.join(self.rules.keys()))
|
|
|
|
raise ValueError("Invalid choice. Please choose from: " + ', '.join(self.rules.keys()))
|
|
|
|
|
|
|
|
return players_choice.lower()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _get_bots_choice(self, players_choice):
|
|
|
|
|
|
|
|
bots_choice = ""
|
|
|
|
|
|
|
|
if self.mode == "easy":
|
|
|
|
|
|
|
|
bots_choice = self._easy()
|
|
|
|
|
|
|
|
elif self.mode == "hard":
|
|
|
|
|
|
|
|
bots_choice = self._hard()
|
|
|
|
|
|
|
|
elif self.mode == "god":
|
|
|
|
|
|
|
|
bots_choice = self._god(players_choice)
|
|
|
|
|
|
|
|
print("The bot chooses " + bots_choice)
|
|
|
|
|
|
|
|
return bots_choice
|
|
|
|
|
|
|
|
|
|
|
|
def _god(self, players_choice):
|
|
|
|
def _god(self, players_choice):
|
|
|
|
for choice in self.rules:
|
|
|
|
for bots_choice in self.rules:
|
|
|
|
|
|
|
|
if self.rules[bots_choice][players_choice] == 1:
|
|
|
|
|
|
|
|
return bots_choice
|
|
|
|
|
|
|
|
|
|
|
|
def _easy(self, choice):
|
|
|
|
def _easy(self):
|
|
|
|
|
|
|
|
bots_choice = random.choice(list(self.choices.keys()))
|
|
|
|
|
|
|
|
return bots_choice
|
|
|
|
|
|
|
|
|
|
|
|
def _hard(self, choice):
|
|
|
|
def _hard(self):
|
|
|
|
|
|
|
|
total = sum(self.choices.values())
|
|
|
|
|
|
|
|
if total == 0:
|
|
|
|
|
|
|
|
return self._easy()
|
|
|
|
|
|
|
|
probabilities = {choice: self.choices[choice] / total for choice in self.choices}
|
|
|
|
|
|
|
|
likely = random.choices(list(probabilities.keys()), weights=list(probabilities.values()))[0]
|
|
|
|
|
|
|
|
for choice in self.rules[likely].keys():
|
|
|
|
|
|
|
|
if self.rules[likely][choice] < 0:
|
|
|
|
|
|
|
|
return choice
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
text = '''
|
|
|
|
text = '''
|
|
|
@ -96,5 +149,5 @@ rock_paper_scissor_lizard_spock = {
|
|
|
|
"spock": {"rock": 1, "paper": -1, "scissor": 1, "lizard": -1, "spock": 0}
|
|
|
|
"spock": {"rock": 1, "paper": -1, "scissor": 1, "lizard": -1, "spock": 0}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
game = Game(rock_paper_scissor)
|
|
|
|
# game = Game(rock_paper_scissor_lizard_spock, "hard")
|
|
|
|
print(game.choices)
|
|
|
|
# game.match(5)
|
|
|
|