[python]ボウリングのスコア計算の連続ストライクでエラーが出る。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
keito94
記事: 264
登録日時: 7年前
連絡を取る:

[python]ボウリングのスコア計算の連続ストライクでエラーが出る。

#1

投稿記事 by keito94 » 6年前

このリポジトリの方法を参考にこのサイトの課題を、Pythonで作っています。

コード:

    for i in range(throw):
        if pin[i] == 10:
            #
            total = ((pin[i])+(pin[i+1])+(pin[i+2]))
            freamnum += 1
        else:
            if i % 2 == 0:
                rest_pin -= pin[i]
            else:
                freamnum += 1
                if rest_pin - pin[i] == 0:
                    total = (pin[i]+pin[i+1])
                else:
                    rest_pin = 10

            total += pin[i]
ですが…。

コード:

投げた回数を入力してください。3
倒したピンの数を1投ずつ入力してください。10 10 10
Traceback (most recent call last):
  File "C:/Users/keito940/PycharmProjects/BowlingScore/Bowling.py", line 30, in <module>
    Input()
  File "C:/Users/keito940/PycharmProjects/BowlingScore/Bowling.py", line 26, in Input
    score = BowlScore(throw,pin)
  File "C:/Users/keito940/PycharmProjects/BowlingScore/Bowling.py", line 7, in BowlScore
    total = ((pin[i])+(pin[i+1])+(pin[i+2]))
IndexError: list index out of range

Process finished with exit code 1
連続ストライクをやろうとすると、上のログのようなエラーが出ます。
原因は何なのでしょうか?デバッグをして、挙動をチェックしたところ、i=1のときはちゃんとできているようです。
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

YuO
記事: 947
登録日時: 13年前
住所: 東京都世田谷区

Re: [python]ボウリングのスコア計算の連続ストライクでエラーが出る。

#2

投稿記事 by YuO » 6年前

keito94 さんが書きました:原因は何なのでしょうか?
エラーメッセージにちゃんとあります。
keito94 さんが書きました:

コード:

  File "C:/Users/keito940/PycharmProjects/BowlingScore/Bowling.py", line 7, in BowlScore
    total = ((pin[i])+(pin[i+1])+(pin[i+2]))
IndexError: list index out of range
このまんまでしょう。

最終フレームを認識して,最終フレームにストライクまたはスペアだった場合は特別扱いしないといけないのに,それがなされていません。
まぁ,そもそもストライクが1投あると色々おかしくなりそうですが。
第何フレームで,それが1投目か2投目か,などを表示してみると,間違いに気付く可能性が高くなると思います。

アバター
purin52002
記事: 235
登録日時: 7年前
連絡を取る:

Re: [python]ボウリングのスコア計算の連続ストライクでエラーが出る。

#3

投稿記事 by purin52002 » 6年前

オフトピック
(´-ω-`)スッ...

コード:

 total = ((pin[i])+(pin[i+1])+(pin[i+2]))
(`Φ ω Φ´)クワッ!!!

コード:

 total = ((pin[i])+(pin[i+1])+(pin[i+2]))
今コソ開眼ノ刻...^p^
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^

かずま

Re: [python]ボウリングのスコア計算の連続ストライクでエラーが出る。

#4

投稿記事 by かずま » 6年前

keito94 さんが書きました:原因は何なのでしょうか?デバッグをして、挙動をチェックしたところ、
「デバッグをして」というのは、具体的にどういうことをしたのですか?

私なら、次のように print文を挿入して変数の値を見ます。

コード:

    print "throw =", throw
    for i in range(throw):
        if pin[i] == 10:
            #
            print "pin = ", pin
            print "i =", i
            total = ((pin[i])+(pin[i+1])+(pin[i+2]))
            freamnum += 1
Python 2 は print文。Python 3 なら print関数ですね。

アバター
keito94
記事: 264
登録日時: 7年前
連絡を取る:

Re: [python]ボウリングのスコア計算の連続ストライクでエラーが出る。

#5

投稿記事 by keito94 » 6年前

>>かずまさん
ブレークポイントでちゃんと1投目のストライクがちゃんと採点されるのを見たのですが、これだけではだめでしたか…。
print文デバッグについて調べてみようと思ってます。
オフトピック
print文ってデバッグに使えるのか…。ちょっと試してみようかな…
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

アバター
keito94
記事: 264
登録日時: 7年前
連絡を取る:

Re: [python]ボウリングのスコア計算の連続ストライクでエラーが出る。

#6

投稿記事 by keito94 » 6年前

リポジトリのように最終フレームまで入力しないといけないのですが、なんとか完成しました。

コード:

        print("{}フレーム{}投目".format(freamnum, throwcount))
        print("残り%d本" % rest_pin)
        if freamnum > 9:
            bonus = False

            if pin[i] == 10 or rest_pin == 0:
                if not bonus:
                    rest_pin = 10
                    bonus = True

            if bonus:
                if throwcount < 3:
                    throwcount += 1
                    if pin[i] < 9:
                        rest_pin -= pin[i]

                    total += pin[i]
                else:
                    total += pin[i]
                    print("ゲーム終了")
            else:
                if throwcount == 2:
                    total += pin[i]
                    print("ゲーム終了")
                else:
                    rest_pin -= pin[i]
                    throwcount += 1
                    total += pin[i]
        else:
            if pin[i] == 10:
                total += ((pin[i])+(pin[i+1])+(pin[i+2]))
                freamnum += 1
                throwcount = 1
            else:
                if throwcount == 2:
                    freamnum += 1
                    throwcount = 1
                    rest_pin -= pin[i]
                    if rest_pin == 0:
                        total += ((pin[i])+(pin[i+1]))
                        rest_pin = 10
                    else:
                        rest_pin = 10
                        total += pin[i]
                else:
                    throwcount += 1
                    rest_pin -= pin[i]
                    total += pin[i]
ありがとうございました。
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

かずま

Re: [python]ボウリングのスコア計算の連続ストライクでエラーが出る。

#7

投稿記事 by かずま » 6年前

オフトピック
[ code=python] がダメなことに、まだ気が付かないのかなあ。
注意力が足りない人は、プログラマーには向かないように思います。

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 13年前
住所: 北海道札幌市
連絡を取る:

Re: [python]ボウリングのスコア計算の連続ストライクでエラーが出る。

#8

投稿記事 by Dixq (管理人) » 6年前

オフトピック
かずまさん
沖さんの日記のコメントに
http://dixq.net/forum/blog.php?u=480&b=6593
「病気なので仕方ないのです」ってコメントしてますね…

返信

“C言語何でも質問掲示板” へ戻る