Created
July 4, 2012 02:49
-
-
Save usaturn/3044962 to your computer and use it in GitHub Desktop.
PokerGameを題材にUnitTestの勉強
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- 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