見出し画像

ブラックジャックを目指す 20 全員の手札を取得

今回やること
ルームに内のプレイヤー全員の手札を表示する


前回までやったこと

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

流れの確認

ルームを引数として取得
ルームからルーム内プレイヤーを取得
ルーム内プレイヤーのユーザー名を取得
ルーム内プレイヤーの手札の取得
辞書としてユーザー名と手札の組み合わせを取得

完成コード

<appFolder>/views.py

#room内のプレイヤの手札の全取得
def room_all_player_card(room):
   room_players= RoomPlayers.objects.filter(room_id=room)
   playerHandsList=[] #リストを作成してユーザーネームを加えて追加していく

   for roomplayer in room_players :
       hand = get_player_hand(room,roomplayer)
       player = str(roomplayer.player_id.user_id)

       dict= {'user_name':player,
              'hand':hand}

       playerHandsList.append(dict)

   return playerHandsList

<appFolder>/template/<appjname>/gameroom.html 抜粋


     {% for card in playerhand %}
       <ul>
             {{card.as_ul}}
       </ul>
     {% endfor %}

     {% for room_user_info in roomplayerhand %}
       {{room_user_info.user_name}}

       {% for card in room_user_info.hand %}
               {{card.as_p}}
       {% endfor %}

     {% endfor %}

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

ルームを引数として取得
room_all_player_card(room):

ルームからルーム内プレイヤーを取得
room_players= RoomPlayers.objects.filter(room_id=room)

filter条件にroomのみを指定ですべてのルームプレイヤーを取得できる
複数形のクエリセットの取得になるので単体のプレイヤーごとの処理はfor文でループさせて処理する必要がある

ルーム内プレイヤーのユーザー名を取得
str(roomplayer.player_id.user_id)

Roomplayersのオブジェクトからユーザー名の取得は外部キーの外部キーとして取得することになる
もちろんuser_idからさらに.でつなげてnameでもいいしカスタムUSERならその特定のカラムでも指定し取得ができる
今回はUSERIDとしてアカウント情報を取得するがその名前はcustomUser オブジェクトの__str__ としてセットしてあるものをユーザー名として取得するようにした


ルーム内プレイヤーの手札の取得
hand = get_player_hand(room,roomplayer)
手札の取得は自分の手札を取得するメゾットをそのまま使用可能
メゾットは17で作成済みのものを利用

辞書としてユーザー名と手札の組み合わせを取得
dict= {'user_name':player,
'hand':hand}

上記のものをuser_nameとhandというkeyで保存する辞書としてそのまま追加する

表示確認

上記の結果をroomplayerhandとしてcontextに追加する

     {% for room_user_info in roomplayerhand %}
       {{room_user_info.user_name}}

       {% for card in room_user_info.hand %}
               {{card.as_p}}
       {% endfor %}

     {% endfor %}
     

roomplayerhandは全プレイヤーの情報が含まれているので
ユーザー名と手札の組み合わせの単体にまずfor文で取り出す
.user_nameでまずユーザ名を取り出し
handは複数カードの情報が含まれているのでさらにfor文を入れ子にして取得を行う

アクセス結果

画像1

名前の後そのプレイヤーの手札情報が表示されていることを確認

次回予定

勝利者判定ができれば


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