Розыгрыш Premium и Уникальной юзергруппы на форуме! Перейти


  • УЖЕ ЗАВТРА! Просто зашёл, нажал на кнопку участия и забрал кучу призов уже 30-го декабря: https://yougame.biz/threads/366947/

Как сделать кнопку рестарт чтобы игра перезагружалась?

Новичок
Новичок
Статус
Оффлайн
Регистрация
9 Мар 2019
Сообщения
1
Реакции
0
Вот код:
Python:
Expand Collapse Copy
from tkinter import*
import random

# глобальные переменные
# настройки окна

# Ширина
WIDTH = 1000
# Высота
HEIGHT = 500

# Настройки ракеток

# Ширина ракетки
PAD_WIDTH = 10
# Высота ракетки
PAD_HEIGH = 100

# Настройки мяча
# Насколько будет увеличиваться скорость мяча с каждым ударом
BALL_SPEED_UP = 1
# Максимальная скорость мяча
BALL_SPEED_MAX = 30
# Радиус мяча
BALL_RADIUS = 30

# Начальная скорость
SPEED_INITIAL = 8
BALL_SPEED_X = SPEED_INITIAL
BALL_SPEED_Y = SPEED_INITIAL

# Счет игроков
PLAYER_1_SCORE = 0
PLAYER_2_SCORE = 0

# Добавим глобальную переменную отвечающую за расстояние, до правого края игрового поля
right_line_distance = WIDTH - PAD_WIDTH

# Обновление счёта
def update_score(player):
    global PLAYER_1_SCORE, PLAYER_2_SCORE
    if player == "right":
        PLAYER_1_SCORE += 1
        c.itemconfig(p_1_text, text=PLAYER_1_SCORE)
    else:
        PLAYER_2_SCORE += 1
        c.itemconfig(p_2_text, text=PLAYER_2_SCORE)

# Спавн мячика

def spawn_ball():
    global BALL_SPEED_X
    # Выставляем мяч по центру
    c.coords(BALL, WIDTH/2-BALL_RADIUS/2,
             HEIGHT/2-BALL_RADIUS/2,
             WIDTH/2+BALL_RADIUS/2,
             HEIGHT/2+BALL_RADIUS/2)
    # Задаем мячу направление в сторону проигравшего игрока,но снижаем скорость до изначальной
    BALL_SPEED_X = -(BALL_SPEED_X * -SPEED_INITIAL) / abs(BALL_SPEED_X)

# Функция отскока мяча
def bounce(action):
    global BALL_SPEED_X, BALL_SPEED_Y
    # Ударили ракеткой
    if action == "strike":
        BALL_SPEED_Y = random.randrange(-10, 10)
        if abs(BALL_SPEED_X) < BALL_SPEED_MAX:
            BALL_SPEED_X *= -BALL_SPEED_UP
        else:
            BALL_SPEED_X = -BALL_SPEED_X
    else:
        BALL_SPEED_Y = -BALL_SPEED_Y

# Окно
root = Tk()
root.title("PING PONG v1.1")

# Анимация
c = Canvas(root, width=WIDTH, height=HEIGHT, background="#03ff89")
c.pack()

# Элементы поля

# Правая линия
c.create_line(WIDTH-PAD_WIDTH, 0, WIDTH-PAD_WIDTH, HEIGHT, fill="black")

# Левая линия
c.create_line(PAD_WIDTH, 0, PAD_WIDTH, HEIGHT, fill="black")

# Центральная линия
c.create_line(WIDTH/2, 0, #(x;y) верхнии
              WIDTH/2, HEIGHT, #(x;y) нижнии
              fill="white")

# Установка объектов

# Мяч
BALL = c.create_oval(WIDTH/2-BALL_RADIUS/2, HEIGHT/2-BALL_RADIUS/2, WIDTH/2+BALL_RADIUS/2, HEIGHT/2+BALL_RADIUS/2, fill="white")

# Правая ракетка
RIGHT_PAD = c.create_line(WIDTH-PAD_WIDTH/2, 0, WIDTH-PAD_WIDTH/2, PAD_HEIGH, width=PAD_WIDTH, fill="black")

# Левая ракетка
LEFT_PAD = c.create_line(PAD_WIDTH/2, 0, PAD_WIDTH/2, PAD_HEIGH, width=PAD_WIDTH, fill="black")

# Счёт 1 игрока
p_1_text = c.create_text(WIDTH-WIDTH/6, PAD_HEIGH/4,
                         text=PLAYER_1_SCORE,
                         font="Arial 18",
                         fill="white")

# Счёт 2 игрока
p_2_text = c.create_text(WIDTH/6, PAD_HEIGH/4,
                          text=PLAYER_2_SCORE,
                          font="Arial 18",
                          fill="white")

