根据前面慢屏幕乱跑的小球,改编一个弹球游戏,下面加一个球拍,当球碰到拍子的时候弹回去

版本一

目前这个实现的功能是:加入了一拍子,可以用键盘来左右控制移动


#########################
#之前做的画面没有互动,这次加入一个球拍,使之能把下落的球给挡回去,目前功能加入了一拍子,可以用键盘来左右控制移动
######################
from tkinter import *
import random
import time#
#创建一个类,这个类含有两个参数,一个是画布,一个是球的颜色
#
class Ball:def __init__(self,canvas,color):self.canvas = canvasself.id = canvas.create_oval(10,10,25,25,fill=color)self.canvas.move(self.id,245,100)#来回反弹#--self.x = 0#--self.y = -1starts = [-3,-2,-1,1,2,3]random.shuffle(starts)self.x = starts[0]self.y = -3#winfo_height()函数来获取画布当前的高度,赋值给对象变量self.canvas_height = self.canvas.winfo_height()#获取X轴坐标self.canvas_width = self.canvas.winfo_width()def draw(self):self.canvas.move(self.id,self.x,self.y)#获取某个对象在画布的坐标,返回一个数组(两个坐标,左上角的坐标和右下角的两个坐标)pos = self.canvas.coords(self.id)#打印获取的坐标print(pos)#如果最上面的纵轴坐标在顶上,则往下移动一个像素if pos[1] <= 0:self.y = 1#如果最下面的纵轴坐标在底上,则向上移动if pos[3] > self.canvas_height:self.y = -1#宽度控制##如果在左边框了,那么向右边移动3像素if pos[0] <= 0:self.x = 3#如果到右边框了,左移动3像素if pos[2] > self.canvas_width:self.x = -3
#
#创建一个球拍类,这个类含有两个参数,一个是画布,一个是球的颜色
#
class Paddle:def __init__(self,canvas,color):self.canvas = canvasself.id = self.canvas.create_rectangle(0,0,100,10,fill = color)self.canvas.move(self.id,200,300)self.x = 0self.canvas_width = self.canvas.winfo_width()#这个函数绑定一个事件,来实现小球用键盘来控制左右移动,当移动到边界的时候要停止移动    def draw(self,event):pos = self.canvas.coords(self.id)if event.keysym == 'Left':if pos[0] <= 0:self.canvas.move(self.id,0,0)else:self.canvas.move(self.id,-100,0)if event.keysym == 'Right':if pos[2] >= self.canvas_width:self.canvas.move(self.id,0,0)else:self.canvas.move(self.id,100,0)#创建画布
tk = Tk()
tk.title("Game_ball")
tk.resizable(0,0)
tk.wm_attributes("-topmost",1)
#bd=0,highlightthickness=0 画布之外没有边框
canvas = Canvas(tk,width=500,height=400,bd=0,highlightthickness=0)
canvas.pack()
tk.update()#创建对象
ball = Ball(canvas,'red')
paddle = Paddle(canvas,'blue')
#一直保持循环
while 1:ball.draw()#给球拍绑定事件canvas.bind_all('<KeyPress-Left>',paddle.draw)canvas.bind_all('<KeyPress-Right>',paddle.draw)#快速刷新屏幕tk.update_idletasks()tk.update()time.sleep(0.01)

版本2

这个可用用键盘来回移动球拍,并且如果球碰到球拍会给它弹回去


