見出し画像

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

今回行うこと
手札の表示


前回までやったこと

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 抜粋

画像1

def get_playerHand(room,roomplayer):
   card_area_list= CardAreas.objects.filter(area=2,room_player_id=roomplayer,room_id=room ).order_by('card_id__num')
   card_list=[]
   for card_area in card_area_list:
       card= CardInfoForm(card_area.card_id.__dict__)
       card_list.append(card)
   return card_list

<appFolder>/froms.py 抜粋

画像3

class CardInfoForm(forms.ModelForm):
   class Meta:
       fields=(
           'id',
           'mark',
           'num',
           )
   def __init__(self,*args,**kwargs):
       super(CardInfoForm,self).__init__(*args,**kwargs)
       


解説

手札をすべて取得する

card_area_list= CardAreas.objects.filter(area=2,room_player_id=roomplayer,room_id=room ).order_by('card_id__num')

プレイヤーの持っているカード情報を持っているのはCardAreasModelなのでまずそこから指定の部屋の指定プレイヤーの持つカードを全取得する

もちろん取得するのは複数形(少なくともカードは2枚以上になる)

取得値からCard部分だけ抜き出しFormに変換する

for card_area in card_area_list:
card= CardInfoForm(card_area.card_id.__dict__)

for 文を利用して複数系で取得したcard_area_listから1つ1つを処理する
card_area.card_id.__dict__
によって1つのレコードのcardの外部キーであるcard_idを指定することで紐づいたcard情報を取得
__dict__をつけると取得したクエリセットをkey:valueの辞書型に変換することができる

これを今回テンプレートに渡すためのFormに渡してFrom型変換
.append(card)で受け渡し用のリストに追加する

テンプレートに渡す

<appFolder>/views.py  抜粋

画像3

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})


  return render(request ,template_name ,context)
  

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

画像4

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

   {% endfor %}

解説

現在のターンカウントは3になっている(2までだとカードの分配が終わっていない)
なのでターンカウントが3の時の操作として
if room.phase_counter == 3:
の条件で組み込む

今回作成した手札取得メゾットを呼んでhand_cardとして加える
メゾットの戻り値はCardInfoFormのリスト型
これをそのままcontextにupdateメゾットで加える

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

テンプレートでリスト型を取り出すにはcontextで投げられたリストに対して
for文を利用し1つ1つ値を取得し(今回はcardとして一時変数に入れる)
それをリストとしてHtmlに変換するためas_ulをつけておく

確認

画像5

アクセスと同時に
マーク部分が表示されていることを確認

次回予定

このままだと手札の点数がわかりにくいので点数を表示する
あとはカード引くかやめるかの処理まで行ければ

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