##追伸 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を超えてしまうとバースト扱いとなり敗北です。
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