使用椭圆形,循环和循环创建的游戏

时间:2016-06-27 15:46:14

标签: python tkinter

我正在制作一个程序,在用户输入一个度数以便在其位置击中随机生成的目标之后从大炮发射子弹。如果你能够在每次第一次尝试时击中目标,该程序工作正常,但似乎我想念它创建一个新目标,就像它应该,但不删除旧目标。关于如何纠正这个问题的任何想法?

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

2 个答案:

答案 0 :(得分:0)

我看到的唯一地点w.delete(Target)位于' if hit'块。你需要将它添加到其他将被执行的地方。我认为这是在for循环之后,if Win == True:之前。

答案 1 :(得分:0)

我相信我已经为你修好了,下面是代码:

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

希望这对你有用,谢谢。