From 39feffd9d58447f2eb4f0252526ecc25dc063445 Mon Sep 17 00:00:00 2001 From: CodeByMrFinchum Date: Mon, 17 Mar 2025 00:19:32 +0100 Subject: [PATCH 1/3] Prior main, now local --- src/local.py | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 src/local.py diff --git a/src/local.py b/src/local.py new file mode 100644 index 0000000..b6942fb --- /dev/null +++ b/src/local.py @@ -0,0 +1,98 @@ +import random + +class RPSGame: + def __init__(self, best_of = 3): + self.deck = self.build_deck() + self.user_score = 0 + self.ai_score = 0 + self.rounds_to_win = (best_of // 2) + 1 + + 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 play_cards(self, user_hand, ai_hand): + while user_hand and ai_hand: + print(f"\nYour cards: {user_hand}") + + while True: + try: + user_choice = int(input(f"Select a card (1-{len(user_hand)}): ")) - 1 + if 0 <= user_choice < len(user_hand): + break + except ValueError: + pass + print("Invalid choice. Try again.") + + user_card = user_hand.pop(user_choice) + ai_card = ai_hand.pop(random.randint(0, len(ai_hand) - 1)) + + print(f"You played: {user_card}, AI played: {ai_card}") + + result = self.battle(user_card, ai_card) + if result == 1: + print("You win this round!") + return 1 + elif result == -1: + print("AI wins this round!") + return -1 + else: + print("It's a tie! Play again with remaining cards.") + + print("No cards left, this round is a draw.") + return 0 + + def play_game(self): + while self.user_score < self.rounds_to_win and self.ai_score < self.rounds_to_win and len(self.deck) >= 6: + user_hand, ai_hand = self.give_cards() + round_result = self.play_cards(user_hand, ai_hand) + + if round_result == 1: + self.user_score += 1 + elif round_result == -1: + self.ai_score += 1 + + print(f"Score - You: {self.user_score}, AI: {self.ai_score}") + + if self.user_score > self.ai_score: + print("\nšŸŽ‰ You won the match!") + else: + print("\nšŸ¤– AI won the match!") + +if __name__ == "__main__": + game = RPSGame(best_of = 3) + game.play_game() From 8d2b52160a5b55a40a47e1223f9a1addeb7f3306 Mon Sep 17 00:00:00 2001 From: CodeByMrFinchum Date: Mon, 17 Mar 2025 00:19:59 +0100 Subject: [PATCH 2/3] Pyscript version ready to play --- src/index.html | 44 +++++++++++ src/main.py | 189 +++++++++++++++++++++++++++------------------- src/pyscript.toml | 1 + 3 files changed, 156 insertions(+), 78 deletions(-) create mode 100644 src/index.html create mode 100644 src/pyscript.toml diff --git a/src/index.html b/src/index.html new file mode 100644 index 0000000..45b4a23 --- /dev/null +++ b/src/index.html @@ -0,0 +1,44 @@ + + + + + + Rock Paper Scissors Card Game + + + + +

Rock Paper Scissors Card Game

+

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

+

Select a card to play against the AI! Best out of 5 game mode.

+ +

Score

+

+ You: 0 - AI: + 0 +

+ +

Waiting for your move...

+ +
+ + + +
+

+ + + + + diff --git a/src/main.py b/src/main.py index ba02a17..75450b3 100644 --- a/src/main.py +++ b/src/main.py @@ -1,103 +1,136 @@ import random +from pyscript import document -def rock(lst, n): - for _ in range(n): - lst.append("Rock") - return lst +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 paper(lst, n): - for _ in range(n): - lst.append("Paper") - return lst + def build_deck(self): + cards = [self.rock, self.paper, self.scissors] + deck = [] -def scissors(lst, n): - for _ in range(n): - lst.append("Scissors") - return lst + random.shuffle(cards) + for i in range(2): + n = random.randint(5, 20) + deck = cards[i](deck, n) -def build_deck(): - cards = [rock, paper, scissors] - deck = [] + missing_cards = 52 - len(deck) + deck = cards[2](deck, missing_cards) + random.shuffle(deck) + return deck - random.shuffle(cards) - for i in range(2): - n = random.randint(5, 20) - deck = cards[i](deck, n) + def rock(self, lst, n): + lst.extend(["Rock"] * n) + return lst - missing_cards = 52 - len(deck) - deck = cards[2](deck, missing_cards) - random.shuffle(deck) - return deck + def paper(self, lst, n): + lst.extend(["Paper"] * n) + return lst -def give_cards(deck): - """Give 3 cards to both player and AI, removing them from the deck.""" - return [deck.pop(0) for _ in range(3)], [deck.pop(0) for _ in range(3)] + def scissors(self, lst, n): + lst.extend(["Scissors"] * n) + return lst -def battle(user_card, ai_card): - """Returns 1 if user wins, -1 if AI wins, 0 for a tie.""" - 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 give_cards(self): + return [self.deck.pop(0) for _ in range(3)], [self.deck.pop(0) for _ in range(3)] -def play_cards(user_hand, ai_hand): - """Handles playing cards until a winner is determined or cards run out.""" - while user_hand and ai_hand: # Keep playing until hands are empty - print(f"\nYour cards: {user_hand}") + 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 - while True: - try: - user_choice = int(input(f"Select a card (1-{len(user_hand)}): ")) - 1 - if 0 <= user_choice < len(user_hand): - break - except ValueError: - pass - print("Invalid choice. Try again.") + def refresh_hand(self): + self.user_hand, self.ai_hand = self.give_cards() + print("New cards") + print(f"AI cards: {self.ai_hand}") - user_card = user_hand.pop(user_choice) - ai_choice = random.randint(0, len(ai_hand) - 1) - ai_card = ai_hand.pop(ai_choice) + def play_card(self, event): + index = int(event.target.getAttribute("index")) + #print(f"Button {index} clicked!") # Debugging + if index >= len(self.user_hand): + return - print(f"You played: {user_card}, AI played: {ai_card}") + user_card = self.user_hand.pop(index) + ai_card = self.ai_hand.pop(random.randint(0, len(self.ai_hand) - 1)) - result = battle(user_card, ai_card) + result = self.battle(user_card, ai_card) if result == 1: - print("You win this round!") - return 1 # User wins + self.user_score += 1 + round_result = f"You win! {user_card} beats {ai_card}." + self.refresh_hand() elif result == -1: - print("AI wins this round!") - return -1 # AI wins + self.ai_score += 1 + round_result = f"AI wins! {ai_card} beats {user_card}." + self.refresh_hand() 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.") - return 0 # Round is a draw + 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 -def play_game(best_of = 3): - """Main game loop.""" - my_deck = build_deck() - user_score, ai_score = 0, 0 - rounds_to_win = (best_of // 2) + 1 + self.update_ui(round_result) - 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) + 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 - round_result = play_cards(user_hand, ai_hand) + def disable_buttons(self): + for i in range(3): + btn = document.querySelector(f"#card-{i}") + btn.innerText = "?" + btn.disabled = True - if round_result == 1: - user_score += 1 - elif round_result == -1: - ai_score += 1 + 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.") - print(f"Score - You: {user_score}, AI: {ai_score}") - if user_score > ai_score: - print("\nšŸŽ‰ You won the match!") - else: - print("\nšŸ¤– AI won the match!") + 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") -# Run the game -play_game(best_of = 5) +# Start the game +game = RPSGame(5) +game.deck_overview() diff --git a/src/pyscript.toml b/src/pyscript.toml new file mode 100644 index 0000000..0decc8d --- /dev/null +++ b/src/pyscript.toml @@ -0,0 +1 @@ +name = "Rock Paper Scissors" From c3ef741c3578e1c72d19d4d54fbe9e1bcf9ac500 Mon Sep 17 00:00:00 2001 From: CodeByMrFinchum Date: Mon, 17 Mar 2025 00:21:12 +0100 Subject: [PATCH 3/3] Updated to include info about pyscript --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index fa36c24..db4c8d7 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,9 @@ # Rock Paper Scissors Card Game +Play [now](https://codebymrfinchum.pyscriptapps.com/rock-paper-scissors-card-game/latest/). A little game to play the classic Rock Paper Scissors game with a twist. Instead of freely selecting between Rock, Paper, and Scissors, you get a hand of three cards, potentially with only rocks. It is a semi-random 52-card deck with an unbalanced distribution of cards, meaning some cards are less likely to occur. For example, only 5 out of 52 cards are stones, so it is very unlikely the other player has a stone. Selecting scissors gives a higher chance of winning. -This project is in its early stages. Some features are planned, but currently, it just runs in the terminal, and you can select cards. The *AI* selects a card completely at random. If there is a draw, you continue with the cards you started with. If one player wins, new cards are dealt. +At the moment, there are two versions: a Python version for local usage (terminal), `local.py`, and a PyScript version, `main.py`. +The PyScript version can actually be accessed and played [online](https://codebymrfinchum.pyscriptapps.com/rock-paper-scissors-card-game/) on my [PyScript profile](https://pyscript.com/@codebymrfinchum).