howmuch515 icon

LimitedRSP.py

howmuch515 | PRO | 01/29/18 11:10:55 AM UTC | 0 ⭐ | 273 👁️ | Never ⏰ | []
Python |

4.17 KB

|

None

|

0 👍

/

0 👎

from random import randint
 
ROCK, PAPER, SCISSORS = 1, 2, 3
HANDS = ("ROCK", "PAPER", "SCISSORS")
 
 
# 1P
class Player():
    def __init__(self):
        # Player has cards: ROCK * 2, PAPER * 2, SCISSORS * 2
        self.card = {ROCK: 2, PAPER: 2, SCISSORS: 2}
 
        # Player has STAR * 3
        self.star = 3
 
        # chosen card by Player
        self.hand = 0
 
 
    # checking cards are left
    def checkLeftCard(self, hand):
        return self.card[hand] > 0
 
 
    # set user's choice to hand
    def setCard(self, hand):
        self.card[hand] -= 1
        self.hand = hand
 
# 2P
class CPU(Player):
    def __init__(self):
        super().__init__()
 
    
    # cpu's choice at random
    def setCard(self):
        while True:
 
            # choice hand at random
            hand = randint(1, 3)
 
            # if choiced hand is not left, reset
            if not self.checkLeftCard(hand):
                continue
            else:
                self.card[hand] -= 1
                self.hand = hand
                break
 
 
# Game class
class LimitedRSP():
    def __init__(self):
        self.you = Player()
        self.cpu = CPU()
 
        # counters
        self.round = 1
        self.win_counter = 0
        self.lose_counter = 0
        self.draw_counter = 0
 
 
    # Show menu
    def showMenu(self):
        print("+" * 30)
        print("ROUND: {}".format(self.round))
        print("STAR: {}".format(self.you.star))
        print()
        print("Please choice.")
 
        # show choice
        for i in range(1, 4):
            print("{}.{}: ({})".format(i, HANDS[i - 1], self.you.card[i]))
 
        print()
 
 
    # show result at the end
    def showResult(self):
        print("GAME OVER")
        if self.you.star == self.cpu.star:
            print("DRAW")
        elif self.you.star > self.cpu.star:
            print("WINNER: YOU")
        else:
            print("WINNER: CPU")
        print("win:{}, lose:{}, draw:{}".format(self.win_counter, self.lose_counter, self.draw_counter))
        print()
 
 
    # set Card You and CPU
    def chooseCard(self, you_choice):
        if not you_choice in ("1", "2", "3"):
            print("Invalid Choice!")
            print()
            raise Exception
 
        # type change. str -> int
        you_choice = int(you_choice)
 
        if self.you.checkLeftCard(you_choice):
            self.you.setCard(you_choice)
            self.cpu.setCard()
            return True
        else:
            print("Not left")
            print()
            raise Exception
 
 
    # check game over
    def isGameOver(self):
        return (self.you.star == 0 or self.cpu.star == 0) or (self.round > 6)
 
 
    def win(self):
        self.win_counter += 1
        self.round += 1
        self.you.star += 1
        self.cpu.star -= 1
        print("WIN")
        print("STAR {} -> {}".format(self.you.star - 1, self.you.star))
        print()
 
 
    def lose(self):
        self.lose_counter += 1
        self.round += 1
        self.you.star -= 1
        self.cpu.star += 1
        print("LOSE")
        print("STAR {} -> {}".format(self.you.star + 1, self.you.star))
        print()
 
 
    def draw(self):
        self.draw_counter += 1
        self.round += 1
        print("DRAW")
        print()
            
 
    # judge the outcome of janken
    def judge(self):
        you_hand, cpu_hand = self.you.hand, self.cpu.hand
        print("YOU {}\nCPU {}".format(HANDS[you_hand - 1], HANDS[cpu_hand - 1]))
        print()
 
        # judge method
        (self.draw, self.lose, self.win)[cpu_hand - you_hand]()
        
        
# MAIN
def main():
    game = LimitedRSP()
    while True:
        game.showMenu()
        you_input = input("Your choice -> ")
        print()
 
        # checking validity and set card
        try: 
            game.chooseCard(you_input)
        except:
            continue
 
 
        # RSP battle
        game.judge()
        
        # if game over, show result and finish game
        if game.isGameOver():
            game.showResult()
            break
 
 
if __name__ == '__main__':
    main()

Comments