LoginSignup
61
55

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-07-03

追伸 2018/07/10

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

はじめに

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

何ができる?

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

インストール

pip install cardgame

使い方

・山札構築

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()

シャッフルします。

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引数で設定できます。
リストが返ってきます。

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引数で設定します。

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()との違いは一枚ごとに山札がシャッフルされる為より公平な分配になります。

playing_card = d.distribute(num=5)
print(playing_card)
['clover_9', 'spade_4', 'diamond_1', 'clover_13', 'clover_8']

制作例

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

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

61
55
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
61
55