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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

1027閲覧

ファミコン時代の様な車が移動するゲームでエラーが起こります

kakini

総合スコア40

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/04/12 03:49

pythonで本に書いてある車が道を移動するゲーム(ファミコン時代の様なゲーム)を作ったのですが
エラーが起こってうまく動いてくれません
エラーの内容は
Traceback (most recent call last):
File "C:/Users/user/AppData/Local/Programs/Python/Python36-32/drivegame2.py", line 41, in <module>
if name=="main": init_game()
File "C:/Users/user/AppData/Local/Programs/Python/Python36-32/drivegame2.py", line 9, in init_game
win.bind("<Left>" , key_event_left)
AttributeError: 'NoneType' object has no attribute 'bind'
こちらです。

これは下記のコードを実行した際出てきました
下記のコードは本に書いてあったコードを3回やり直して打ち直しましたが全く同じエラーが出てきます

python

1from drivegame_info import ginfo 2from drivegame_map import create_map_line 3from drivegame_draw import * 4import tkinter.messagebox as msgbox 5 6def init_game(): 7 global win 8 win=create_window(ginfo) 9 win.bind("<Left>" , key_event_left) 10 win.bind("<Right>" , key_event_right) 11 12 game_loop() 13 win.mainloop() 14 15def key_event_left(e): 16 if ginfo["car"]>0: 17 ginfo["car"]-=1 18def key_event_right(e): 19 if ginfo["car"]<=ginfo["cols"]-1: 20 ginfo["car"]+=1 21 22def game_loop(): 23 draw_map(ginfo) 24 win.title("ドライブゲームスコア="+str(ginfo["score"])) 25 26 map_data=ginfo["map_data"] 27 v=map_data[ginfo["rows"]-2][ginfo["car"]] 28 if v != 0: 29 msgbox.showinfo( 30 title="ゲームオーバー", 31 message="コースアウトしました\n"+ 32 "スコア="+str(ginfo["score"])) 33 quit() 34 35 ginfo["score"]+=10 36 del(map_data[ginfo["rows"]-1]) 37 line=create_map_line(ginfo) 38 map_data.insert(0,line) 39 win.after(100, game_loop) 40 41if __name__=="__main__": init_game() 42

ちなみに上記の最初の行でインポートしてるファイルのコードはこちらになります
ファイル名drivegame_info

python

