見出し画像

Djangoでブラックジャックを目指す 22 勝利者判定

前回までやったこと

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ターン目の流れの確認
カードをドローする処理の動作確認
フェイズを進行させる
手札の表示
点数処理
役の確認チェック
プレイヤーの行動処理
ルームに内のプレイヤー全員の手札を表示
全プレイヤーに得点情報の追加

勝利者判定の流れ

全員の得点(役情報)含むルームプレイヤー情報を前回のメゾットから取得
すべての得点をループさせ最大点(役)を取得する
再びループさせ最大点と一致していればWINを個別プレイヤーに付与
それ以外の場合はLoseとする
最後にすべてのプレイヤーが勝利した場合は引き分けに書き換える

完成コード

<appFolder>/views.py (追加部分のみ)

画像1

#勝利者判定
def get_win_player(all_player_handinfo):
   all_player_dict=[]
   win_score =None #勝利者のスコア
   #勝利者のスコアを算出
   for player_dict in all_player_handinfo:
       point = player_dict.get('point')
       if point == 'BlackJack':
           win_score= 'BlackJack'
           break;
       elif point=='bust':
           continue;
       elif win_score is None or int(point)>win_score:
           win_score = int(point);

   #勝利者のスコアから勝利者を算出
   draw_flag= True; #勝利者以外が出たらFlaseにする
   for player_dict in all_player_handinfo:
       win = "draw";#通常時はドロー

       if win_score== None:
           win ="lose";
           draw_flag=False

        #勝利者の点と同じなら勝利とする        elif win_score== player_dict.get('point'):
           win ="win";

       else :
           win ="lose";
           draw_flag=False

       player_dict.update({'win':win});
       all_player_dict.append(player_dict)

   if draw_flag:
       for player_dict in all_player_dict:
           player_dict.update({'win':'draw'})


   return all_player_dict
   
   


def is_user_win(user, all_player_handinfo):
   for player in all_player_handinfo:
       if player.get('user_name') ==str(user):
           return player.get('win')

   return '取得に失敗しました';


解説 流れとコードの照らし合わせ

全員の得点(役情報)含むルームプレイヤー情報を前回のメゾットから取得
def get_win_player(all_player_handinfo):

プレイヤーのusernameと手札情報、手札の得点の情報がセットされた辞書のリスト
取得については前回を参照


すべての得点をループさせ最大点(役)を取得する
win_score =None 
for player_dict in all_player_handinfo:
上記でプレイヤーの辞書情報一つずつ取得しをループさせる

point = player_dict.get('point')
if point == 'BlackJack':
win_score= 'BlackJack'
break;
elif point=='bust':
continue;
elif win_score is None or int(point)>win_score:
win_score = int(point);

上記のの中身はBlackJackがあれば自動的に最大得点が確定するのでループを抜ける
bustなら最大になりえないけどループ自体は続行(continue)
上記以外なら現在の数字超えるもしくは
現在値がない場合は最大得点を更新する


再びループさせ最大点と一致していればWINをそれ以外の場合はLose個別プレイヤーに付与


for player_dict in all_player_handinfo:
#勝利者の点と同じなら勝利とする
elif win_score== player_dict.get('point'):
win ="win";
 else :
win ="lose";
draw_flag=False
 player_dict.update({'win':win});
all_player_dict.append(player_dict)

まずforでループに入る

勝利者となる最大得点はすでに確定しているのでそれと一致するかで勝利者か判定一致ならwin しないならloseとしてwin変数に格納
そしてそれをwinをkeyとしてプレイヤー情報を格納する辞書にいれるリストに追加する


最後にすべてのプレイヤーが勝利した場合は引き分けに書き換える

if draw_flag:
for player_dict in all_player_dict:
player_dict.update({'win':'draw'})

全員が勝利者となった場合は引き分けとするので
ループ前にdrawフラグを作っておきwin以外が発生した場合OFFにし
敗者が一人もいないときは勝利者フラグを書き換えて引き分けに変更する

自分の勝敗を判定する

最後に自分自身のUSER情報を渡して
辞書リストと名前一致のものから勝利フラグを取得することで自分が勝ったか負けたかの情報を取得する

確認

上記を呼び出すメゾットを組み込みアクセス

画像2

プレイヤーの勝敗と

そのあとに続く部屋のプレイヤーにフラグはあるのを確認


次回予定

今回の確認に使ったviewの部分とhtmlのコードの公開と
ゲームを続けるかやめるかを表示させ選択させるのを予定

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