ボウリングスコアを計算するアプリ(完全に動かない)を作った
まず、エクセルで設計を考えて、

フロントページを作る。

「計算する」をクリックすると、

入力ページに移動する。

入力して「送信」すると、

計算して出力しました。
今回は全て「5」を入力して、得点は145です。

空欄があるとエラーです。これはDjangoの機能でエラーになってもアプリが落ちずに、エラーを
出力しています。便利ですね。

全て10点、つまりパーフェクトを取った場合、300点になります。
しかし、

100点になりました。
ここは改善点です。時間がある時に修正したいと思います。
以下、作成したコード
forms.py
from django import forms
from django.forms import formset_factory
class FrameForm(forms.Form):
# 1投目と2投目のスコアをそれぞれ受け取る
first_ball = forms.IntegerField(label='1投目')
second_ball = forms.IntegerField(label='2投目')
# 10フレーム分のフォームセットを作成
FrameFormset = formset_factory(FrameForm, extra=10)
urls.py
from django.urls import path
from .views import indexView,InputScoreView,ScoreResultView
urlpatterns = [
path('',indexView.as_view(),name='index'),
path('InputScore',InputScoreView.as_view(),name='InputScore'),
path('ScoreResult',ScoreResultView.as_view(),name='ScoreResult'),
]
views.py
from django.shortcuts import render
from django.views.generic import TemplateView
from .forms import FrameForm,FrameFormset
class indexView(TemplateView):
def get(self,request):
return render(request,'bowling/bowling_index.html')
class InputScoreView(TemplateView):
def get(self,request):
formset = FrameFormset()
params = {
'formset':formset,
}
return render(request,'bowling/score_input.html',params)
class ScoreResultView(TemplateView):
def post(self, request):
formset = FrameFormset(request.POST) # FrameFormsetに変更
if formset.is_valid():
frames_data = []
for form in formset:
frames_data.append({
'first': form.cleaned_data.get('first_ball'),
'second': form.cleaned_data.get('second_ball')
})
total_score = 0
# 各フレームのスコアを計算するループ
for i in range(10):
frame_score = frames_data[i]['first'] + frames_data[i]['second']
# スペアの判定
if frame_score == 10 and frames_data[i]['first'] != 10:
# 次の1投のボーナス点を加算
if i < 9: # 最終フレーム以外
total_score += 10 + frames_data[i+1]['first']
else: # 最終フレーム
# 最終フレームは3投目まであるため、ボーナス投球も考慮する必要がある
# 今回は簡易的な実装のため省略
total_score += 10
# ストライクの判定
elif frames_data[i]['first'] == 10:
# 次の2投のボーナス点を加算
# 複雑になるため、今回は簡易的な実装とします
total_score += 10
# 通常の計算
else:
total_score += frame_score
params = {
'total_score': total_score, # 合計スコア
}
return render(request, 'bowling/score_result.html', params)
else:
return render(request, 'bowling/score_input.html', {'formset': formset})
コメント