1ginfo={ 2 #画面サイズ 3 "rows":20, 4 "cols":30, 5 "tile_size":32, 6 #道路生成用 7 "cx":10, 8 "size":8, 9 "dir":0, 10 "map_data":[], 11 #プレイヤー管理用 12 "car":13, 13 "score":0, 14 #キャンバスや画像 15 "cv":None, 16 "car_img":None 17 } 18

ファイル名drivegame_map

python

1from random import randint 2 3def create_map_line(ginfo): 4 5 if randint(0,99)<10: 6 ginfo["dir"]=randint(-1,1) 7 8 cx,sz,gdir=(ginfo["cx"],ginfo["size"],ginfo["dir"]) 9 if (gdir==-1 and cx<=1): 10 ginfo["dir"]*=-1 11 if (gdir==1 and (cx+sz)>=(ginfo["cols"]-1)): 12 ginfo["dir"]*=-1 13 14 ginfo["cx"]+=ginfo["dir"] 15 16 line=[1]*ginfo["cols"] 17 18 for i in range(ginfo["size"]): 19 line[i+ginfo["cx"]]=0 20 return line 21 22def create_map(ginfo): 23 map_data=[] 24 for i in range(ginfo["rows"]): 25 line=create_map_line(ginfo) 26 map_data.insert(0,line) 27 return map_data 28 29if __name__=="__main__": 30 ginfo={ 31 "rows":20, 32 "cols":30, 33 "dir":0, 34 "cx":10, 35 "size":8 36 } 37 map_data=create_map(ginfo) 38 for row in map_data:print(row)

ファイル名drivegame_draw

python

1from tkinter import * 2from PIL import Image, ImageTk 3from drivegame_info import ginfo 4from drivegame_map import * 5 6def create_window(ginfo): 7 #ウィンドウサイズを計算 8 w=ginfo["cols"]*ginfo["tile_size"] 9 h=ginfo["rows"]*ginfo["tile_size"] 10 #ウィンドウとキャンバスを作成 11 win=Tk() 12 ginfo["cv"]=Canvas(win, width=w, height=h) 13 ginfo["cv"].pack() 14 #画像を読み込み 15 img=Image.open("car32.png") 16 ginfo["car_img"]=ImageTk.PhotoImage(img) 17 #走行コースデータを作成 18 ginfo["map_data"]=create_map(ginfo) 19 20#道路と車を描画 21def draw_map(ginfo): 22 cv=ginfo["cv"] 23 cv.delete("all") 24 #道路を描画(左上から右下へ順に描画) 25 tile_size=ginfo["tile_size"] 26 colors=["white","#442233"] #走行コースの色定義 27 for y in range(ginfo["rows"]): 28 y1=y*tile_size 29 y2=y1+tile_size 30 for x in range(ginfo["cols"]): 31 x1=x*tile_size 32 x2=x1+tile_size 33 #任意の色でタイルを描画 34 v=ginfo["map_data"][y][x] 35 color=colors[v] 36 cv.create_rectangle(x1,y1,x2,y2, 37 width=0,fill=color) 38 #車を描画(Y座標は固定で、下から2行目) 39 x=ginfo["car"]*ginfo["tile_size"] 40 y=(ginfo["rows"]-2)*ginfo["tile_size"] 41 cv.create_image(x,y,image=ginfo["car_img"],anchor=NW) 42 43if __name__=="__main__": 44 win=create_window(ginfo) 45 draw_map(ginfo) 46 win.mainloop() 47

この3つのファイルに関しては動作をチェックした際特に問題なく動いたので
問題があるとすれば一番最初に書いたコードにある筈ですが
何度見直しても本と一緒の筈なのに動いてくれません

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

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

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

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

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

YasuhiroMiyake

2019/04/12 04:16

ソースは読んでいませんが、書籍の出版社サイトに改定内容などが掲載されている可能性があります。 一度、そちらを確認するのも良いかもしれません。
guest

回答1

0

ベストアンサー

drivegame_drawcreate_windowに戻り値がないので、winNoneになっていますね。
私の方で環境を作ってみて、create_windowの最後にreturn winを追加したら、ゲームが動くようになりました。

投稿2019/04/12 04:36

編集2019/04/12 04:36
y.nakamura

総合スコア190

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

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

kakini

2019/04/12 06:57

こんにちは ありがとうございます。 こちらでも同じ事をしたら解決しました ちなみにもし分かればちょっとお聞きしたいんですが 最初の記述でエラーが出たとき File "C:/Users/user/AppData/Local/Programs/Python/Python36-32/drivegame2.py", line 41, in <module> if name=="main": init_game() File "C:/Users/user/AppData/Local/Programs/Python/Python36-32/drivegame2.py", line 9, in init_game win.bind("<Left>" , key_event_left) AttributeError: 'NoneType' object has no attribute 'bind' この様に出てきましたが、このエラーは、なにでエラーが出たと伝えてきてるんでしょうか?
y.nakamura

2019/04/12 07:14 編集

解決したようで良かったです。 エラー内容は、下から順にエラーメッセージ、エラー発生箇所、以降エラー発生箇所を実行するまでの経路です。 なので今回のエラー内容は、`init_game`内の`win.bind("<Left>" , key_event_left)`を実行したら 'NoneType' object has no attribute 'bind' エラーが発生した、ということですね。 `win`が`NoneType`だということが読み解けるので、その直前で`win`に代入しているはずの`create_window`に何か問題があると当たりをつけました。
kakini

2019/04/13 05:37

ありがとうございます。 エラーのメッセージの見方までは、本にはほとんど書いてないので 最後のline9辺りで何か問題があるのかしか見当がつかなかったので苦労しました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問