ブラックジャックを目指す 19
今回やること
役の確認チェック
プレイヤーの行動処理
前回までやったこと
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ターン目の流れの確認
カードをドローする処理の動作確認
フェイズを進行させる
手札の表示
点数処理
役の確認
BJにはそのままの数字の合計では表せない(役)が存在する
初手で21が完成するBlackJack
合計が21を超えてしまうBustである
これらを判定するメゾットを追加する
追加メゾット
<appFolder>/views.py 追加分
def is_bust_or_bj(card_list):
point =get_card_point(card_list)
if point > 21 :
return 'bust';
if point ==21:
if len(card_list)==2:
return 'BlackJack'
return point;
現在値のポイントの合計は前回作成したメゾットを使えばよい
get_card_point(card_list)がそれにあたる
あとはifで21を超えているか
ジャスト21でかつカード枚数が2枚であることを判断させてその結果を返すだけ
前回確認したviewメゾットの手札のポイントを計算してHTML(template)に送っている場所を合計値→役の結果、または合計に変更
<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})
#手札の点数を計算する
#card_point=get_card_point(hand_card)
card_point=is_bust_or_bj(hand_card)
context.update({'card_point':card_point})
return render(request ,template_name ,context)
変更部分は
#card_point=get_card_point(hand_card)
card_point=is_bust_or_bj(hand_card)
前回の点数だけを出力する部分をコメントアウトし役判定を行って役がない場合点数を表示するように修正
確認
合計21が初手でそろっている状態の時の表記の変更を確認
行動処理の流れを確認
手札を表示(済)
カードを引く or 引かずに確定するのボタンを表示
引くときはカードを1枚加算
役を確認→Bustした場合は終了
終了しない場合は最初に戻る
カードを引く or 引かずに確定するのボタンを表示
<appFolder>/templates/<appname>/gemeroom.html
{% extends 'base.html' %}
{% block content %}
<p>合計</p>{{card_point}}
{% for card in playerhand %}
<ul>
{{card.as_ul}}
</ul>
{% endfor %}
{% if my_turn %}
<form class="game_from" method="post">
{% csrf_token %}
-----略------------
{% if turn ==3 %}
<input type =submit name ="hit" value = "カードを引く">
<input type ="submit" namer = "stand" value ="勝負する" >
{% endif %}
</form>
{% endif %}
{% endblock %}
{% if my_turn %}
カードを引くかやめるかの選択は3ターン目(初期手札を配り終わった後)
かつ自分に選択権がある状態(my_rurnフラグによって指定)のときのみ表示させる
カードを引くを選んだあとの処理
<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:
context.update({'turn':room.phase_counter})
if request.method == 'GET':
#手札を取得する
hand_card = get_playerHand(room,roomplayer)
#コンテキストに追加する
context.update({'playerhand':hand_card})
#手札の点数を計算する
#card_point=get_card_point(hand_card)
#手札の役の判定を行い役でない場合は点数を計算する
card_point=is_bust_or_bj(hand_card)
#現時点でプレイヤーがまだカードを引けるならTRUE
if roomplayer.turn_player_flag:
context.update({'my_turn':True})
context.update({'card_point':card_point})
if request.method == 'POST':
#カードを引くを選択
if 'hit' in request.POST.keys():
draw_card(room,roomplayer)
hand_card =get_playerHand(room,roomplayer)
if is_bust_or_bj(hand_card)=='bust':
roomplayer.turn_player_flag = False
roomplayer.save()
phase_counter_check_and_go(room_id)
if 'stand' in request.POST.keys():
roomplayer.turn_player_flag = False
roomplayer.save()
phase_counter_check_and_go(room_id)
redirect(reverse_lazy('game:gameroom' ,kwargs={'room_id':room_id}))
送信データはPOSST送信で送っているので(templateのformがmethod=post)
request.method == 'POST'の中の処理が走る
if 'hit' in request.POST.keys():
if 'stand' in request.POST.keys():
hitはカードを引くを選んだ時の処理
standは勝負(現在の手札で勝負する)を選んだ時の処理
これの分岐はtemplateのsubmitのボタンのnameをkeyとしてvalueの中身(ボタンに表示されているテキスト)を送信するのでkeyのなかに押されたボタンの情報を取得できる
カードを引く処理に関しては初期手札分配の時に作成したのでそのメゾットを呼ぶ
役を確認→Bustした場合は終了
今回の上部で作ったもので確認可能 bustした場合bustの文字列が返ってくるのでそれを利用し
is_bust_or_bj(hand_card)=='bust':
で処理を行える
bustした場合の後の処理は
プレイヤーが自ら終了を押したときと変わらない
roomplayer.turn_player_flag = False
でターンフラグをOFFにして
roomplayer.save()
フラグ情報をDBに保存
phase_counter_check_and_go(room_id)全員の行動可能フラグ(myturn)がoff(false)になっていることを確認しすべてoffならターンを進める
そのあと今のページにリダイレクトしてGet時の処理をする。
確認
アクセスを行いカードを引くをれんぞくでおしてbustになりボタンが消えるのを確認
別のプレイヤーで勝負を押す
すべてのプレイヤーの行動権がなくなったのでターンが進行したことを確認
次回予定
全員の手札情報の公開
点数比較と勝利者の選定
これらを実装できればする予定
この記事が気に入ったらサポートをしてみませんか?