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つのファイルに関しては動作をチェックした際特に問題なく動いたので
問題があるとすれば一番最初に書いたコードにある筈ですが
何度見直しても本と一緒の筈なのに動いてくれません
回答1件
あなたの回答
tips
プレビュー