ブラックジャックを作るー3

初心者の僕には難しいですが、ラスベガスで負け続けたカードゲームの「Black Jack」を作ってみます。 作る過程でPythonを覚えるのが本来の目的です。

まずは動作結果を文字だけで表示するスクリプトで作って行きます。 その後でカードの動きをスクリーン上で見えるようなGUIで作ります(それがが難しい)。 

スクリプトの原案は「プログラムのツボとコツ」からお借りしてます(秀和システム)。

ブラックジャックを作る-1

ゲームの規則は既知とします。 ゲームの組み立て(流れ)は次の通り。
1.掛け金を決める
2.プレーヤーとディーラーにカードを二枚ずつ配る(ディーラーの二枚目は隠しておく)
3.プレーヤーターン(順番)
 ・Stand:カードは引かずに勝負に臨む
 ・Hit:デッキからカードを一枚貰う
4.ディーラーターン
 ・カードの総計が17以上になるまでカードを引く
 ・17以上になったらそこで勝負が決まる
5.勝敗の決定
 ・21以上以上なったらバストで負け
 ・ポイントが多い方が勝ち、同数なら引き分け
 ・プレーヤーの掛け金がなくなったらゲーム終了(プレーヤーが負けとは限らない)

 

   プログラムのcode 説明、コメント
 1import random乱数発生用ライブラリー
 2  
 3def make_deck():カードを52枚作る関数
 4    suits = [‘S’, ‘H’, ‘D’, ‘C’]suitsは♠、♥、♦、♠、♧の4種類
 5    ranks = range(1, 14)ranksはA~10、J、Q、Kの13個
 6    deck = [(x, y) for x in ranks for y in suits]別項参照
 7    random.shuffle(deck)作ったカードをシャッフルする(混ぜ合わせる)
 8    return deckこのdeckを後々他の関数で使用するのでreturnしておく<—ここが躓く所
 9  
 10def main():主な処理機能をmain()と云う関数に纏える
 11    turn = 1turnとはゲームの回数
 12    player_money = 100プレーヤの持ち金を100とする
 13    deck = make_deck()3行目のmake_decck()を駆動する。出来たdeckを持ち帰る
 14    print(deck)そのdeck() 52枚を表示する
 15    while (player_money > 0):持ち金がなくなったら、ゲームは完了する
 16        print(‘turn : ‘, turn)何回目のゲームかを表示する
 17        print(‘players money is : ‘, player_money)プレーヤの所持金を表示する
 18        turn += 1ここまでが一回のゲームなので、次はゲーム2と表示する
 19        input(‘next turn?’)ゲーム2へ行きますか?と確認している
 20    print(‘Game Over ! ‘)プレーヤの所持金が切れたら、ゲームオーバーと表示する
 21  
 22if __name__ == ‘__main__’: main()と云う関数が直接実行された場合のみ実行できる。
 23   main() 
    

 

ここまでやると、プログラムに従って、次のような表示がでる。

[(2, ‘D’), (11, ‘H’), (8, ‘C’), (5, ‘H’), (1, ‘S’), ・・・・・・、(13, ‘C’), (4, ‘S’), (9, ‘D’)]  #52枚のカードが出来ている

turn : 1
players money is : 100
next turn?

turn : 2
players money is : 100
next turn?

 

————————————————————————

ブラックジャックを作る-2

 

   プログラムのcode 説明、コメント
 1import random乱数発生用ライブラリー
 2  
 3def make_deck():カードを52枚作る関数
 4    suits = [‘S’, ‘H’, ‘D’, ‘C’]suitsは♠、♥、♦、♠、♧の4種類
 5    ranks = range(1, 14)ranksはA~10、J、Q、Kの13個
 6    deck = [(x, y) for x in ranks for y in suits]別項参照
 7    random.shuffle(deck)作ったカードをシャッフルする(混ぜ合わせる)
 8    return deckこのdeckを後々他の関数で使用するのでreturnしておく <— ここが最初に躓くところ
 9  
 10def main():主な処理機能をmain()と云う関数に纏える
 11    turn = 1turnとはゲームの回数
 12    player_money = 100プレーヤの持ち金を100とする
 13    deck = make_deck()3行目のmake_decck()を駆動する。出来たdeckを持ち帰る
 14    print(deck)そのdeck() 52枚を表示する
 15    while (player_money > 0):持ち金がなくなったら、ゲームは完了する
 16        print(‘turn : ‘, turn)何回目のゲームかを表示する
 17        print(‘players money is : ‘, player_money)プレーヤの所持金を表示する
 18        turn += 1ここまでが一回のゲームなので、次はゲーム2と表示する
 19        input(‘next turn?’)ゲーム2へ行きますか?と確認している
 20    print(‘Game Over ! ‘)プレーヤの所持金が切れたら、ゲームオーバーと表示する
 21  

 

