pythonでカードゲーム（トランプゲーム）を作るのに使えるライブラリを書いた（制作例付き）

##追伸　2018/07/10
大富豪とかで最初にカードを配る時に使える .distribute()を実装しました。


#はじめに
自分は電車とかでひまつぶしに簡単なトランプゲームを作るのですが、ありそうでなかったので作りました。

#何ができる？
まだ山札を構築したりドローしたりしかできないです。
随時更新します。 
https://github.com/XXXalice/cardgame

#インストール
```
pip install cardgame
```

#使い方
###・山札構築
```python
from cardgame import Deck

d = Deck.Deck() #Deckインスタンスを作成すると自動的に山札が構築されます
print(d.deck) #deckにアクセスすると全要素を得られます
```

```
['spade_1', 'heart_1', 'clover_1', 'diamond_1', 'spade_2', 'heart_2', 'clover_2', 'diamond_2', 'spade_3', 'heart_3', 'clover_3', 'diamond_3', 'spade_4', 'heart_4', 'clover_4', 'diamond_4', 'spade_5', 'heart_5', 'clover_5', 'diamond_5', 'spade_6', 'heart_6', 'clover_6', 'diamond_6', 'spade_7', 'heart_7', 'clover_7', 'diamond_7', 'spade_8', 'heart_8', 'clover_8', 'diamond_8', 'spade_9', 'heart_9', 'clover_9', 'diamond_9', 'spade_10', 'heart_10', 'clover_10', 'diamond_10', 'spade_11', 'heart_11', 'clover_11', 'diamond_11', 'spade_12', 'heart_12', 'clover_12', 'diamond_12', 'spade_13', 'heart_13', 'clover_13', 'diamond_13']
```

二次元リストにしたり辞書にしたりしましたが結局マークと数値をアンダーバーでつないだものに落ち着きました。

###・シャッフル .shuffle()
シャッフルします。

```python
d.shuffle() #いわゆる破壊的メソッド
print(d.deck)
```

```
['heart_3', 'diamond_8', 'diamond_1', 'clover_2', 'diamond_3', 'clover_7', 'diamond_12', 'spade_3', 'heart_10', 'clover_3', 'diamond_4', 'heart_9', 'spade_4', 'heart_8', 'diamond_13', 'spade_9', 'clover_11', 'clover_13', 'heart_12', 'diamond_6', 'diamond_10', 'heart_7', 'heart_6', 'diamond_7', 'spade_1', 'clover_5', 'diamond_11', 'spade_6', 'spade_8', 'heart_2', 'diamond_5', 'clover_8', 'spade_5', 'heart_4', 'heart_13', 'spade_7', 'heart_11', 'heart_5', 'diamond_9', 'clover_6', 'spade_2', 'spade_13', 'clover_9', 'clover_12', 'spade_11', 'clover_4', 'diamond_2', 'spade_12', 'spade_10', 'heart_1', 'clover_1', 'clover_10']
```

###・カードを引く .draw()
指定の枚数分、**山札の上から**カードを引きます。
{マーク}_{数値}のstr型で返すか数値のみのint型で返すかnum_inspect引数で設定できます。
リストが返ってきます。

```python
print(len(d.deck))

hand = d.draw(num=5, num_inspect=False)
print(hand)

print(len(d.deck))
```

```
52
['heart_3', 'diamond_8', 'diamond_1', 'clover_2', 'diamond_3']
47
```

###・カードの検証を行う .inspect()
カードのリストを投げるとそのカードのマークもしくは数値を返します。
マークか数値かはis_elem引数で設定します。

```python
numbers_in_hand = d.inspect(cards=hand, is_elem=False)
print(numbers_in_hand)

mark_of_hand = d.inspect(cards=hand, is_elem=True)
print(mark_of_hand)
```

```
[3,8,1,2,3]
['heart','diamond','clover','diamond','diamond']
```

###・ゲーム前にカードをプレイヤーに配る .distribute()
枚数を投げるとその分のカードを山札から引きます。
draw()との違いは一枚ごとに山札がシャッフルされる為より公平な分配になります。

```python
playing_card = d.distribute(num=5)
print(playing_card)
```

```
['clover_9', 'spade_4', 'diamond_1', 'clover_13', 'clover_8']
```

#制作例
単純なブラックジャックのようなゲームです。
ディーラーのドローは最初の二枚のみ、エースは1のみとして扱います。
自分の手札の合計がディーラーの手札の合計より数字が大きく、かつ21を超えなければ勝利です。
standすればディーラーと勝負、しなければ1枚ドローします。
21を超えてしまうとバースト扱いとなり敗北です。

```python:blackjack.py
from cardgame import Deck

def judge(cards, d_cards):
    print("Dealer cards :", end="")
    for d_card in d_cards:
        print(d_card, end=",")
    print("\nDealer sum :{}".format(sum(d_cards)))
    win() if sum(cards) > sum(d_cards) else lose()

def win():
    print("You win!")
    exit()

def lose():
    print("You lose.")
    exit()

def main():
    deck = Deck.Deck()
    deck.shuffle()
    dealer_cards = []
    dealer_cards += deck.draw(num=2, num_inspect=True)
    cards = []
    cards += deck.draw(num=2, num_inspect=True)

    stand = False
    while stand == False:
        print("Your cards :", end="")
        for card in cards:
            print(card, end=",")
        print("\nYour sum :{}".format(sum(cards)))
        if sum(cards) > 21:
            print("You busted!")
            lose()

        print("Dealer cards :", end="")
        for idx, d_card in enumerate(dealer_cards):
            print(d_card, end=",") if idx == 0 else print('?', end=",")

        stand = True if input("\nStand? [y/n]:") == "y" else False

        cards += deck.draw(num=1, num_inspect=True)

    judge(cards, dealer_cards)


if __name__ == '__main__':
    main()
```

###敗北例
```
Your cards :6,12,
Your sum :18
Dealer cards :10,?,
Stand? [y/n]:n
Your cards :6,12,5,
Your sum :23
You busted!
You lose.
```

###勝利例
```
Your cards :1,10,
Your sum :11
Dealer cards :8,?,
Stand? [y/n]:n
Your cards :1,10,10,
Your sum :21
Dealer cards :8,?,
Stand? [y/n]:y
Dealer cards :8,12,
Dealer sum :20
You win!
```
つ、つまらん…

#さいごに
読んでくれてありがとうございました。
よかったらプルリクください。なんでもかまいません。
https://github.com/XXXalice/cardgame