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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Python

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

Q&A

解決済

1回答

788閲覧

なぜか同じようなことをしていても片方だけにエラーが発生してしまう

Picmin3daisuki

総合スコア11

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Python

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

0グッド

1クリップ

投稿2020/03/10 14:31

編集2020/03/12 07:00

前提

インデントはちゃんとできていて、問題点が見つからない

###作っているコード

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 forin 弾リスト: 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 forin 弾リスト: 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 forin 弾リスト: 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

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

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

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

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

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

otn

2020/03/10 15:58

コードを ```Python と ``` の行で囲んで、インデントがわかるようにしてください。
guest

回答1

0

ベストアンサー

"(敵弾x1,敵弾y1,敵弾x2,敵弾y2) = c.coords(敵弾)"は「文字列リテラル」です。これ自体は、書いても特に何もしないのと同じ結果になります。なので2つのコードは明確に「違うもの」です。
(最初のコードで当該行をコメントアウトすれば、2つめのコードと同じ動作になるはずです)

なぜこれでValueError: not enough values to unpack (expected 4, got 0)のエラーになるのかはわかりません。その関数だけで見れば、敵弾x1,敵弾y1,敵弾x2,敵弾y2のいずれの変数も作成されないはずですから、敵弾y2NameErrorになりそうな気がします。同名のグローバル変数とかがあればそっちを見に行くので、その辺が効いているのかもしれません。

投稿2020/03/10 18:21

hayataka2049

総合スコア30935

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

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

Picmin3daisuki

2020/03/11 05:32

すみません、分かりにくかったですね あのダブルクォーテーションマークはエラーの場所をわかりやすくしようとしたものです 修正しておきますね
hayataka2049

2020/03/12 02:15

そのコードだけではよくわかりません。
Picmin3daisuki

2020/03/12 05:35

じゃあ作ったコード全部書いておきます これでわかるでしょうか?
hayataka2049

2020/03/12 08:25

「敵機チェック」の中で、「チェック」と同様に 弾リスト.remove(弾) が必要になるのでしょう。これがないと後で「敵弾を動かす」が呼ばれたときに、もう存在しなくなった弾を動かそうとしてエラーになります。 なお、forの中でlist.removeすることには微妙な問題があるので、(今回はたまたま顕在化していないかもしれませんが)対処が必要です。以前、私のブログで記事にしていたので、参考に貼っておきます。 https://www.haya-programming.com/entry/2018/06/02/163415
Picmin3daisuki

2020/03/12 12:26

やってみたら問題なく動きました! ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問