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 抜粋
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 抜粋
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 抜粋
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 追加部分のみ
{% 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をつけておく
確認
アクセスと同時に
マーク部分が表示されていることを確認
次回予定
このままだと手札の点数がわかりにくいので点数を表示する
あとはカード引くかやめるかの処理まで行ければ
この記事が気に入ったらサポートをしてみませんか?