————————————————————————–

 

ブラックジャックを作る-3

下の空欄にはplayerとdealerへのカードを2枚ずつ配布する。 冗長になるが、理解し易いように一枚ずつの配布を4回書いてみる。
その後に一度に配布出来るようにcodeを書きなおします。

*印の行が追加されたところ

   プログラムのcode 説明、コメント           Tak-2-2-list6
 1import random#乱数発生用ライブラリー
 2  
 3def make_deck():#カードを52枚作る関数
 4    suits = [‘S’, ‘H’, ‘D’, ‘C’]#suitsは♠、♥、♦、♠、♧の4種類
 5    ranks = range(1, 14)#ranksはA~10、J、Q、Kの13個
 6    deck = [(x, y) for x in ranks for y in suits]#別項参照
 7    random.shuffle(deck)#作ったカードをシャッフルする(混ぜ合わせる)
 8    return deck#このdeckを後々他の関数で使用するのでreturnしておく<—ここ躓く
 9  
 10def main():#主な処理機能をmain()と云う関数に纏える
 11    turn = 1#turnとはゲームの回数
 12    player_money = 100#プレーヤの持ち金を100とする
 13    deck = make_deck()#3行目のmake_deck()を駆動する。出来たdeckを持ち帰る
 14    print(deck)#そのdeck() 52枚を表示する
 15    while (player_money > 0):#持ち金がなくなったら、ゲームは完了する
 16        print(‘turn : ‘, turn)#何回目のゲームかを表示する
 17        print(‘players money is : ‘, player_money)#プレーヤの所持金を表示する
 18  
*19        player_hand = []# プレイヤーの持ち札を格納するリスト
*20        dealer_hand = []# ディーラーの持ち札を格納するリスト
*21        deck = make_deck()# ゲームに使うカードの山を作成
*22        # print(deck)# デッキのリストの最後の札を取り出す
*23        card = deck.pop()# プレイヤーの持ち札リストに加える(1枚目)
*24        player_hand.append(card) 
*25        card = deck.pop() 
*26        player_hand.append(card)# 2枚目
*27  
*28        card = deck.pop() 
*29        dealer_hand.append(card)# dealer 1毎目
*30        card = deck.pop() 
*31        dealer_hand.append(card)# dealer2枚目
 32  
 33        print(player_hand) 
 34        print(dealer_hand)#ここまでが一回のゲームなので、次はゲーム2と表示する
 35       input(‘next turn?’)#ゲーム2へ行きますか?と確認している
 36    print(‘Game Over ! ‘)#プレーヤの所持金が切れたら、ゲームオーバーと表示する
 37  
 38 if __name__ == ‘__main__’:#main()と云う関数が直接実行された場合のみ実行できる。
 39   main() 

 

これをrunすると次のように、各2枚ずつ配布されます。

ターン: 1
所持金: 100
[(3, ‘S’), (9, ‘D’)]
[(12, ‘D’), (1, ‘S’)]
次のターンへ

 

続く

 

Python別館
Python別館 目次

・Pythonで作成したアプリ関連の記事は「Python別館」に、・widgetやその使用方法・それ …

Python別館
脳トレの勧め 2/2

前回は、辞書に三つの要素を入れる術が分からなかったので、策を弄して取敢えずは動くように出来ました。で …

Python別館
脳トレの勧め 1/2

朝一番で頭の体操と称して英単語のクイズをやっております(ここです)。ここで間違えたものや、大事そうな …