反弹的小球(python)

以下为参照《趣学Python编程》示例源码打出的反弹的小球游戏,经自己进行调试,更改,在python2.7上为可运行程序。适合像我一样的初学者进行Python体验,代码如下:

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)#得到拍子的坐标,并放入到变量paddle_pos中
        if pos[2]>=paddle_pos[0] and pos[0]<=paddle_pos[2]:#x果小球的右侧大于球拍的左侧。。。其中pos[2]包含了小球右侧的x坐标,pos[0]包含了左侧的x坐标;paddle_pos[0]球拍左侧的的x坐标
            if pos[3]>=paddle_pos[1] and pos[3]<=paddle_pos[3]:#pos[1]顶部  pos[3]底部
                return True
        return False


    def draw(self):
            self.canvas.move(self.id,self.x,self.y)#id是椭圆形的id,还有0指不要水平移动,-1指在屏幕上向上移动1个像素
            pos=self.canvas.coords(self.id)#通过ID来返回画布上任何画好的东西的当前的x和y坐标,那个圆形的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,100,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("Game")
tk.resizable(0,0)#窗口大小不可调整,0,0表示窗口大小在水平方向和垂直方向上都不能改变
tk.wm_attributes("-topmost",1)#把包含我们画布的窗口放到所有其他窗口之前
canvas=Canvas(tk,width=500,height=400,bd=0,highlightthickness=0)
canvas.pack()#让画布按前一行给出的宽度和高度的参数来调整其自身大小
my_image=PhotoImage(file='c:\\135.gif')
canvas.create_image(130,0,anchor=NW,image=my_image)
tk.update()#为游戏中的动画做好初始化
#canvas.create_oval(10,10,25,25,fill='blue')


paddle=Paddle(canvas,'green')
ball=Ball(canvas,paddle,'pink')


while 1:
    if ball.hit_bottom==False:
        ball.draw()
        paddle.draw()
    else:
       canvas.create_text(250,50,text='Game Over',font=('Courier',30))
    tk.update_idletasks()
    tk.update()

    time.sleep(0.01)



### 蓝桥杯小球反弹问题的Python解题思路与示例代码 #### 问题分析 该问题是典型的数学建模与编程结合的问题。已知一个小球从 `n` 米的高度自由下落,每次落地后会弹回到原来高度的一半,再继续下落。需要计算两个量: 1. **第10次反弹的高度**。 2. **从小球初始落下到第10次反弹达到最高点时(不包括第十次落下的距离),总共经过的距离**。 此问题可以通过简单的迭代逻辑解决,利用浮点数运算模拟每一次反弹的过程[^1]。 --- #### 解题思路 为了完成上述任务,可以按照以下方式设计算法: - 初始化变量用于记录当前高度和总路程。 - 使用循环结构逐步更新高度并累加路程。 - 当前高度通过除以2的方式不断减小,直到满足条件为止。 - 总路程由两部分组成:向下掉落的距离加上向上反弹的距离。 以下是具体的实现细节: --- #### 示例代码 下面提供了一个基于 Python 的解决方案,能够精确计算所需的结果。 ```python def ball_bounce(height, times): total_distance = height # 初始总路程等于首次下落的高度 current_height = height # 当前高度初始化为起始高度 for i in range(1, times): # 循环次数为9次,因为第一次已经计入total_distance current_height /= 2 # 更新当前高度为上一次的一半 total_distance += current_height * 2 # 加入上升和下降的距离 tenth_rebound_height = current_height / 2 # 计算第10次反弹的高度 return tenth_rebound_height, total_distance # 输入参数 initial_height = float(input("请输入小球初始下落的高度 (单位: 米): ")) bounce_times = 10 # 输出结果 rebound_height, traveled_distance = ball_bounce(initial_height, bounce_times) print(f"第{bounce_times}次反弹的高度为: {rebound_height:.6f} 米") print(f"从初始落下到第{bounce_times}次反弹到达最高点时共经过了: {traveled_distance:.6f} 米") ``` 这段程序定义了一个函数 `ball_bounce()` 来处理核心逻辑,并允许用户自定义输入的小球初始高度以及反弹次数。 --- #### 结果解释 运行以上代码后,对于给定的初始高度 `n` 和指定的反弹次数 `times=10`,可以获得以下两种结果: 1. 第十次反弹的最大高度; 2. 整个过程中所经历的总路径长度(不考虑最后一次向下的运动)。 这些数值均能被准确地打印出来供验证使用。 --- #### 关键概念扩展 除了基本的数学推导外,在实际开发中还可以引入面向对象的思想来增强可读性和模块化程度。例如,创建一个名为 `Ball` 的类表示小球的行为特性[^3]。然而在此简单场景下直接采用函数形式更为高效简洁。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值