#########################
#之前做的画面没有互动,这次加入一个球拍,使之能把下落的球给挡回去
######################
from tkinter import *
import random
import time#
#创建一个类,这个类含有两个参数,一个是画布,一个是球的颜色
#
class Ball:#这个地方要获取paddle的数据,所以要把paddle对象作为一个参数传递进来def __init__(self,canvas,paddle,color):self.canvas = canvasself.paddle = paddleself.id = canvas.create_oval(10,10,25,25,fill=color)self.canvas.move(self.id,245,100)#来回反弹#--self.x = 0#--self.y = -1starts = [-3,-2,-1,1,2,3]random.shuffle(starts)self.x = starts[0]self.y = -3#winfo_height()函数来获取画布当前的高度,赋值给对象变量self.canvas_height = self.canvas.winfo_height()#获取X轴坐标self.canvas_width = self.canvas.winfo_width()#fun:判断是否击中球拍的函数,击中返回True,不然返回false#函数的擦数要获取球拍的位置,然后和小球的位置来判断def hit_paddle(self,pos):paddle_pos = canvas.coords(self.paddle.id)#这个地方来讲一下判断规则,现在我们获取了两个球和拍子两个对象在画布中的坐标,通过对坐标来判断是否撞拍#先判断横坐标:如果小球的最左边pos[0]的值大于等于拍子最左边的值,且球最右边的坐标的值pos[2]小于拍子最右边的值,那么横向是命中的if pos[0] >= paddle_pos[0] and pos[2] <= paddle_pos[2]:#纵向判断:小球的最下边的值位于球拍的pos[3]上底和下底之间,则纵向命中if pos[3] >= paddle_pos[1] and pos[3] <= paddle_pos[3]:return Trueelse:return Falsedef draw(self):self.canvas.move(self.id,self.x,self.y)#获取某个对象在画布的坐标,返回一个数组(两个坐标,左上角的坐标和右下角的两个坐标)pos = self.canvas.coords(self.id)##纵轴控制###如果最上面的纵轴坐标在顶上,则往下移动一个像素if pos[1] <= 0:self.y = 1#如果最下面的纵轴坐标在底上,则向上移动if pos[3] > self.canvas_height:self.y = -1#这儿加入球拍的位置,如果到了球拍的底部也要弹回去,通过加入一个函数来判断,在draw之前if self.hit_paddle(pos) == True:self.y = -1##宽度控制###如果在左边框了,那么向右边移动3像素if pos[0] <= 0:self.x = 3#如果到右边框了,左移动3像素if pos[2] > self.canvas_width:self.x = -3#
#创建一个球拍类,这个类含有两个参数,一个是画布,一个是球的颜色
#
class Paddle:def __init__(self,canvas,color):self.canvas = canvasself.id = self.canvas.create_rectangle(0,0,100,10,fill = color)self.canvas.move(self.id,200,300)self.x = 0self.canvas_width = self.canvas.winfo_width()#这个函数绑定一个事件,来实现小球用键盘来控制左右移动,当移动到边界的时候要停止移动    def draw(self,event):pos = self.canvas.coords(self.id)if event.keysym == 'Left':if pos[0] <= 0:self.canvas.move(self.id,0,0)else:self.canvas.move(self.id,-100,0)if event.keysym == 'Right':if pos[2] >= self.canvas_width:self.canvas.move(self.id,0,0)else:self.canvas.move(self.id,100,0)#创建画布
tk = Tk()
tk.title("Game_ball")
tk.resizable(0,0)
tk.wm_attributes("-topmost",1)
#bd=0,highlightthickness=0 画布之外没有边框
canvas = Canvas(tk,width=500,height=400,bd=0,highlightthickness=0)
canvas.pack()
tk.update()#创建对象
paddle = Paddle(canvas,'blue')
ball = Ball(canvas,paddle,'red')#一直保持循环
while 1:ball.draw()#给球拍绑定事件canvas.bind_all('<KeyPress-Left>',paddle.draw)canvas.bind_all('<KeyPress-Right>',paddle.draw)#快速刷新屏幕tk.update_idletasks()tk.update()time.sleep(0.01)

继续进行优化

加入计分功能和如果错过三次则自动停止功能