# Глобальные переменные для скорости движения мяча
# По горизонтали
BALL_CHANGE_X = 15
# По вертикали
BALL_CHANGE_Y = 0

def move_ball():
    # определяем координаты сторон мяча и его центра
    ball_left, ball_top, ball_right, ball_bot = c.coords(BALL)
    ball_center = (ball_top + ball_bot) / 2

    # вертикальный отскок
    # Если мы далеко от вертикальных линий - просто двигаем мяч
    if ball_right + BALL_SPEED_X < right_line_distance and ball_left + BALL_SPEED_X > PAD_WIDTH:
        c.move(BALL, BALL_SPEED_X, BALL_SPEED_Y)
    # Если мяч касается своей правой или левой стороной границы поля
    elif ball_right == right_line_distance or ball_left == PAD_WIDTH:
        # Проверяем правой или левой стороны мы касаемся
        if ball_right > WIDTH / 2:
            # Если правой, то сравниваем позицию центра мяча
            # с позицией правой ракетки.
            # И если мяч в пределах ракетки делаем отскок
            if c.coords(RIGHT_PAD)[1] < ball_center < c.coords(RIGHT_PAD)[3]:
                bounce("strike")
            else:
                # Иначе игрок пропустил - тут оставим пока pass, его мы заменим на подсчет очков и респаун мячика
                update_score("left")
                spawn_ball()
        else:
            # То же самое для левого игрока
            if c.coords(LEFT_PAD)[1] < ball_center < c.coords(LEFT_PAD)[3]:
                bounce("strike")
            else:
                update_score("right")
                spawn_ball()
    # Проверка ситуации, в которой мячик может вылететь за границы игрового поля.
    # В таком случае просто двигаем его к границе поля.
    else:
        if ball_right > WIDTH / 2:
            c.move(BALL, right_line_distance-ball_right, BALL_SPEED_Y)
        else:
            c.move(BALL, -ball_left+PAD_WIDTH, BALL_SPEED_Y)
    # горизонтальный отскок
    if ball_top + BALL_SPEED_Y < 0 or ball_bot + BALL_SPEED_Y > HEIGHT:
        bounce("ricochet")


# Глобальные переменные скорости движения ракеток
# скорось с которой будут ездить ракетки
PAD_SPEED = 30
# Скорость правой
RIGHT_PAD_SPEED = 0
# Скорость левой
LEFT_PAD_SPEED = 0

# Функция движения обеих ракеток
def move_pads():
    # Словарь, где ракетке соответствует ее скорость
    PADS = {LEFT_PAD: LEFT_PAD_SPEED, RIGHT_PAD: RIGHT_PAD_SPEED}
    # Ракетки
    for pad in PADS:
        # Двигаем ракетку с заданной скоростью
        c.move(pad, 0, PADS[pad])
        # Если ракетка вылезает за игровое поле возвращаем ее на место
        if c.coords(pad)[1] < 0:
            c.move(pad, 0, -c.coords(pad)[1])
        elif c.coords(pad)[3] > HEIGHT:
            c.move(pad, 0, HEIGHT - c.coords(pad)[3])

def main():
    move_ball()
    move_pads()
    if (PLAYER_1_SCORE < 10) and (PLAYER_2_SCORE < 10):
        # вызываем саму себя каждые 30 миллисекунд
        root.after(30, main)
    else:
        text=''
        if PLAYER_1_SCORE > PLAYER_2_SCORE:
            text='WIN RIGHT SIDE'
        else:
            text='WIN LEFT SIDE'
        c.create_text(WIDTH / 2, PAD_HEIGH / 2,
                         text=text,
                         font='Arial 40',
                         fill='green')

# Реагирование на нажатия клавиш
c.focus_set()

# Функция обработки нажатия клавиш
def movement_handler(event):
    global LEFT_PAD_SPEED, RIGHT_PAD_SPEED
    if event.keysym == "w":
        LEFT_PAD_SPEED = -PAD_SPEED
    elif event.keysym == "s":
        LEFT_PAD_SPEED = PAD_SPEED
    elif event.keysym == "Up":
        RIGHT_PAD_SPEED = -PAD_SPEED
    elif event.keysym == "Down":
        RIGHT_PAD_SPEED = PAD_SPEED

# Привязка к Canvas функцию
c.bind("<KeyPress>", movement_handler)

# Функция реагирования на отпускание клавиши
def stop_pad(event):
    global LEFT_PAD_SPEED, RIGHT_PAD_SPEED
    if event.keysym in ("w", "s"):
        LEFT_PAD_SPEED = 0
    elif event.keysym in ("Up", "Down"):
        RIGHT_PAD_SPEED = 0

# Привязка к Canvas функции
c.bind("<KeyRelease>", stop_pad)

# Запуск движения
main()

# Запуск окна
root.mainloop()
 
Спасибо за код) оч нужно
 
Назад
Сверху Снизу