前提
インデントはちゃんとできていて、問題点が見つからない
###作っているコード
Python
1import time 2from random import randrange,randint 3from tkinter import Canvas,Tk,messagebox,font 4 5キャンバス幅 = 800 6キャンバス高さ = 400 7 8root = Tk() 9c = Canvas(root,width=キャンバス幅,height=キャンバス高さ,background='dark blue') 10c.create_oval(400,100,480,180,fill='deep sky blue',width=0) 11c.create_oval(-80,-80,120,120,fill='orange',width=0) 12c.pack() 13 14敵機色 = 'cyan' 15敵機幅 = 50 16敵機高さ = 35 17敵機初期位置x1 = 20 18敵機初期位置y1 = キャンバス高さ / 2 - 敵機高さ / 2 19敵機初期位置x2 = 敵機初期位置x1 + 敵機幅 20敵機初期位置y2 = 敵機初期位置y1 + 敵機高さ 21敵機 = c.create_rectangle(敵機初期位置x1,敵機初期位置y1,敵機初期位置x2,敵機初期位置y2,fill=敵機色,width=1) 22難易度 = 0.9 23 24自機色 = 'green' 25自機幅 = 50 26自機高さ = 35 27自機初期位置x1 = キャンバス幅 - 自機幅 - 20 28自機初期位置y1 = キャンバス高さ / 2 - 自機高さ / 2 29自機初期位置x2 = 自機初期位置x1 + 自機幅 30自機初期位置y2 = 自機初期位置y1 + 自機高さ 31自機 = c.create_rectangle(自機初期位置x1,自機初期位置y1,自機初期位置x2,自機初期位置y2,fill=自機色,width=1) 32 33game_font = font.nametofont('TkFixedFont') 34game_font.config(size=25) 35 36ライフ = 1 37敵機ライフ = 1 38ライフテキスト = c.create_text(10,キャンバス高さ - 10,anchor='sw',font=game_font,fill='white',text='プレイヤー2のライフ:' + str(敵機ライフ)) 39敵機ライフテキスト = c.create_text(キャンバス幅 - 10,10,anchor='ne',font=game_font,fill='white',text='プレイヤー1のライフ:' + str(ライフ)) 40 41弾速さ = 20 42 43弾リスト = [] 44敵弾リスト = [] 45 46def 敵機上に動く(イベント): 47 (敵機x1,敵機y1,敵機x2,敵機y2) = c.coords(敵機) 48 if 敵機y1 > 20: 49 c.move(敵機,0,-20) 50 51def 敵機下に動く(イベント): 52 (敵機x1,敵機y1,敵機x2,敵機y2) = c.coords(敵機) 53 if 敵機y2 < キャンバス高さ - 20: 54 c.move(敵機,0,20) 55 56def 敵弾を作る(敵弾): 57 (敵機x1,敵機y1,敵機x2,敵機y2) = c.coords(敵機) 58 敵弾x = 敵機x2 59 敵弾y = (敵機y1 + 敵機y2) / 2 60 敵弾 = c.create_oval(敵弾x,敵弾y - 5,敵弾x + 10,敵弾y + 5,fill='gold',width=0) 61 敵弾リスト.append(敵弾) 62 63def 敵弾を動かす(): 64 for 敵弾 in 敵弾リスト: 65 (敵弾x1,敵弾y1,敵弾x2,敵弾y2) = c.coords(敵弾) 66 c.move(敵弾,10,0) 67 if 敵弾y2 > キャンバス幅: 68 敵弾リスト.remove(敵弾) 69 c.delete(敵弾) 70 root.after(弾速さ,敵弾を動かす) 71 72def 上に動く(イベント): 73 (x1,y1,x2,y2) = c.coords(自機) 74 if y1 > 20: 75 c.move(自機,0,-20) 76 77def 下に動く(イベント): 78 (x1,y1,x2,y2) = c.coords(自機) 79 if y2 < キャンバス高さ - 20: 80 c.move(自機,0,20) 81 82def 弾を作る(弾): 83 (x1,y1,x2,y2) = c.coords(自機) 84 弾x = x1 85 弾y = (y1 + y2) / 2 86 弾 = c.create_oval(弾x,弾y - 5,弾x + 10,弾y + 5,fill='gold',width=0) 87 弾リスト.append(弾) 88 89def 弾を動かす(): 90 for 弾 in 弾リスト: 91 (弾x1,弾y1,弾x2,弾y2) = c.coords(弾) 92 c.move(弾,-10,0) 93 if 弾y1 < 0: 94 弾リスト.remove(弾) 95 c.delete(弾) 96 root.after(弾速さ,弾を動かす) 97 98def チェック(): 99 for 弾 in 弾リスト: 100 (弾x1,弾y1,弾x2,弾y2) = c.coords(弾) 101 (敵機x1,敵機y1,敵機x2,敵機y2) = c.coords(敵機) 102 if 弾x1 + 10 > 敵機x1 and 弾x2 - 10 < 敵機x2 and 弾y1 > 敵機y1 and 弾y2 < 敵機y2: 103 弾リスト.remove(弾) 104 c.delete(弾) 105 敵機ライフを失う() 106 root.after(1,チェック) 107 108def 敵機チェック(): 109 for 敵弾 in 敵弾リスト: 110 (敵弾x1,敵弾y1,敵弾x2,敵弾y2) = c.coords(敵弾) 111 (自機x1,自機y1,自機x2,自機y2) = c.coords(自機) 112 if 敵弾x1 + 10 > 自機x1 and 敵弾x2 - 10 < 自機x2 and 敵弾y1 > 自機y1 and 敵弾y2 < 自機y2: 113 c.delete(敵弾) 114 ライフを失う() 115 return 敵弾x1,敵弾y1,敵弾x2,敵弾y2 116 root.after(1,敵機チェック) 117 118def ライフを失う(): 119 global 敵機ライフ 120 敵機ライフ -= 1 121 c.itemconfigure(敵機ライフテキスト,text='プレーヤー1のライフ:' + str(敵機ライフ)) 122 123def 敵機ライフを失う(): 124 global ライフ 125 ライフ -= 1 126 c.itemconfigure(ライフテキスト,text='プレーヤー2のライフ:' + str(ライフ)) 127 128def チェック2(): 129 if ライフ < 1: 130 c.delete() 131 messagebox.showinfo('ゲームオーバー!','勝者は' + 'プレイヤー1' + 'でした') 132 root.destroy() 133 time.sleep(100000) 134 root.after(1,チェック2) 135 136def 敵機チェック2(): 137 if 敵機ライフ < 1: 138 c.delete() 139 messagebox.showinfo('ゲームオーバー!','勝者は' + 'プレイヤー2' + 'でした') 140 root.destroy() 141 time.sleep(100000) 142 root.after(1,敵機チェック2) 143 144c.bind('<Up>',上に動く) 145c.bind('<Down>',下に動く) 146c.bind('<space>',弾を作る) 147c.bind('<w>',敵機上に動く) 148c.bind('<s>',敵機下に動く) 149c.bind('<c>',敵弾を作る) 150c.focus_set() 151 152root.after(1000,敵弾を動かす) 153root.after(1000,弾を動かす) 154root.after(1,チェック) 155root.after(1,敵機チェック) 156root.after(1,チェック2) 157root.after(1,敵機チェック2) 158root.mainloop()
問題点
Python
1def 弾を動かす(): 2 for 弾 in 弾リスト: 3 (弾x1,弾y1,弾x2,弾y2) = c.coords(弾) 4 c.move(弾,0,-10) 5 if 弾y2 < 0: 6 弾リスト.remove(弾) 7 c.delete(弾) 8 root.after(10,弾を動かす)
だと問題なく動くのに、
Python
1def 敵弾を動かす(): 2 for 敵弾 in 敵弾リスト: 3 (敵弾x1,敵弾y1,敵弾x2,敵弾y2) = c.coords(敵弾) 4 c.move(敵弾,0,10) 5 if 敵弾y2 > キャンバス高さ: 6 敵弾リスト.remove(敵弾) 7 c.delete(敵弾) 8 root.after(10,敵弾を動かす)
だと
(敵弾x1,敵弾y1,敵弾x2,敵弾y2) = c.coords(敵弾)
の位置にエラーが発生する
発生している問題・エラーメッセージ
ValueError: not enough values to unpack (expected 4, got 0)
補足情報(FW/ツールのバージョンなど)
なお、エラーが起こるのは敵機チェック()でifがなりたってからで、
敵弾を動かす()が実行された後ではないところも謎
Python 3.8.2 Windows10 32bit
回答1件
あなたの回答
tips
プレビュー