Проект. Гра Скік-Скок

# Гра. Стрибучий м'яч
Розробимо гру з стрибаючим м'ячем і ракеткою. М'яч буде літати по екрану, а гравець - відбивати його ракеткою. Якщо м'яч торкнеться нижньої межі екрану, гра завершиться. На малюнку лівопуч показано, як буде виглядати закінчена гра.





















Хоча на перший погляд гра досить проста, її код буде складнішим, ніж всі, що ми писали досі,
оскільки програма повинна виконувати багато різних дій.
Наприклад, потрібно анімувати ракетку і м'яч, а також обробляти зіткнення м'яча з ракеткою і контролювати границі ігрового поля.
#
from tkinter import*
import random
import time

class Ball:           # м'яч
    def __init__(self, canvas, paddle, color):
        self.canvas = canvas
        self.paddle = paddle
        self.id = canvas.create_oval(10, 10, 25, 25, fill=color)
        self.canvas.move(self.id, 245, 100)
        starts = [-3, -2, -1, 1, 2, 3]
        random.shuffle(starts)
        self.x = starts[0]
        self.y = -3
        self.canvas_height = self.canvas.winfo_height()
        self.canvas_width = self.canvas.winfo_width()
        self.hit_bottom = False

    def hit_paddle(self, pos):
        paddle_pos = self.canvas.coords(self.paddle.id)
        if pos[2] >= paddle_pos[0] and pos[0] <= paddle_pos[2]:
            if pos[3] >= paddle_pos[1] and pos[3] <= paddle_pos[3]:
                return True
        return False
    
    def draw(self):
        self.canvas.move(self.id, self.x, self.y)
        pos = self.canvas.coords(self.id)
        if pos[1] <= 0:
            self.y = 3
        if pos[3] >= self.canvas_height:
            self.hit_bottom = True
        if self.hit_paddle(pos) == True:
            self.y = -3
        if pos[0] <= 0:
            self.x = 3
        if pos[2] >= self.canvas_width:
            self.x = -3
            
class Paddle:                  # ракетка                
    def __init__(self, canvas, color):
        self.canvas = canvas
        self.id = canvas.create_rectangle(0, 0, 250, 10, fill=color)
        self.canvas.move(self.id, 200, 300)
        self.x = 0
        self.canvas_width = self.canvas.winfo_width()
        self.canvas.bind_all('<KeyPress-Left>', self.turn_left)
        self.canvas.bind_all('<KeyPress-Right>', self.turn_right)

    def draw(self):
        self.canvas.move(self.id, self.x, 0)
        pos = self.canvas.coords(self.id)
        if pos[0] <= 0:
            self.x = 0
        elif pos[2] >= self.canvas_width:
            self.x = 0

    def turn_left(self, evt):
        self.x = -2
    def turn_right(self, evt):
        self.x = 2

tk = Tk()
tk.title("Гра")
tk.resizable(False, False)      # не змінювати розміри вікна
tk.wm_attributes("-topmost", 1) # wm - віконний менеджер(вікно                                      # поверх всіх вікон)
canvas = Canvas(tk, width=500, height=400, # полотно для гри
          bd=0,                 # товщина контуру полотна = 0 
          highlightthickness=0) # товщина підсвітки контуру
canvas.pack()

tk.update()                        # уможливлення анімації
paddle = Paddle(canvas, 'blue')    # створення об'єкта ракетка
ball = Ball(canvas, paddle, 'red') # створення об'єкта м'яч
while True:
    if ball.hit_bottom == False:
        ball.draw()
        paddle.draw()
    tk.update_idletasks()
    tk.update()
    time.sleep(0.015)


Комментариев нет:

Отправить комментарий