Skip to content

Instantly share code, notes, and snippets.

@usaturn
Created July 4, 2012 02:49
Show Gist options
  • Save usaturn/3044962 to your computer and use it in GitHub Desktop.
Save usaturn/3044962 to your computer and use it in GitHub Desktop.
PokerGameを題材にUnitTestの勉強
# -*- coding:utf-8 -*-
import sys
import random
# 手札はマーク無しで1から13までの数字のいずれかを要素とするリストで表現する。
# 同じ数字の上限は無し(5)とする
# リストの要素数は5とする。
# リストの中身はランダムに決定する
# テスト: リストの要素数が5である
# かつ要素が1から13までの数字であるならばTrue、それ以外はFalseを返す
def set_cards():
cards = []
for num in range(5):
cards.append(random.randint(1, 13))
return cards
# 手札を同じ数のカードでグルーピングし辞書を作成する
# 引数: 手札のリスト(cards)
# 返り値: 手札をグルーピングした辞書: card_dict
# テスト: 辞書のvalueの合計が5になる事
# 変数: valueを合計する num_of_cards
def grouping_cards(cards):
card_dict = {}
for card in cards:
if card in card_dict:
card_dict[card] += 1
else:
card_dict[card] = 1
return card_dict
# 手札のまとめを調べて、3カードが存在したらFalseを返す
# 手札のまとめを調べて、pairの数を数える
# 全ての手札のまとめを調べ終わって、pairが1つだったらTrueを返す
def is_one_pair(cards):
card_dict = grouping_cards(cards)
pair = 0
for key, value in card_dict.items():
if value == 3: # is three cards
return False
elif value == 2: # count pair
pair += 1
if pair == 1: # is one pair
return True
return False
# 手札のまとめを調べて、pairの数を数える
# 全ての手札のまとめを調べ終わって、pairが2つだったらTrueを返す
def is_two_pair(cards):
card_dict = grouping_cards(cards)
pair = 0
for key, value in card_dict.items():
if value == 2: # count pair
pair += 1
if pair == 2: # is two pair
return True
return False
# 手札をグルーピングした辞書を調べて同じ札が3ある組があるか調べる
# 3ある札が1つで残りの札が1しか無ければTrueを返す
# 引数: 手札のリスト(cards)
# 返り値: True or False
# テスト: 札5枚のうち2枚が同じ札である場合はFalse、3枚が同じ札かつ
# 残り2枚がペアでない場合はTrueを返す関数である事を確認
# 変数: グルーピングされた札の枚数を表すvalue、グルーピングされて
# valueが2のpair、グルーピングされてvalueが3のthree_cards
def is_three_cards(cards):
card_dict = grouping_cards(cards)
pair = 0
three_cards = 0
for value in card_dict.values():
if value == 2: # count pair
pair += 1
elif value == 3: # count three_cards
three_cards += 1
if pair == 0: # is not pair
if three_cards == 1: # is three_cards
return True
return False
# 手札をグルーピングした辞書を調べて同じ札が4ある組があるか調べる
# 4ある組が存在したらTrueを返す
# 引数: 手札のリスト(cards)
# 返り値: True or False
# テスト: 札5枚のうち4枚が同じ札である場合にTrueを返しそれ以外は
# falseを返す事を確認する。
# 変数: グルーピングされた札の枚数を表すvalue
def is_four_cards(cards):
card_dict = grouping_cards(cards)
for value in card_dict.values():
if value == 4: # search four_cards
return True
return False
# 手札をグルーピングした辞書を調べて同じ札が4ある組があるか調べる
# 5ある組が存在したらTrueを返す
# 引数: 手札のリスト(cards)
# 返り値: True or False
# テスト: 札5枚のうち5枚が同じ札である場合にTrueを返しそれ以外は
# falseを返す事を確認する。
# 変数: グルーピングされた札の枚数を表すvalue
def is_five_cards(cards):
card_dict = grouping_cards(cards)
for value in card_dict.values():
if value == 5: # search five_cards
return True
return False
# 手札をグルーピングした辞書を調べて同じ札が3ある組があるか調べる
# 3ある札が1つで残りの1ペアならTrueを返す
# 引数: 手札のリスト(cards)
# 返り値: True or False
# テスト: 3カードが1、1ペアが1の場合にTrueが返る事、それ以外はFalse
# が返る事を確認
# 変数: グルーピングされた札の枚数を表すvalue、グルーピングされて
# valueが2のpair、グルーピングされてvalueが3のthree_cards
def is_fullhouse(cards):
card_dict = grouping_cards(cards)
pair = 0
three_cards = 0
for value in card_dict.values():
if value == 2: # count pair
pair += 1
elif value == 3: # count three_cards
three_cards += 1
if pair == 1: # is not pair
if three_cards == 1: # is three_cards
return True
return False
# 手札をソートして、ストレート比較用リストの一部分にマッチしたらTrueを返す
# 引数: 手札のリスト(cards)
# 返り値: True or False
# テスト: ストレートならTrue、それ以外はFalseが返る事を確認
# リスト: 比較用リスト [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 1 ]
# リスト: 手札をソートしたリスト
# リスト: 手札をソートしたリストの1番目の札の数字から比較用リストを
# 切り出したリスト
def is_normal_straight(cards):
list_straight = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
cards.sort()
num_young = cards[0]
if num_young > 9:
return False
elif num_young in list_straight:
num_young_index = list_straight.index(num_young)
else:
return False
list_guessed = list_straight[num_young_index:num_young_index + 5]
if cards == list_guessed:
return True
return False
# 手札をソートして、ロイヤルストレート比較用リストにマッチしたらTrueを返す
#
# 引数: 手札のリスト(cards)
# 返り値: True or False
# テスト: ロイヤルストレートならTrue、それ以外はFalseが返る事を確認
# 変数:
# リスト: 比較用リスト [1, 10, 11, 12, 13]
# リスト: 手札をソートしたリスト
def is_royal_straight(cards):
royal_straight = [1, 10, 11, 12, 13]
cards.sort()
if cards == royal_straight:
return True
return False
# 手札の役判定を実施する。
#
# 引数: 手札のリスト(cards)
# 返り値: 文字列で役を返す
# "buta"
# "four_cards"
# "five_cards"
# "fullhouse"
# "normal_straight"
# "one_pair"
# "royal_straight"
# "three_cards"
# "two_pair"
# テスト: 役が正しく判定される事を確認
def judge_hands(cards):
if is_one_pair(cards):
return "one_pair"
elif is_two_pair(cards):
return "two_pair"
elif is_three_cards(cards):
return "three_cards"
elif is_normal_straight(cards):
return "normal_straight"
elif is_royal_straight(cards):
return "royal_straight"
elif is_fullhouse(cards):
return "fullhouse"
elif is_four_cards(cards):
return "four_cards"
elif is_five_cards(cards):
return "five_cards"
else:
return "buta"
# 手札を配り、手札を判定し、手札と、その判定結果を出力する
# 引数: 手札のリスト(cards)
def main():
cards = set_cards()
hands = judge_hands(cards)
print u'%s %s %s %s %s \nhands is %s' % (cards[0], cards[1], cards[2],
cards[3], cards[4], hands)
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment