完整反弹球设计

from tkinter import *
from random import *
import time

class Ball:
    def __init__(self,canvas,color,winW,winH,racket):
        self.canvas = canvas
        self.racket = racket
        self.id = canvas.create_oval(0,0,20,20,fill=color)   #创建球对象
        self.canvas.move(self.id,winW/2,winH/2)    #设置球最初位置
        startPos =[-4,-3,-2,-1,1,2,3,4]    #球最初x轴位移的随机数
        shuffle(startPos)    #打乱排列
        self.x = startPos[0]    #求最初水平移动单位
        self.y = -step    #球先往上垂直移动单位
        self.notTouchBottom = True    #未接触画布底端
    def hitRacket(self,ballPos):
        racketPos = self.canvas.coords(self.racket.id)
        if ballPos[2] >= racketPos[0] and ballPos[0] <= racketPos[2]:
            if ballPos[3]>= racketPos[1] and ballPos[3] <= racketPos[3]:
                return True
            return  False
    def ballMove(self):
        self.canvas.move(self.id,self.x,self.y)   #step是正值表示往下移动
        ballPos = self.canvas.coords(self.id)
        if ballPos[0] <=0:   #侦测球是否超过画布左方
            self.x = step
        if ballPos[1] <=0:   #侦测球是否超过画布上方
            self.y=step
        if ballPos[2] >=winW:   #侦测球是否超过画布右方
            self.x = -step
        if ballPos[3] >= winH:  #侦测球是否超过画布下方
            self.y = -step
        if self.hitRacket(ballPos) == True:   #侦测是否撞到球拍
            self.y = -step
        if ballPos[3] >= winH:   #如果球未接触画布底端
            self.notTouchBottom = False
class Racket:
    def __int__(self,canvas,color):
        self.canvas = canvas
        self.id = canvas.create_rectangle(0,0,100,15,fill=color)    #球拍对象
        self.canvas.move(self.id,270,400)   #球拍位置
        self.x = 0
        self.canvas.bind_all('<KeyPress-Right>',self.moveRight)   #绑定按往右键
        self.canvas.bind_all('<KeyPress-Left>',self.moveLeft)   #绑定按往左键
    def racketMove(self):   #设计球拍移动
        self.canvas.move(self.id,self.x,0)
        racketPos = self.canvas.coords(self.id)
        if racketPos[0] <=0:   #移动时是否碰到画布左端
            self.x=0
        elif racketPos[2] >= winW:  #移动时是否碰到画布右端
            self.x = 0
    def moveLeft(self,event):  #球拍每次向左移动的单位数
        self.x = -3
    def moveRight(self,event):  #球拍每次向右移动的单位数
        self.x = 3

winW = 640  #定义画布宽度
winH = 480  #定义画布高度
step = 3  #定义速度可想成位移步长
speed = 0.01  #设置移动速度

tk = Tk()
tk.title("Bouncing Ball")  #游戏窗口标题
tk.wm_attributes('-topmost',1)  #确保游戏窗口在最屏幕上层
canvas = Canvas(tk,windth=winW,height=winH)
canvas.pack()
tk.update()

racket = Racket(canvas,'purple')  #定义紫色球拍
ball = Ball(canvas,'yellow',winW,winH,racket)  #定义球队象

while ball.notTouchBottom: #如果球未接触画布底端
    try:
        ball.ballMove()
    except:
        print("单击关闭按钮终止程序执行")
        break
    racket.racketMove()
    tk.update()
    time.sleep(speed) # 可以控制球移动速度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值