限定ジャンケンもどき

福本伸行賭博黙示録カイジ』に出てくる、「限定ジャンケン」のパクリゲーム。

限定ジャンケンもどきルール
・プレイヤは初めに、星を3つ持つ
・相手はレベル数だけ星を持つ
・プレイヤと相手は初めに、グー、チョキ、パーの3種4枚(計12枚)づつのカードを持つ
・カードを1枚1回の使用として、相手とジャンケン勝負をし、勝つと相手の星が貰える(負けた場合は星を没収される、あいこは星の移動無し)

・勝利条件:自分の持ちカードと星が零になる前に、相手の星を全て奪う
・敗北条件:相手の星を全て奪う前に、自分の持ちカードか星が零になる

・勝利後、カード・星の状態を保持したままで次のゲームに挑戦する事が出来る(新しい相手はカードをフルセット持っているので不利)

ソースコード(GenteiJanken.py):

import sys
import random

class Player:
 def __init__(self):
  self.card_deck = [4 , 4, 4] # rock, scissors, paper
  self.star = 3
  self.card = ()

 def selectRandomCard(self):
  num = random.randint(0, 2)
  while (self.card_deck[num] < 1):
   num = random.randint(0, 2)
  return self.informCard(num)

 def selectCard(self):
  c = raw_input("Select card" +\
    "(0:random, 1:rock, 2:scissors, 3:paper, e:escape): ")
  if c == 'e':
   print "You have escaped!"
   sys.exit()
  else:
   num = int(c) - 1
   if num == -1:
    return self.selectRandomCard()
   elif self.card_deck[num] < 1:
    print "\n  rock_card:" + str(self.card_deck[0]) +\
      "  scissors_card:" + str(self.card_deck[1]) +\
      "  paper_card:" + str(self.card_deck[2])
    self.selectCard()
   else:
    return self.informCard(num)

 def informCard(self, num):
  if self.card_deck[num] > 0:
   self.card_deck[num] = self.card_deck[num] - 1
  if num == 0:
   card = "rock_card"
  elif num == 1:
   card = "scissors_card"
  elif num == 2:
   card = "paper_card"
  return (num, card)

class GameManager:
 def __init__(self, my_player, rival_player):
  self.my_player = my_player
  self.rival_player = rival_player

 def playGame(self):
  print "\n Your Star: " + str(self.my_player.star) +\
    "\tRival's Star: " + str(self.rival_player.star)
  print "  rock_card:" + str(self.my_player.card_deck[0]) +\
    "  scissors_card:" + str(self.my_player.card_deck[1]) +\
    "  paper_card:" + str(self.my_player.card_deck[2])
  self.my_player.card = self.my_player.selectCard()
  self.rival_player.card = self.rival_player.selectRandomCard()
  self.judgeGame()
  
 def judgeGame(self):
  print "You: " + self.my_player.card[1] +\
    "\tRival: " + self.rival_player.card[1],
  if self.my_player.card[0] == self.rival_player.card[0]:
   self.setTie()
  elif self.my_player.card[0] == 0 and self.rival_player.card[0] == 1:
   self.setWin()
  elif self.my_player.card[0] == 0 and self.rival_player.card[0] == 2:
   self.setLose()
  elif self.my_player.card[0] == 1 and self.rival_player.card[0] == 0:
   self.setLose()
  elif self.my_player.card[0] == 1 and self.rival_player.card[0] == 2:
   self.setWin()
  elif self.my_player.card[0] == 2 and self.rival_player.card[0] == 0:
   self.setWin()
  elif self.my_player.card[0] == 2 and self.rival_player.card[0] == 1:
   self.setLose()
  if (self.my_player.card_deck[0] < 1 and\
    self.my_player.card_deck[1] < 1 and\
    self.my_player.card_deck[2] < 1) or\
    (my_player.star == 0):
   self.setGameLose()
  elif (self.rival_player.card_deck[0] < 1 and\
    self.rival_player.card_deck[1] < 1 and\
    self.rival_player.card_deck[2] < 1) or\
    (rival_player.star == 0):
   self.setGamewin()
  else:
   self.playGame()

 def setWin(self):
  self.my_player.star = self.my_player.star + 1
  self.rival_player.star = self.rival_player.star - 1
  print "\t\tWin!"

 def setLose(self):
  self.my_player.star = self.my_player.star - 1
  self.rival_player.star = self.rival_player.star + 1
  print "\t\tLose!"

 def setTie(self):
  print "\t\tTie!"

 def setGamewin(self):
  print "You Win!    :-D"
  print " Your Star: " + str(self.my_player.star) +\
    "\tRival Star: " + str(self.rival_player.star)

 def setGameLose(self):
  print "You Lose!   :-p"
  print " Your Star: " + str(self.my_player.star) +\
    "\tRival Star: " + str(self.rival_player.star)
  sys.exit()

if __name__=='__main__' :
 random.seed()
 my_player = Player()
 while True:
  level = raw_input("Select Level(1~9 or q:quit): ")
  if level == 'q':
   sys.exit()
  else:
   try:
    rival_player = Player()
    rival_player.star = int(level)
    gm = GameManager(my_player, rival_player)
    gm.playGame()
   except :
    #print "Unexpected error:", sys.exc_info()[0]
    pass

実行例:

> python GenteiJanken.py
Select Level(1~9 or q:quit): 3

 Your Star: 3   Rival's Star: 3
  rock_card:4  scissors_card:4  paper_card:4
Select card(0:random, 1:rock, 2:scissors, 3:paper, e:escape): 1
You: rock_card  Rival: scissors_card            Win!

 Your Star: 4   Rival's Star: 2
  rock_card:3  scissors_card:4  paper_card:4
Select card(0:random, 1:rock, 2:scissors, 3:paper, e:escape): 0
You: scissors_card      Rival: rock_card                Lose!

 Your Star: 3   Rival's Star: 3
  rock_card:3  scissors_card:3  paper_card:4
Select card(0:random, 1:rock, 2:scissors, 3:paper, e:escape): 1
You: rock_card  Rival: rock_card                Tie!
(中略)
Select card(0:random, 1:rock, 2:scissors, 3:paper, e:escape): 1
You: rock_card  Rival: scissors_card            Win!
You Win!    :-D
 Your Star: 6   Rival Star: 0
Select Level(1~9 or q:quit): q
>

『アカギ』アニメ化記念?(笑)