楕円、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 ランタイムはどのくらいの期間サポートされますか?