見出し画像

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

画像1

# カードを移動させる処理
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抜粋

画像2

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に反映する

次回予定

今回つくった変数を実際に組み込んで動作確認を行う
全員の準備ができた場合のターンカウントを自動で進めるような仕組みの検討


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