2025-03-16 22:14:32 +01:00
|
|
|
import random
|
2025-03-16 23:22:14 +00:00
|
|
|
from pyscript import document
|
|
|
|
|
|
|
|
class RPSGame:
|
|
|
|
def __init__(self, best_of = 3):
|
|
|
|
self.user_score = 0
|
|
|
|
self.ai_score = 0
|
|
|
|
self.deck = self.build_deck()
|
|
|
|
self.user_hand, self.ai_hand = self.give_cards()
|
|
|
|
self.rounds_to_win = (best_of // 2) + 1
|
|
|
|
self.update_ui()
|
|
|
|
|
|
|
|
def build_deck(self):
|
|
|
|
cards = [self.rock, self.paper, self.scissors]
|
|
|
|
deck = []
|
|
|
|
|
|
|
|
random.shuffle(cards)
|
|
|
|
for i in range(2):
|
|
|
|
n = random.randint(5, 20)
|
|
|
|
deck = cards[i](deck, n)
|
|
|
|
|
|
|
|
missing_cards = 52 - len(deck)
|
|
|
|
deck = cards[2](deck, missing_cards)
|
|
|
|
random.shuffle(deck)
|
|
|
|
return deck
|
|
|
|
|
|
|
|
def rock(self, lst, n):
|
|
|
|
lst.extend(["Rock"] * n)
|
|
|
|
return lst
|
|
|
|
|
|
|
|
def paper(self, lst, n):
|
|
|
|
lst.extend(["Paper"] * n)
|
|
|
|
return lst
|
|
|
|
|
|
|
|
def scissors(self, lst, n):
|
|
|
|
lst.extend(["Scissors"] * n)
|
|
|
|
return lst
|
|
|
|
|
|
|
|
def give_cards(self):
|
|
|
|
return [self.deck.pop(0) for _ in range(3)], [self.deck.pop(0) for _ in range(3)]
|
|
|
|
|
|
|
|
def battle(self, user_card, ai_card):
|
|
|
|
if user_card == ai_card:
|
|
|
|
return 0
|
|
|
|
if (user_card == "Rock" and ai_card == "Scissors") or \
|
|
|
|
(user_card == "Paper" and ai_card == "Rock") or \
|
|
|
|
(user_card == "Scissors" and ai_card == "Paper"):
|
|
|
|
return 1
|
|
|
|
return -1
|
|
|
|
|
|
|
|
def refresh_hand(self):
|
|
|
|
self.user_hand, self.ai_hand = self.give_cards()
|
|
|
|
print("New cards")
|
|
|
|
print(f"AI cards: {self.ai_hand}")
|
|
|
|
|
|
|
|
def play_card(self, event):
|
|
|
|
index = int(event.target.getAttribute("index"))
|
|
|
|
#print(f"Button {index} clicked!") # Debugging
|
|
|
|
if index >= len(self.user_hand):
|
|
|
|
return
|
|
|
|
|
|
|
|
user_card = self.user_hand.pop(index)
|
|
|
|
ai_card = self.ai_hand.pop(random.randint(0, len(self.ai_hand) - 1))
|
|
|
|
|
|
|
|
result = self.battle(user_card, ai_card)
|
2025-03-16 22:14:32 +01:00
|
|
|
if result == 1:
|
2025-03-16 23:22:14 +00:00
|
|
|
self.user_score += 1
|
|
|
|
round_result = f"You win! {user_card} beats {ai_card}."
|
|
|
|
self.refresh_hand()
|
2025-03-16 22:14:32 +01:00
|
|
|
elif result == -1:
|
2025-03-16 23:22:14 +00:00
|
|
|
self.ai_score += 1
|
|
|
|
round_result = f"AI wins! {ai_card} beats {user_card}."
|
|
|
|
self.refresh_hand()
|
2025-03-16 22:14:32 +01:00
|
|
|
else:
|
2025-03-16 23:22:14 +00:00
|
|
|
round_result = "It's a tie! Try again"
|
2025-03-16 22:14:32 +01:00
|
|
|
|
2025-03-16 23:22:14 +00:00
|
|
|
if not self.user_hand or not self.ai_hand:
|
|
|
|
self.refresh_hand()
|
|
|
|
if self.user_score < self.rounds_to_win and self.ai_score < self.rounds_to_win:
|
|
|
|
pass
|
|
|
|
else:
|
|
|
|
if self.user_score < self.ai_score:
|
|
|
|
round_result = "You lost noob D:"
|
|
|
|
self.update_ui(round_result)
|
|
|
|
self.disable_buttons()
|
|
|
|
#self.reset_game()
|
|
|
|
return
|
|
|
|
else:
|
|
|
|
round_result = "You won great :D"
|
|
|
|
self.update_ui(round_result)
|
|
|
|
self.disable_buttons()
|
|
|
|
#self.reset_game()
|
|
|
|
return
|
|
|
|
|
|
|
|
self.update_ui(round_result)
|
|
|
|
|
|
|
|
def update_ui(self, result_text="Waiting for your move..."):
|
|
|
|
print("Update UI")
|
|
|
|
document.querySelector("#user-score").innerText = str(self.user_score)
|
|
|
|
document.querySelector("#ai-score").innerText = str(self.ai_score)
|
|
|
|
document.querySelector("#result").innerText = result_text
|
|
|
|
document.querySelector("#reset-game").disabled = False
|
|
|
|
for i in range(3):
|
|
|
|
btn = document.querySelector(f"#card-{i}")
|
|
|
|
if i < len(self.user_hand):
|
|
|
|
btn.innerText = self.user_hand[i]
|
|
|
|
btn.disabled = False
|
|
|
|
else:
|
|
|
|
btn.innerText = "?"
|
|
|
|
btn.disabled = True
|
|
|
|
|
|
|
|
def disable_buttons(self):
|
|
|
|
for i in range(3):
|
|
|
|
btn = document.querySelector(f"#card-{i}")
|
|
|
|
btn.innerText = "?"
|
|
|
|
btn.disabled = True
|
|
|
|
|
|
|
|
def reset_game(self, event=None):
|
|
|
|
print("Game Reset")
|
|
|
|
self.user_score = 0
|
|
|
|
self.ai_score = 0
|
|
|
|
self.deck = self.build_deck()
|
|
|
|
self.user_hand, self.ai_hand = self.give_cards()
|
|
|
|
self.deck_overview()
|
|
|
|
self.update_ui("Game reset! Pick a card to start.")
|
|
|
|
|
|
|
|
|
|
|
|
def deck_overview(self):
|
|
|
|
#print(f"{len(self.deck)} Cards left")
|
|
|
|
print(f"{self.deck.count('Rock')} Rock cards")
|
|
|
|
print(f"{self.deck.count('Paper')} Paper cards")
|
|
|
|
print(f"{self.deck.count('Scissors')} Scissors cards")
|
|
|
|
|
|
|
|
# Start the game
|
|
|
|
game = RPSGame(5)
|
|
|
|
game.deck_overview()
|