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).
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/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()
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"