見出し画像

Djangoでブラックジャックを目指す 25 勝敗判定の不具合修正2

今回やること

勝敗結果の履歴への保存

前回まででやったこと

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ターン目の流れの確認
カードをドローする処理の動作確認
フェイズを進行させる
手札の表示
点数処理
役の確認チェック
プレイヤーの行動処理
ルームに内のプレイヤー全員の手札を表示
全プレイヤーに得点情報の追加
勝利者判定
前回勝利者判定時の確認に使用したviewを説明
ゲームを終了し部屋を閉じる処理
退出処理の時の不具合とその解決方法の洗い出し


完成コード -履歴の保存

<appFolder>/views.py

画像1

#勝敗履歴の保存
def set_gamehist(room_id_num,all_player_handinfo):
   hist_list= [];
   for playerinfo in all_player_handinfo:

       room_id=room_id_num
       user = playerinfo.get('user_name')
       hands= "";
       for hand in playerinfo.get('hand'):
           hands+= " "+hand.cleaned_data['mark'] + str(hand.cleaned_data['num']) ;


       hist_list.append(GameHistroies(
           room_id=room_id,
           user_name=user,

           hands=hands,
           point=playerinfo.get('point'),
           win=playerinfo.get('win'),
           ))

   GameHistroies.objects.bulk_create(hist_list)

<appFolder>/models.py

画像2

class GameHistroies(models.Model):
   room_id =IntegerField();
   user_name=ForeignKey(CustomUser,on_delete=CASCADE);
   hands=CharField(max_length=255);
   point=CharField(max_length=255);
   win=CharField(max_length=255);

解説 -履歴の保存

今回履歴として利用するmodelはGameHistroiesとする
このフィールドを一つずつ作成しオブジェクトを作成
それをリストに束ねてまとめてDBに登録します

引数として room_idと現時点のプレイヤーの手札情報を渡すset_gamehist(room_id_num,all_player_handinfo):

room_id は部屋のurlから手札情報は勝利者判定の回の記事で作成したものをつかう

この時点で1つ目のroom_idは準備OK

ルームプレイヤー全員の情報のリストから一人ずつ取り出して処理
for playerinfo in all_player_handinfo:

プレイヤー情報から紐づいたUSERNAME情報を分離
user = playerinfo.get('user_name')

これで2つ目のuser_nameの準備もOK

手札情報をループさせ 1行の文字列にする
for hand in playerinfo.get('hand'):
hands+= " "+hand.cleaned_data['mark'] + str(hand.cleaned_data['num']) ;

手札のカード1枚ずつループさせその情報を文字列として連結させる
ここが思ったより苦戦したfrom.objectから特定のカラムを取得するには

obj.cleaned_data['<columnName>']

とすると指定のカラムの値を取得できる

これで3つ目handsも完成

残りの2つはそのままplayer情報に含まれているのでそのまま利用して

hist_list.append(GameHistroies(
<column_key>=<column_value>


・,

))

としてとうろく

あとはbulk_createでまとめて登録するだけど完成


これで履歴の登録ができた

次回予定

最後にviewと連携して表示を変更する

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