見出し画像

Django でブラックジャックを目指す 18 点数処理

今回行うこと

点数処理

前回までやったこと

Djangoのプロジェクトを作る
start appでacounts ,game の2つのappのひな型を作成
accounts (app)にログイン用のCustomUserのモデルを作成
settings.pyを編集ログインユーザーを作成したCustomUserに変更
game に(app)にモデルをセットする
game (app)にforms.py(という空のファイル)を作成
formをセットする
allatuthを使ってログイン周りのアカウント部分を作成
ゲーム画面までのルーティング
表示用のベーステンプレートの複製
テンプレートとViewを連携させる
エントランスページ最低限の機能を考える
部屋作成機能 の実装
entrance → gameroom へのルーティング
カードの一覧作成処理
カードの一覧のIDを取得
カードリストをシャッフル→DB格納
初期デッキ生成処理の組み込み
ゲームボタンの生成
ゲーム準備完了ボタンの処理
全員参加意思が行われた時のターン進行処理
エントランス表示処理の変更
元の部屋に帰るメゾット追加
元の部屋の戻る処理の確認
2ターン目の流れの確認
カードをドローする処理の動作確認
フェイズを進行させる
手札の表示

点数計算の流れ

プレイヤーの手札を取得
10以上のカードは10とする
すべてのすべての数字を加算
合計が21を超えないときは1のカードを11としてあつかう


<appFolder>/views.py

画像1



#点数確認処理
def get_card_point(card_list):
   point =0;


   for card_l in card_list:
       card_l.is_valid()
       card = dict(card_l.cleaned_data)
       

       p = card.get('num')

       if p > 10:
           p=10
       point +=p


   for card in card_list:
       p = card.cleaned_data.get('num')
       if point+10 >21 :
           break;
       if p== 1:
           point+=10;

   print(point)
   return point

プレイヤーの手札を取得

cardlistは17で作ったものを使用して取得、引数としてこのメゾットに投げる

10以上は10としすべてのカードの数字を合計する

p = card.get('num')
if p > 10:
p=10
point +=p

合計が21を超えないときは1のカードを11としてあつかう


if point+10 >21 :
break;
if p== 1:
point+=10;



注意カードオブジェクトの値の取得について


dictを利用した場合は
dict.get('<key>')または
dict[<key>]で取得できる

ただしModel.objectから取得したものは
正確には辞書ではないのでdictを使用して辞書に変換しない場合
obj.cleaned_data.get('<key>')で取得を行える
card.get('num')で取得はできない
card = dict(card_l.cleaned_data)は辞書に変換を行っている


確認のためにviewに組み込む

  def gameRoom(request,room_id):

 template_name = 'game/gameroom.html'
 context={'msg' : 'gama Room NO'+ str(room_id)}

 room = GameRooms.objects.get(pk=room_id)
 context.update({'turn':room.phase_counter})
 player = get_player(request.user)
 roomplayer= get_roomPlayer(player, room)

------------------略--------------------------
      if room.phase_counter == 3:
           #手札を取得する
           hand_card = get_playerHand(room,roomplayer)
           #コンテキストに追加する
           context.update({'playerhand':hand_card})
           #手札の点数を計算する
           card_point=get_card_point(hand_card)
           context.update({'card_point':card_point})
      return render(request ,template_name ,context)
 

<appFolder>/templates/<appname>/gameroom.html 追加部分のみ

画像2

    <p>合計</p>{{card_point}}

上記を組み込み確認ページにアクセスを行う

画像3

数字の合計は1を11として扱い21になっていることを確認

次回予定


テンプレでカードを引くか引かずにターンを渡すかを選択し処理する機能実装予定


この記事が気に入ったらサポートをしてみませんか?