Проект. Гра з ракеткою і м'ячиком

# Гра з ракеткою і м'ячиком
# Щоб гра запрацювала потрібно:
# - створити фігури для ракетки і м'ячика
# - розробити рухи для ракетки і м'ячика
# - вказати, коли м'ячик повинен відскакувати
# - припинити гру, коли м'ячик впаде донизу, і
# - запропонувати гравцеві, ще одну спробу
# Щоб пригальмувати темп гри, можна додати паузи,
# використовуючи модуль time

import tkinter
import time
from tkinter import messagebox

canvasWidth=650
canvasHeight=400

window=tkinter.Tk()
canvas=tkinter.Canvas(window, width=canvasWidth, height=canvasHeight, bg="dodgerblue4")
canvas.pack()
# ракетка
bat=canvas.create_rectangle(0,0,150,10,fill="dark turquoise")
# м'ячик
ball=canvas.create_oval(20,0,10,10,fill="deep pink")

windowOpen=True
score=0
bounceCount=0

def main_loop(): 
    while windowOpen==True:
        move_bat()
        move_ball()
        # уможливлює рух об'єктів на екрані
        # також перевіряє події(такі як натискання клавіші)
        window.update() 
        time.sleep(0.02)
        if windowOpen==True:
            check_game_over()

leftPressed=0
rightPressed=0

def on_key_press(event):
    global leftPressed, rightPressed
    if event.keysym=="Left":
        leftPressed=1
    elif event.keysym=="Right":
        rightPressed=1

def on_key_release(event):
    global leftPressed, rightPressed
    if event.keysym=="Left":
        leftPressed=0
    elif event.keysym=="Right":
        rightPressed=0

batSpeed=6
def move_bat():
    batMove=batSpeed*rightPressed-batSpeed*leftPressed
    (batLeft, batTop, batRight, batBottom)=canvas.coords(bat)
    if (batLeft>0 or batMove>0) and (batRight<canvasWidth or batMove<0):
        canvas.move(bat, batMove, 0)

ballMoveX = 4      # координата руху м'ячика вліво або вправо 
ballMoveY = -4     # координата руху м'ячика вверх або вниз
setBatTop = canvasHeight - 40   
setBatBottom = canvasHeight - 30

def move_ball():                    # функція руху м'ячика
    global ballMoveX, ballMoveY, score, bounceCount, batSpeed
    (ballLeft, ballTop, ballRight, ballBottom)=canvas.coords(ball)
    if ballMoveX>0 and ballRight > canvasWidth:
        ballMoveX = -ballMoveX
    if ballMoveX<0 and ballLeft<0:
        ballMoveX = -ballMoveX
    if ballMoveY<0 and ballTop<0:
        ballMoveY = -ballMoveY
    if ballMoveY>0 and ballBottom>setBatTop and ballBottom < setBatBottom:
        (batLeft, batTop, batRight, batBottom)=canvas.coords(bat)
        if (ballMoveX>0 and (ballRight+ballMoveX > batLeft and ballLeft < batRight) or ballMoveX<0 and (ballRight>batLeft and ballLeft+ballMoveX<batRight)):
            ballMoveY = -ballMoveY
            score = score+1
            window.title("Твій рахунок: " +str(score))
            bounceCount = bounceCount+1
            if bounceCount == 4:
                bounceCount=0
                batSpeed = batSpeed + 1
                if ballMoveX>0:
                    ballMoveX = ballMoveX+1
                else:
                    ballMoveX = ballMoveX-1
                ballMoveY = ballMoveY-1
            
    canvas.move(ball, ballMoveX, ballMoveY)

def check_game_over():
    (ballLeft, ballTop, ballRight, ballBottom)=canvas.coords(ball)
    if ballTop>canvasHeight:
        window.title("Твій рахунок: " +str(score))
        playAgain=tkinter.messagebox.askyesno(message=
"Чи хочеш ти грати знову ?")
        if playAgain == True:
            reset()
        else:
            close()

def close():
    global windowOpen
    windowOpen=False
    window.destroy()

def reset():
    global score, bounceCount, batSpeed 
    global leftPressed, rightPressed
    global ballMoveX, ballMoveY
    leftPressed=0
    rightPressed=0
    ballMoveX=4
    ballMoveY=-4
    canvas.coords(bat, 10, setBatTop, 150, setBatBottom)
    canvas.coords(ball, 20, setBatTop-10, 30, setBatTop)
    score = 0
    bounceCount = 0
    barSpeed = 6
    
window.protocol("WM_DELETE_WINDOW", close)
window.bind("<KeyPress>", on_key_press)
window.bind("<KeyRelease>", on_key_release)
reset()
main_loop()


1 комментарий: