Pyscript version ready to play

This commit is contained in:
Mr Finchum 2025-03-17 00:19:59 +01:00
parent 39feffd9d5
commit 8d2b52160a
3 changed files with 156 additions and 78 deletions

44
src/index.html Normal file
View file

@ -0,0 +1,44 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Rock Paper Scissors Card Game</title>
<link
rel="stylesheet"
href="https://pyscript.net/releases/2025.3.1/core.css"
/>
<script
type="module"
src="https://pyscript.net/releases/2025.3.1/core.js"
></script>
</head>
<body>
<h1>Rock Paper Scissors Card Game</h1>
<p>
Play Rock Paper Scissors with a twist! Use a 52-card deck with an
uneven distribution of cards. Both you and the AI get three cards,
and the AI selects randomly. The rules follow the classic game, but
with an added element of chance!
</p>
<p>Select a card to play against the AI! Best out of 5 game mode.</p>
<h3>Score</h3>
<p>
You: <span id="user-score">0</span> - AI:
<span id="ai-score">0</span>
</p>
<h3 id="result">Waiting for your move...</h3>
<div id="card-buttons">
<button id="card-0" index="0" py-click="game.play_card">?</button>
<button id="card-1" index="1" py-click="game.play_card">?</button>
<button id="card-2" index="2" py-click="game.play_card">?</button>
</div>
<p></p>
<button id="reset-game" py-click="game.reset_game">Reset Game</button>
<script type="py" src="./main.py"></script>
</body>
</html>

View file

@ -1,22 +1,17 @@
import random import random
from pyscript import document
def rock(lst, n): class RPSGame:
for _ in range(n): def __init__(self, best_of = 3):
lst.append("Rock") self.user_score = 0
return lst 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 paper(lst, n): def build_deck(self):
for _ in range(n): cards = [self.rock, self.paper, self.scissors]
lst.append("Paper")
return lst
def scissors(lst, n):
for _ in range(n):
lst.append("Scissors")
return lst
def build_deck():
cards = [rock, paper, scissors]
deck = [] deck = []
random.shuffle(cards) random.shuffle(cards)
@ -29,12 +24,22 @@ def build_deck():
random.shuffle(deck) random.shuffle(deck)
return deck return deck
def give_cards(deck): def rock(self, lst, n):
"""Give 3 cards to both player and AI, removing them from the deck.""" lst.extend(["Rock"] * n)
return [deck.pop(0) for _ in range(3)], [deck.pop(0) for _ in range(3)] return lst
def battle(user_card, ai_card): def paper(self, lst, n):
"""Returns 1 if user wins, -1 if AI wins, 0 for a tie.""" 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: if user_card == ai_card:
return 0 return 0
if (user_card == "Rock" and ai_card == "Scissors") or \ if (user_card == "Rock" and ai_card == "Scissors") or \
@ -43,61 +48,89 @@ def battle(user_card, ai_card):
return 1 return 1
return -1 return -1
def play_cards(user_hand, ai_hand): def refresh_hand(self):
"""Handles playing cards until a winner is determined or cards run out.""" self.user_hand, self.ai_hand = self.give_cards()
while user_hand and ai_hand: # Keep playing until hands are empty print("New cards")
print(f"\nYour cards: {user_hand}") print(f"AI cards: {self.ai_hand}")
while True: def play_card(self, event):
try: index = int(event.target.getAttribute("index"))
user_choice = int(input(f"Select a card (1-{len(user_hand)}): ")) - 1 #print(f"Button {index} clicked!") # Debugging
if 0 <= user_choice < len(user_hand): if index >= len(self.user_hand):
break return
except ValueError:
pass
print("Invalid choice. Try again.")
user_card = user_hand.pop(user_choice) user_card = self.user_hand.pop(index)
ai_choice = random.randint(0, len(ai_hand) - 1) ai_card = self.ai_hand.pop(random.randint(0, len(self.ai_hand) - 1))
ai_card = ai_hand.pop(ai_choice)
print(f"You played: {user_card}, AI played: {ai_card}") result = self.battle(user_card, ai_card)
result = battle(user_card, ai_card)
if result == 1: if result == 1:
print("You win this round!") self.user_score += 1
return 1 # User wins round_result = f"You win! {user_card} beats {ai_card}."
self.refresh_hand()
elif result == -1: elif result == -1:
print("AI wins this round!") self.ai_score += 1
return -1 # AI wins round_result = f"AI wins! {ai_card} beats {user_card}."
self.refresh_hand()
else: else:
print("It's a tie! Play again with remaining cards.") round_result = "It's a tie! Try again"
print("No cards left, this round is a draw.") if not self.user_hand or not self.ai_hand:
return 0 # Round is a draw self.refresh_hand()
if self.user_score < self.rounds_to_win and self.ai_score < self.rounds_to_win:
def play_game(best_of = 3): pass
"""Main game loop."""
my_deck = build_deck()
user_score, ai_score = 0, 0
rounds_to_win = (best_of // 2) + 1
while user_score < rounds_to_win and ai_score < rounds_to_win and len(my_deck) >= 6:
user_hand, ai_hand = give_cards(my_deck)
round_result = play_cards(user_hand, ai_hand)
if round_result == 1:
user_score += 1
elif round_result == -1:
ai_score += 1
print(f"Score - You: {user_score}, AI: {ai_score}")
if user_score > ai_score:
print("\n🎉 You won the match!")
else: else:
print("\n🤖 AI won the match!") 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
# Run the game self.update_ui(round_result)
play_game(best_of = 5)
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()

1
src/pyscript.toml Normal file
View file

@ -0,0 +1 @@
name = "Rock Paper Scissors"