Django でブラックジャックを目指す 15 ドロー処理
今回やること
カードをドローする処理の実装
前回までやったこと
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 send_card(room ,send_area,get_area,send_player=None,get_player=None ):
area=None
#移動先情報を格納 元の場所にカードがある前提
if send_player is not None:
area= CardAreas.objects.filter(room_id=room,area = send_area).order_by(id).first()
else:
area= CardAreas.objects.filter(room_id=room,area = send_area,room_player_id=send_player).order_by(id).first()
#移動先の情報に更新してUpdate
if area is not None:
area.area=get_area
area.room_player_id=get_player
area.save()
# カードを引く処理
def draw_card(room,room_player):
send_card(room ,1,2,get_player=room_player )
使用するモデル
<appFolder>/models.py抜粋
class CardAreas(models.Model):
area_choices= (
(1,'deck'),
(2,'hand'),
(3,'trash'),
(4,'field'),
(9,'lost'),
)
room_id = ForeignKey(GameRooms,on_delete=SET_NULL,null= True);
area = IntegerField(choices= area_choices ,default=1)
room_player_id= ForeignKey(RoomPlayers,on_delete=SET_NULL,null= True);
card_id = ForeignKey(Cards ,on_delete=SET_NULL,null= True);
解説
def send_card()
カードの位置を移動させるときのための関数これでデッキから手札→手札から捨て山などの処理を行う
def draw_card()
def send_card()をつかって指定のプレイヤーにカードを引かせるため処理を行う
デッキの先頭のカード取得
CardAreas.objects.filter(room_id=room,area = send_area).order_by(id).first()
CardAreas.objects.filter(room_id=room,area = send_area)までで取得するカードの一覧の絞り込みをおこなっている
order_by(id).first() IDは登録順 first()はその一番上つまりデッキトップのカードを示している
先頭のカードの場所、所有者を書き換える
area.area=get_area
area.room_player_id=get_player
areaは場所番号を示し
room_playerは手札などにある場合の所有者を示す
そのまま=でクエリセットのなかみを修正した後
書き換えた情報を保存する
area.save() でDBに反映する
次回予定
今回つくった変数を実際に組み込んで動作確認を行う
全員の準備ができた場合のターンカウントを自動で進めるような仕組みの検討
この記事が気に入ったらサポートをしてみませんか?