мой экран черепахи закрывается, как только он открывается - PullRequest
0 голосов
/ 17 января 2020

Я делаю игру с помощью графики tkinter и turtle. Мой режим 2 игрока работает отлично, однако в одиночном режиме экран выключается, как только он открывается. Я попробовал метод exitonclick, но с помощью этого моя черепаха не двигается. Другая проблема, с которой я сталкиваюсь, заключается в том, что я хочу, чтобы внутри изображения была метка, показывающая победителя, так как я могу это сделать.

from tkinter import *
from turtle import *
#Single Player
def single():
    Name_1 = inputname.get().strip()
    opl.destroy()
    windows = Screen()
    windows.title("Bounce Game by TechLord")
    windows.bgcolor("white")
    windows.setup(width=1200, height=760)
    windows.tracer(0)

# Score
score = 0

# paddle a
paddle = Turtle()
paddle.speed(0)
paddle.shape("square")
paddle.color("blue")
paddle.shapesize(stretch_wid=1, stretch_len=5)
paddle.penup()
paddle.goto(0, -330)


# ball
ball = Turtle()
ball.speed(0)
ball.shape("circle")
ball.color("red")
ball.shapesize(stretch_wid=1.2, stretch_len=1.2)
ball.penup()
ball.goto(0, 0)
ball.dx = 1
ball.dy = 1

# Pen
pen = Turtle()
pen.speed(0)
pen.color("black")
pen.penup()
pen.hideturtle()
pen.goto(0, 330)
pen.write("{}: 0".format(Name_1), align="center", font=("Bebas Neue", 24, "italic"))

# Function
def paddle_right():
    x = paddle.xcor()
    x += 20
    paddle.setx(x)

def paddle_left():
    x = paddle.xcor()
    x -= 20
    paddle.setx(x)


# keyboard binding
windows.listen()
windows.onkeypress(paddle_right, "Right")
windows.onkeypress(paddle_left, "Left")


# Main loop
while score < 10:
    windows.update()
    # moving ball
    ball.setx(ball.xcor() + ball.dx)
    ball.sety(ball.ycor() + ball.dy)

    # border checking

    # Top and Side borders
    if ball.ycor() > 380:
        ball.sety(380)
        ball.dy *= -1

    if ball.xcor() > 600:
        ball.setx(600)
        ball.dx *= -1


    if ball.xcor() < -600:
        ball.setx(-600)
        ball.dx *= -1

    # paddle and ball collisions
    if ball.ycor() < -320 and ball.ycor() > -330 and (ball.xcor() < paddle.xcor() + 55 and ball.xcor() > paddle.xcor() - 55):
        ball.setx(-330)
        ball.dx *= -1
    else:
        score += 1
Screen().bye()

#Double Player
def double():
    name_1 = inputname1.get().strip()
    name_2 = inputname2.get().strip()
    pl.destroy()
    windows = Screen()
    windows.title("Bounce Game by TechLord")
    windows.bgcolor("white")
    windows.setup(width=1200, height=760)
    windows.tracer(0)

# Score
score_a = 0
score_b = 0

# paddle a
pad_a = Turtle()
pad_a.speed(0)
pad_a.shape("square")
pad_a.color("blue")
pad_a.shapesize(stretch_wid=5, stretch_len=1)
pad_a.penup()
pad_a.goto(-550, 0)

# paddle b
pad_b = Turtle()
pad_b.speed(0)
pad_b.shape("square")
pad_b.color("blue")
pad_b.shapesize(stretch_wid=5, stretch_len=1)
pad_b.penup()
pad_b.goto(550, 0)

# ball
ball = Turtle()
ball.speed(0)
ball.shape("circle")
ball.color("red")
ball.shapesize(stretch_wid=1.2, stretch_len=1.2)
ball.penup()
ball.goto(0, 0)
ball.dx = 1
ball.dy = -1

# Pen
pen = Turtle()
pen.speed(0)
pen.color("black")
pen.penup()
pen.hideturtle()
pen.goto(0, 330)
pen.write("{}: 0  {}: 0".format(name_1, name_2), align="center", font=("Bebas Neue", 24, "italic"))

# Function
def pad_a_up():
    y = pad_a.ycor()
    y += 20
    pad_a.sety(y)

def pad_a_down():
    y = pad_a.ycor()
    y -= 20
    pad_a.sety(y)

def pad_b_up():
    y = pad_b.ycor()
    y += 20
    pad_b.sety(y)

def pad_b_down():
    y = pad_b.ycor()
    y -= 20
    pad_b.sety(y)

# keyboard binding
windows.listen()
windows.onkeypress(pad_a_up, "w")
windows.onkeypress(pad_a_down, "s")
windows.onkeypress(pad_b_up, "Up")
windows.onkeypress(pad_b_down, "Down")

