ボウリングスコア計算アプリ作成

IT

ボウリングスコアを計算するアプリ(完全に動かない)を作った

まず、エクセルで設計を考えて、

フロントページを作る。

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

入力ページに移動する。

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

計算して出力しました。

今回は全て「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})

コメント