Я делаю игру с помощью графики 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()