#########################
#之前做的画面没有互动,这次加入一个球拍,使之能把下落的球给挡回去
######################
from tkinter import *
import random
import time#创建画布
tk = Tk()
tk.title("Game_ball")
tk.resizable(0,0)
tk.wm_attributes("-topmost",1)
#bd=0,highlightthickness=0 画布之外没有边框
canvas = Canvas(tk,width=500,height=400,bd=0,highlightthickness=0)
canvas.pack()
tk.update()#
#创建一个类,这个类含有两个参数,一个是画布,一个是球的颜色
#
class Ball:#这个地方要获取paddle的数据,所以要把paddle对象作为一个参数传递进来def __init__(self,canvas,paddle,color):self.canvas = canvasself.paddle = paddleself.id = canvas.create_oval(10,10,25,25,fill=color)self.canvas.move(self.id,245,100)#来回反弹#--self.x = 0#--self.y = -1starts = [-3,-2,-1,1,2,3]random.shuffle(starts)self.x = starts[0]self.y = -3#winfo_height()函数来获取画布当前的高度,赋值给对象变量self.canvas_height = self.canvas.winfo_height()#获取X轴坐标self.canvas_width = self.canvas.winfo_width()#刚开始没有接触到底部self.hit_bottom_count = 0#fun:判断是否击中球拍的函数,击中返回True,不然返回false#函数的擦数要获取球拍的位置,然后和小球的位置来判断def hit_paddle(self,pos):paddle_pos = canvas.coords(self.paddle.id)#这个地方来讲一下判断规则,现在我们获取了两个球和拍子两个对象在画布中的坐标,通过对坐标来判断是否撞拍#先判断横坐标:如果小球的最左边pos[0]的值大于等于拍子最左边的值,且球最右边的坐标的值pos[2]小于拍子最右边的值,那么横向是命中的if pos[0] >= paddle_pos[0] and pos[2] <= paddle_pos[2]:#纵向判断:小球的最下边的值位于球拍的pos[3]上底和下底之间,则纵向命中if pos[3] >= paddle_pos[1] and pos[3] <= paddle_pos[3]:return Trueelse:return Falsedef draw(self):self.canvas.move(self.id,self.x,self.y)#获取某个对象在画布的坐标,返回一个数组(两个坐标,左上角的坐标和右下角的两个坐标)pos = self.canvas.coords(self.id)##纵轴控制###如果最上面的纵轴坐标在顶上,则往下移动一个像素if pos[1] <= 0:self.y = 1#如果最下面的纵轴坐标在底上,则向上移动#if pos[3] > self.canvas_height:#self.y = -1if pos[3] >= self.canvas_height:self.hit_bottom_count = self.hit_bottom_count + 1self.y = -1#这儿加入球拍的位置,如果到了球拍的底部也要弹回去,通过加入一个函数来判断,在draw之前if self.hit_paddle(pos) == True:self.y = -1##宽度控制###如果在左边框了,那么向右边移动3像素if pos[0] <= 0:self.x = 3#如果到右边框了,左移动3像素if pos[2] > self.canvas_width:self.x = -3#
#创建一个球拍类,这个类含有两个参数,一个是画布,一个是球的颜色
#
class Paddle:def __init__(self,canvas,color):self.canvas = canvasself.id = self.canvas.create_rectangle(0,0,100,10,fill = color)self.canvas.move(self.id,200,300)self.x = 0self.canvas_width = self.canvas.winfo_width()#这个函数绑定一个事件,来实现小球用键盘来控制左右移动,当移动到边界的时候要停止移动def draw(self,event):pos = self.canvas.coords(self.id)if event.keysym == 'Left':if pos[0] <= 0:self.canvas.move(self.id,0,0)else:self.canvas.move(self.id,-100,0)if event.keysym == 'Right':if pos[2] >= self.canvas_width:self.canvas.move(self.id,0,0)else:self.canvas.move(self.id,100,0)print(event.keysym)def main():#创建对象paddle = Paddle(canvas,'blue')ball = Ball(canvas,paddle,'red')#一直保持循环while 1:#用一个变量来判断是否曾接触过底部,默认没接触过if True == True:if ball.hit_bottom_count <= 1 :#点击球拍开始is_begin = Trueball.draw()#给球拍绑定事件canvas.bind_all('<KeyPress-Left>',paddle.draw)canvas.bind_all('<KeyPress-Right>',paddle.draw)else:#游戏结束后,闪烁游戏结束提示for i in range(1,20):time.sleep(0.5)endmsg=canvas.create_text(250,200,text = 'Game Over!',font =('Times',50),fill = 'red')tk.update()time.sleep(0.5)canvas.itemconfig(endmsg,state = 'hidden')tk.update()tk.update_idletasks()break#快速刷新屏幕tk.update_idletasks()tk.update()time.sleep(0.005)if __name__ == "__main__":main()

继续进行功能扩展

加入如下功能:

  1. 点击球拍开始游戏
  2. 计分功能
  3. 加速功能
  4. 结束提醒功能