# Main loop
while score_a < 10 and score_b < 10:
    windows.update()
    # moving ball
    ball.setx(ball.xcor() + ball.dx)
    ball.sety(ball.ycor() + ball.dy)

    # border checking

    # Top and Bottom
    if ball.ycor() > 370:
        ball.sety(370)
        ball.dy *= -1

    if ball.ycor() < -370:
        ball.sety(-370)
        ball.dy *= -1

    if ball.xcor() > 610:
        ball.goto(0, 0)
        ball.dx *= -1
        score_a += 1
        pen.clear()
        pen.write("{}: {}  {}: {}".format(name_1, score_a, name_2, score_b), align="center",
                  font=("Bebas Neue", 24, "italic"))

    if ball.xcor() < -610:
        ball.goto(0, 0)
        ball.dx *= -1
        score_b += 1
        pen.clear()
        pen.write("{}: {}  {}: {}".format(name_1, score_a, name_2, score_b), align="center",
                  font=("Bebas Neue", 24, "italic"))

    # paddle and ball collisions
    if ball.xcor() > 540 and ball.xcor() < 550 and (
            ball.ycor() < pad_b.ycor() + 55 and ball.ycor() > pad_b.ycor() - 55):
        ball.setx(540)
        ball.dx *= -1
    if ball.xcor() < -540 and ball.xcor() > -550 and (
            ball.ycor() < pad_a.ycor() + 55 and ball.ycor() > pad_a.ycor() - 55):
        ball.setx(-540)
        ball.dx *= -1
if score_a == 10:
    res = Tk()
    pic = PhotoImage(file=r"F:\hassan\winner.png")
    picture = Label(res, image=pic).grid(row=0, column=0)
    winner = Label(res, In=picture, text=name_1, justify=CENTER).pack(side=BOTTOM)
elif score_b == 10:
    res = Tk()
    pic = PhotoImage(file=r"F:\hassan\winner.png")
    picture = Label(res, image=pic).grid(row=0, column=0)
    winner = Label(res, In=picture, text=name_2, justify=CENTER).pack(side=BOTTOM)
Screen().bye()

def twoplayer():
    global inputname1
    global inputname2
    global pl
    win.destroy()
    pl = Tk()
    pl.title("Name Entry")
    inputname1 = StringVar()
    inputname2 = StringVar()
    pl1 = Label(pl, text="Player 1", fg="black", font=("arial", 20), justify=LEFT).grid(row=0, column=0, padx=10, pady=10)
    pl2 = Label(pl, text="Player 2", fg="black", font=("arial", 20), justify=LEFT).grid(row=1, column=0, padx=10, pady=10)
    name1 = Entry(pl, width=20, font=("bebas neue", 20, "italic"), bg="white", textvariable=inputname1, justify=LEFT)
    name1.grid(row=0, column=1, padx=5, pady=10)
    name2 = Entry(pl, width=20, font=("bebas neue", 20, "italic"), bg="white", textvariable=inputname2, justify=LEFT)
    name2.grid(row=1, column=1, padx=5, pady=10)
    start = Button(pl, text="start", fg="white", bg="black", bd=3, font=("bebas neue", 20), cursor="hand2", width=8, height=1, command=double).grid(row=2, column=1, padx=10, pady=10)
    pl.mainloop()

def oneplayer():
    global inputname
    global opl
    win.destroy()
    opl = Tk()
    opl.title("Name Entry")
    inputname = StringVar()
    pl1 = Label(opl, text="Player 1", fg="black", font=("arial", 20), justify=LEFT).grid(row=0, column=0, padx=10, pady=10)
    name1 = Entry(opl, width=20, font=("bebas neue", 20, "italic"), bg="white", textvariable=inputname, justify=LEFT)
    name1.grid(row=0, column=1, padx=5, pady=10)
    start = Button(opl, text="start", fg="white", bg="black", bd=3, font=("bebas neue", 20), cursor="hand2", width=8, height=1, command=single).grid(row=1, column=1, padx=10, pady=10)
    opl.mainloop()

#Defining game start menu
win = Tk()
win.title("Start Menu")
win.geometry("350x500")
img = PhotoImage(file=r"F:\hassan\First year\Programming Fundamentals(PL)\bounce.png")
image = Label(win, image=img).grid(row=0, column=0)
name = Label(win, text="BOUNCE!!", fg="red", font=("arial black", 30, "italic")).grid()
byline = Label(win, text="By TechLord", fg="brown", font=("arial black", 10, "italic")).grid()
one_player = Button(win, text="1 Player", fg="black", bg="blue", font=("calibri", 20, "bold"), cursor="hand2", command=oneplayer).grid(row=3, column=0, rowspan=1, columnspan=1, padx=10, pady=10)
two_player = Button(win, text="2 Player", fg="black", bg="turquoise", font=("calibri", 20, "bold"), cursor="hand2", command=twoplayer).grid(row=4, column=0, rowspan=1, columnspan=1, padx=10, pady=10)
win.mainloop()
...