見出し画像

Djangoでブラックジャックを目指す 26

今回やること

履歴を利用した

前回まででやったこと

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ターン目の流れの確認
カードをドローする処理の動作確認
フェイズを進行させる
手札の表示
点数処理
役の確認チェック
プレイヤーの行動処理
ルームに内のプレイヤー全員の手札を表示
全プレイヤーに得点情報の追加
勝利者判定
前回勝利者判定時の確認に使用したviewを説明
ゲームを終了し部屋を閉じる処理
退出処理の時の不具合とその解決方法の洗い出し
勝敗結果の履歴への保存


履歴からの勝敗判定のながれ

基本的に既存のルーム情報からの勝敗判定と変わらない
前回の保存情報からコードを取得するだけである

完成コード-履歴取得用メゾット

<appFolder>/views.py



#勝敗履歴の取得
def get_hist(room_id_num):
   return GameHistroies.objects.filter(room_id = room_id_num)

#自分の勝敗結果(履歴版)
def is_user_win_hist(user, game_result):
   for rslt_query in game_result:
       rslt = rslt_query.user_name
       if rslt_query.user_name ==user:
           return rslt_query.win

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

コードの中身について
get_hist(room_id_num):

ルームIDで絞り込みをおこなった履歴リストを返す
ここにすべてのプレイヤーの勝敗情報が記載されているのでそのまま利用する
DBの中身に関しては前回を参照

def is_user_win_hist(user, game_result):

上のget_hist(room_id_num)にて取得したresultをgame_resultとして

引数に入れ渡す
それに加えログインユーザーの情報を格納する


ログインユーザーと部屋のユーザーリストを照らし合わせて
for rslt_query in game_result:
 rslt = rslt_query.user_name


指定ユーザーの時にはそのユーザーとみなしてその勝敗情報を回収する

if rslt_query.user_name ==user:
return rslt_query.win


完成コード ーメイン3ターン目の履歴登録~4ターン目の履歴取得まで

<AppFolder>/views.py

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 roomplayer is None:
       return redirect(reverse_lazy('game:entrance'))

////////////////略////////////////////////

       if room.phase_counter == 3:
           context.update({'turn':room.phase_counter})
------------------------略-----------------------

           if request.method == 'POST':
               #カードを引くを選択
               if 'hit' in request.POST.keys():
                   draw_card(room,roomplayer)
                   hand_card =get_player_hand(room,roomplayer)
                   if is_bust_or_bj(hand_card)=='bust':
                       roomplayer.turn_player_flag = False
                       roomplayer.save()
                       phase_counter_check_and_go(room_id)


               if 'stand' in request.POST.keys():
                   roomplayer.turn_player_flag = False
                   print("turn3_stand")
                   roomplayer.save()
                   if phase_counter_check_and_go(room_id):
                       #ルーム内プレイヤーの手札情報の取得
                       all_player_hands= room_all_player_card(room)
                       #その手札情報に役と点数情報を付与
                       all_player_handinfo=all_player_pointset(all_player_hands)
                       #勝利者情報を付与
                       all_player_handinfo=get_win_player(all_player_handinfo)

                       #勝敗情報を登録
                       set_gamehist(room_id,all_player_handinfo)

               return redirect(reverse_lazy('game:gameroom' ,kwargs={'room_id':room_id}))


       if room.phase_counter == 4:

           context.update({'turn':room.phase_counter})
           if request.method == 'GET':
               #手札を取得する
               hand_card = get_player_hand(room,roomplayer)
               #コンテキストに追加する
               context.update({'playerhand':hand_card})

               game_result = get_hist(room_id)


               #自分が勝利者か判定
               #you_win= is_user_win(request.user, all_player_handinfo)
               you_win=is_user_win_hist(request.user, game_result)


               #コンテキストに追加する
               #context.update({'roomplayerhand':all_player_handinfo})
               context.update({'you_win':you_win})
               context.update({'result':game_result})

           if request.method == 'POST':

               #ルームプレイヤーの削除
               roomplayer.delete();

               if RoomPlayers.objects.filter(room_id= room).count()==0:
                   CardAreas.objects.filter(room_id= room).delete()
                   room.delete()

               return redirect(reverse_lazy('game:entrance'))

前回のコードからの変更点は ターン4の読み出しに使っていた既存ゲームの情報の取得を3T目のPOST時のターン進行処理時に履歴登録にのために利用するように変更

4ターン目の取得メゾットは
履歴からの情報取得に切り替えた


次回予定

これでいったんは全部の要件を達成できたはず

形にはなったのですべてのまとめを作成し完成したら有料化を考えています


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