'''
#########################
#之前做的画面没有互动,这次加入一个球拍,使之能把下落的球给挡回去,同时较少main处的代码,尽量都放到类中来实现,以符合高内聚低耦合原则
######################
'''
from tkinter import *
import random
import time#创建画布
tk = Tk()
tk.title("Game_ball")
tk.resizable(0,0)
tk.wm_attributes("-topmost",1)
#bd=0,highlightthickness=0 画布之外没有边框
canvas = Canvas(tk,width=500,height=400,bd=0,highlightthickness=0)
canvas.pack()
tk.update()'''
#
#创建一个类,这个类含有如下参数:画布,被击中的球拍paddle,球的颜色,击中次数score
#
'''
class Ball:#这个地方要获取paddle的数据,所以要把paddle对象作为一个参数传递进来def __init__(self,canvas,paddle,color,score):self.canvas = canvasself.paddle = paddleself.score = scoreself.id = canvas.create_oval(10,10,25,25,fill=color)self.canvas.move(self.id,245,100)#来回反弹#--self.x = 0#--self.y = -1starts = [-3,-2,-1,1,2,3]random.shuffle(starts)self.x = starts[0]self.y = -3#winfo_height()函数来获取画布当前的高度,赋值给对象变量self.canvas_height = self.canvas.winfo_height()#获取X轴坐标self.canvas_width = self.canvas.winfo_width()#刚开始没有接触到底部self.hit_bottom_count = 0#fun:判断是否击中球拍的函数,击中返回True,不然返回false#函数的擦数要获取球拍的位置,然后和小球的位置来判断def hit_paddle(self,pos):paddle_pos = canvas.coords(self.paddle.id)#这个地方来讲一下判断规则,现在我们获取了两个球和拍子两个对象在画布中的坐标,通过对坐标来判断是否撞拍#先判断横坐标:如果小球的最左边pos[0]的值大于等于拍子最左边的值,且球最右边的坐标的值pos[2]小于拍子最右边的值,那么横向是命中的if pos[0] >= paddle_pos[0] and pos[2] <= paddle_pos[2]:#纵向判断:小球的最下边的值位于球拍的pos[3]上底和下底之间,则纵向命中if pos[3] >= paddle_pos[1] and pos[3] <= paddle_pos[3]:#此处调用的score类的getScore函数得分,把计算得分的功能让得分类来实现,通过对象引用获取某个对象的得分,就相当于球这个对象有了分的属性self.score.getScore()return Trueelse:return Falsedef draw(self):self.canvas.move(self.id,self.x,self.y)#获取某个对象在画布的坐标,返回一个数组(两个坐标,左上角的坐标和右下角的两个坐标)pos = self.canvas.coords(self.id)##纵轴控制###如果最上面的纵轴坐标在顶上,则往下移动一个像素if pos[1] <= 0:self.y = 1#如果最下面的纵轴坐标在底上,则向上移动#if pos[3] > self.canvas_height:#self.y = -1if pos[3] >= self.canvas_height:self.hit_bottom_count = self.hit_bottom_count + 1self.y = -1#这儿加入球拍的位置,如果到了球拍的底部也要弹回去,通过加入一个函数来判断,在draw之前if self.hit_paddle(pos) == True:self.y = -1##宽度控制###如果在左边框了,那么向右边移动3像素if pos[0] <= 0:self.x = 3#如果到右边框了,左移动3像素if pos[2] > self.canvas_width:self.x = -3
'''
#
#创建一个球拍类,这个类含有两个参数,一个是画布,一个是球的颜色
#
'''
class Paddle:def __init__(self,canvas,color):self.canvas = canvasself.id = self.canvas.create_rectangle(0,0,100,10,fill = color)self.canvas.move(self.id,200,300)self.x = 0self.is_start = Falseself.canvas_width = self.canvas.winfo_width()self.canvas.bind_all('<KeyPress-Left>',self.turn_left)self.canvas.bind_all('<KeyPress-Right>',self.turn_right)self.canvas.bind_all('<Button-1>',self.start_game)#这个函数绑定一个事件,来实现小球用键盘来控制左右移动,当移动到边界的时候要停止移动#应该把检测是否过线的判断放在这个地方,因为只有按键的时候才触发判断,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 = 0def turn_left(self,evt):self.x = -3return self.xdef turn_right(self,evt):self.x = 3return self.xdef start_game(self,evt):self.is_start = Truereturn self.is_start'''
#
##得分类,有2个属性,画布和颜色;一个方法,得分方法
#
'''class Score:def __init__(self,canvas,color):self.score = 0self.canvas = canvasself.id = canvas.create_text(450,10,fill = color,text= self.score,)def getScore(self):self.score += 1#改变得分self.canvas.itemconfig(self.id,text = self.score)def main():#创建对象score = Score(canvas,'green')paddle = Paddle(canvas,'blue')ball = Ball(canvas,paddle,'red',score)endmsg=canvas.create_text(250,200,text = 'Game Over!',font =('Times',50),fill = 'red',state = 'hidden')#ball2 = Ball(canvas,paddle,'green')#一直保持循环while 1:#用一个变量来判断是否曾接触过底部,默认没接触过if ball.hit_bottom_count <= 4 and paddle.is_start == True:#点击球拍开始#is_begin = Trueball.draw()#ball2.draw()paddle.draw()if ball.hit_bottom_count > 4:canvas.itemconfig(endmsg,state='normal')#快速刷新屏幕tk.update_idletasks()tk.update()time.sleep(0.005)if __name__ == "__main__":main()

python游戏初探:拍子打小球相关推荐

  1. 《Python游戏趣味编程》 第2章 弹跳的小球

    2 弹跳的小球 图书简介可以看这里: 童晶:<Python游戏趣味编程>新书上架了 Python之所以功能强大,一个原因就是有大量功能强大的库,安装好后即可使用这些库的功能.打开海龟编辑器 ...

  2. ❤️❤️马上安排!闺女想在游戏里成为【超人】,Python游戏开发模块Pygame系列之【跳跃的小球】❤️❤️源码

    今天正式学习Pygame 学习环境 适合人群 跳跃的小球 实现步骤说明 创建游戏窗口 display模块的常用方法 窗口显示 加载游戏图片 Surface对象的常用方法 移动图片 碰撞检测 限制小球移 ...

  3. python小球在窗口弹来弹去_《Python游戏趣味编程》 第2章 弹跳的小球

    知乎视频​www.zhihu.com 图书简介可以看这里:童晶:<Python游戏趣味编程>新书上架了​zhuanlan.zhihu.com Python之所以功能强大,一个原因就是有大量 ...

  4. Python游戏开发pygame模块,Python实现球球碰撞小游戏

    相信大家在初中电脑课上都偷偷玩过 Flash 游戏--是男人就坚持 100 秒,在游戏中无数的小球随机运动,玩家用鼠标控制大球,当大球碰撞到小球后,游戏结束,显示坚持的时间.今天我们一起来开发这个小游 ...

  5. 进击的Python【第一章】:Python背景初探与Python基础(一)

    Python背景初探 一.Python起源 Python的创始人为Guido van Rossum.1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,做 ...

  6. python游戏程序-Python游戏趣味编程

    书名:Python游戏趣味编程 定价:69.0 ISBN:9787115538246 作者:童晶 版次:第1版 出版时间:2020-07 内容提要: 本书把趣味游戏开发应用于Python编程教学,通过 ...

  7. 《Python游戏趣味编程》第12章 坚持一百秒

    12 坚持一百秒 图书简介可以看这里: 童晶:<Python游戏趣味编程>新书上架了 本章我们将编写一个坚持一百秒的游戏,玩家通过鼠标控制飞机躲避飞舞的小球,效果如图12-1所示.首先学习 ...

  8. 《Python游戏趣味编程》 第4章 疯狂的小圆圈

    4 疯狂的小圆圈 图书简介可以看这里: 童晶:<Python游戏趣味编程>新书上架了 本章我们将实现一个好玩的程序,鼠标点击后,会在点击处出现一些同心圆圈,并在窗口中四处反弹,效果如图4- ...

  9. 《Python游戏趣味编程》新书上架了

    <Python游戏趣味编程>案例视频 <Python游戏趣味编程>新书上架了,目前京东.淘宝.当当上搜书名就可以找到,比如: https://item.jd.com/12899 ...

最新文章

  1. TypeError(“cannot concatenate ‘str‘ and ‘instancemethod‘ objects“,)
  2. SQLyog普通版与SQLyog企业版对比分析
  3. 使用resnet训练CIFAR10
  4. zookeeper C API
  5. RTMP代理的协议规范(RtmpProxy)
  6. (Python)时序预测的七种方法
  7. 【面向对象】面向对象程序设计测试题9-对象之间的继承关系测试题
  8. oracle 10g 创建只读用户语法
  9. 基于知识的智能体 笔记
  10. asp.net mvc 伪静态路由配置
  11. (4)二进制文件方式部署Kubernetes高可用集群----------安装kubectl命令行工具
  12. Oracle的函数大全
  13. SiamFC复现结果
  14. java代码格式化的快捷键设置_如何使用VS中的快捷键快速格式化代码使好看,整齐...
  15. ptx760功能图解_ptx760对讲机使用教程
  16. 5G词汇通俗解释(5G核心网部分)
  17. 微信成语接龙小程序|微擎框架|带流量主|前端+后端完整源码
  18. ros学习——gmapping建图
  19. kindle亚马逊个人文档不显示_Kindle 没东西看?一个插件就搞定!
  20. 四舍六入五成双方法-js版

热门文章

  1. 办理测绘资质所需流程以及材料(2022最新)
  2. 防火墙——防火墙基础知识
  3. confluence
  4. 查违章老显示服务器维护中咋回事,违章查询怎么老显示系统正在维护呢,为什么违章查询总是显示维护状态?...
  5. ENVI5.3.1使用Landsat 8影像进行图像镶嵌和图像裁剪实例操作
  6. 今年最受欢迎的14款黑客工具
  7. 精读《Prisma 的使用》
  8. Redis数据类型——hash
  9. 如何删除Mac OS Monterey自带(预装)软件?
  10. 电钻、电锤、电镐的区别