質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

296閲覧

NoneTypeエラーの解決法

shino_04

総合スコア7

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1グッド

0クリップ

投稿2019/09/04 02:08

前提・実現したいこと

8月上旬より「10才からはじめるプログラミング図鑑 スクラッチ&Python超入門」という書籍を使って独学で勉強しています。この図書の最後の方に、Pythonを使って潜水艦ゲームを作ってみよう、というコードが書かれたページがあります。そのコードを書き写しているのですが、どうしてもNoneTypeというエラーが出てしまいます。
画像の部分がNoneTypeになっているのだと思いますが、どう解決すればよいのかがさっぱりわかりません…。

発生している問題・エラーメッセージ

score += collision() TypeError: unsupported operand type(s) for +=: 'int' and 'NoneType'

該当のソースコード

Python

1#潜水艦ゲーム 2"""ルールなど 3・矢印キーを使って潜水艦を操作する 4・水中の泡を割ると得点を得られる 5・ゲーム時間は30s 6・1000点獲得するとボーナスタイムが得られる 7・時間切れとなればゲーム終了""" 8 9#ステップ1 10#ウィンドウを作る 11from tkinter import * 12HEIGHT = 500 13WIDTH = 800#ウィンドウサイズ指定##500×800 14window = Tk() 15window.title('潜水艦ゲーム') 16c = Canvas(window, width=WIDTH, height=HEIGHT, bg='darkblue')#背景色は深青色 17c.pack() 18 19#ステップ2 20#簡易表示の潜水艦を作る 21ship_id = c.create_polygon(5, 5, 5, 25, 30, 15, fill='red')#赤の三角形 22ship_id2 = c.create_oval(0, 0, 30, 30, outline='red')#三角形の赤の外接円 23SHIP_R = 15#潜水艦の半径##潜水艦の大きさとなる 24MID_X = WIDTH / 2 25MID_Y = HEIGHT / 2#中心座標(x,y)=(400,250) 26c.move(ship_id, MID_X, MID_Y) 27c.move(ship_id2, MID_X, MID_Y)#潜水艦を形作る図形二つを画面中央に置く 28 29#ステップ3 30#潜水艦を動かす 31SHIP_SPD = 10#キーを動かしたとき10進む 32def move_ship(event): 33 if event.keysym == 'Up': 34 c.move(ship_id, 0, -SHIP_SPD) 35 c.move(ship_id2, 0, -SHIP_SPD)#↑で10上に進む 36 elif event.keysym == 'Down': 37 c.move(ship_id, 0, SHIP_SPD) 38 c.move(ship_id2, 0, SHIP_SPD)#↓で10下に進む 39 elif event.keysym == 'Left': 40 c.move(ship_id, -SHIP_SPD, 0) 41 c.move(ship_id2, -SHIP_SPD, 0)#←で10左に進む 42 elif event.keysym == 'Right': 43 c.move(ship_id, SHIP_SPD, 0) 44 c.move(ship_id2, SHIP_SPD, 0)#→で10右に進む 45c.bind_all('<Key>', move_ship) 46 47#ステップ4 48#泡を作る 49from random import * 50bub_id = list()#泡のid 51bub_r = list()#泡の半径 52bub_speed = list()#泡の速さ 53MIN_BUB_R = 10#最小の泡の半径 54MAX_BUB_R = 30#最大の泡の半径 55MAX_BUB_SPD = 10#泡の最大速度 56GAP = 100 57def create_bubble(): 58 x = WIDTH + GAP#泡のx座標 59 y = randint(0, HEIGHT)#y座標 60 r = randint(MIN_BUB_R, MAX_BUB_R)#最小半径と最大半径の中でランダムの大きさの泡を生成 61 id1 = c.create_oval(x - r, y - r, x + r, y + r, outline='white')#線色白の円を生成 62 bub_id.append(id1)#泡のid 63 bub_r.append(r)#泡の半径 64 bub_speed.append(randint(1, MAX_BUB_SPD))#泡の速度をリストにセットした 65 66#ステップ5 67#泡を動かす 68def move_bubbles(): 69 for i in range (len(bub_id)):#リストの中の泡の情報を順にみていく 70 c.move(bub_id[i], -bub_speed[i], 0)#リストで指定されたスピードに合わせて泡を動かす 71 72#ステップ7 73#特定の泡がどこにあるのかを見つける関数を作る 74def get_coords(id_num): 75 pos = c.coords(id_num) 76 x = (pos[0] + pos[2])/2#泡の中心のx座標 77 y = (pos[1] + pos[3])/2#泡の中心のy座標 78 return x, y 79 80#ステップ8 81#泡を割る方法 82def del_bubble(i): 83 del bub_r[i] 84 del bub_speed[i]#半径と速度を記録するリストから泡を取り去る 85 c.delete(bub_id[i])#キャンバスから泡を消す 86 del bub_id[i]#idのリストから泡を消す 87def clean_up_bubs():#ステップ9 88 for i in range(len(bub_id)-1, -1, -1):#泡のリストの最後から先頭へと読み進める 89 x,y = get_coords(bub_id[i]) 90 if x < -GAP: 91 del_bubble(i) 92from math import sqrt#ステップ11 93def distance(id1, id2): 94 x1, y1 = get_coords(id1)#1番目のものの位置を調べる 95 x2, y2 = get_coords(id2)#2番目のものの位置を調べる 96 return sqrt((x2 - x1)**2 + (y2 - y1)**2)#二つのものの距離を出す 97def collision():#ステップ12##泡を割る 98 points = 0#ポイントを一度集計 99 for bub in range(len(bub_id)-1, -1, -1): 100 if distance(ship_id2, bub_id[bub]) < (SHIP_R + bub_r[bub]):#潜水艦と泡がぶつかったか判定 101 points += (bub_r[bub] + bub_speed[bub])#それぞれの泡のポイントを集計してpointsに加える 102 del_bubble(bub)#泡を取り去る 103 return points#今回のチェックでカウントされたポイントを返す 104 105#ステップ6,10,13 106from time import sleep, time#time関数から必要なものを呼び出す 107BUB_CHANCE = 10 108score = 0#ゲーム開始時のスコアを0にする 109#メインのループ 110while True: 111 if randint(1, BUB_CHANCE) == 1: 112 create_bubble() 113 move_bubbles() 114 clean_up_bubs() 115 score += collision() 116 print(score) 117 window.update() 118 sleep(0.01) 119

試したこと

何をすればよいのかが分からず、誤字脱字はないかくらいしかやっていません。詳しい知識等がまだ何もないため、かみ砕いて説明していただけると助かります…。
イメージ説明

補足情報(FW/ツールのバージョンなど)

yodel👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

collision関数のreturn文をfor文の中に書いてしまっているのが原因だと思います。
return文のインデントを1つ下げてみてください。

投稿2019/09/04 02:16

mistn

総合スコア1191

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shino_04

2019/09/04 02:22

!return文のインデントを下げたら解決しました! スペルのみを気にしてそこは気にかけていなかったです…。ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問