楕円、while ループ、for ループで作成されたゲーム
私は、ユーザーがランダムに生成されたターゲットをその位置で攻撃する角度を入力した後、大砲から弾丸を発射するプログラムに取り組んでいます。毎回最初の試行でターゲットをヒットできる場合、プログラムは正常に動作しますが、そうでない場合、想定どおりに新しいターゲットを作成しますが、古いターゲットは削除しません。それを修正する方法はありますか?
from tkinter import *
import time
import math
import random
master = Tk()
w = Canvas(master, width=800,height=800, bg="white")
w.pack()
#Cannon
Img1 = PhotoImage(file="goldcannon.gif")
Pic1 = w.create_image(85,600, image=Img1)
#Grass
w.create_rectangle(0,645, 800,800, fill="green")
w.update()
Choice = "Yes"
Win = False
while(True):
if Choice == "No":
TY = w.create_text(400,400, text="Thank you for playing!", font="arial")
break
x = []
#Cannon Target
Target_x = 700
Target_y = random.randrange(100,560)
Target = w.create_oval(Target_x,Target_y, Target_x+25,Target_y+25, fill="red")
while(True):
if Choice == "No":
break
#Cannon Degree
degree = simpledialog.askstring("Cannon Degree", "What is your guess?", \
initialvalue="Enter a Degree")
degree = 90 - int(degree)
#Cannon Bullet
bMove = w.create_oval(150,560, 150+10,560+10, fill="black")
for i in range(90):
w.move(bMove,math.sin(math.radians(degree))*10, \
-math.cos(math.radians(degree))*10)
time.sleep(0.06)
w.update()
x = w.find_overlapping(Target_x-10,Target_y, Target_x+35,Target_y+35)
if len(x)>1:
w.delete(bMove)
Hit = w.create_text(400,400, text="You hit the target!", font="arial")
Choice = simpledialog.askstring("Hello", "Would you like to play again?", \
initialvalue="Yes or No")
w.delete(Hit)
w.delete(Target)
Win = True
break
if Win == True:
break
------------に答える------------
唯一の場所veow.delete(Target) が 'if hit' ブロック内にあることを確認します。紛失ごとに実行される別の場所に追加する必要があります。 for ループの後、if Win == True: の前だと思います。
------------に答える------------
修正したと思います。コードは次のとおりです:
from tkinter import *
import time
import math
import random
master = Tk()
w = Canvas(master, width=800,height=800, bg="white")
w.pack()
#Cannon
Img1 = PhotoImage(file="cannon.gif")
Pic1 = w.create_image(85,600, image=Img1)
#Grass
w.create_rectangle(0,645, 800,800, fill="green")
w.update()
Choice = "Yes"
Win = False
while(True):
if Choice == "No":
TY = w.create_text(400,400, text="Thank you for playing!", font="arial")
break
x = []
#Cannon Target
Target_x = 700
Target_y = random.randrange(100,560)
Target = w.create_oval(Target_x,Target_y, Target_x+25,Target_y+25, fill="red")
while(True):
if Choice == "No":
break
#Cannon Degree
degree = simpledialog.askstring("Cannon Degree", "What is your guess?", \
initialvalue="Enter a Degree")
degree = 90 - int(degree)
#Cannon Bullet
bMove = w.create_oval(150,560, 150+10,560+10, fill="black")
for i in range(90):
w.move(bMove,math.sin(math.radians(degree))*10, \
-math.cos(math.radians(degree))*10)
time.sleep(0.06)
w.update()
x = w.find_overlapping(Target_x-10,Target_y, Target_x+35,Target_y+35)
if len(x)>1:
w.delete(bMove)
Hit = w.create_text(400,400, text="You hit the target!", font="arial")
Choice = simpledialog.askstring("Hello", "Would you like to play again?", \
initialvalue="Yes or No")
w.delete(Hit)
w.delete(Target)
Win = True
break
if Win == True:
w.create_oval(Target_x+30,Target_y+30, Target_x+30,Target_y+30, fill='white')
Win = False
print('why hello')
break
うまくいきますように。ありがとうございます。
タグ:
関連記事:
c# - 下位互換性を損なうことなくパラメーターの名前を変更する
Swiffy ランタイムはどのくらいの期間サポートされますか?