python游戏初探:拍子打小球
根据前面慢屏幕乱跑的小球,改编一个弹球游戏,下面加一个球拍,当球碰到拍子的时候弹回去
版本一
目前这个实现的功能是:加入了一拍子,可以用键盘来左右控制移动
#########################
#之前做的画面没有互动,这次加入一个球拍,使之能把下落的球给挡回去,目前功能加入了一拍子,可以用键盘来左右控制移动
######################
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()
继续进行功能扩展
加入如下功能:
- 点击球拍开始游戏
- 计分功能
- 加速功能
- 结束提醒功能
'''
#########################
#之前做的画面没有互动,这次加入一个球拍,使之能把下落的球给挡回去,同时较少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游戏初探:拍子打小球相关推荐
- 《Python游戏趣味编程》 第2章 弹跳的小球
2 弹跳的小球 图书简介可以看这里: 童晶:<Python游戏趣味编程>新书上架了 Python之所以功能强大,一个原因就是有大量功能强大的库,安装好后即可使用这些库的功能.打开海龟编辑器 ...
- ❤️❤️马上安排!闺女想在游戏里成为【超人】,Python游戏开发模块Pygame系列之【跳跃的小球】❤️❤️源码
今天正式学习Pygame 学习环境 适合人群 跳跃的小球 实现步骤说明 创建游戏窗口 display模块的常用方法 窗口显示 加载游戏图片 Surface对象的常用方法 移动图片 碰撞检测 限制小球移 ...
- python小球在窗口弹来弹去_《Python游戏趣味编程》 第2章 弹跳的小球
知乎视频www.zhihu.com 图书简介可以看这里:童晶:<Python游戏趣味编程>新书上架了zhuanlan.zhihu.com Python之所以功能强大,一个原因就是有大量 ...
- Python游戏开发pygame模块,Python实现球球碰撞小游戏
相信大家在初中电脑课上都偷偷玩过 Flash 游戏--是男人就坚持 100 秒,在游戏中无数的小球随机运动,玩家用鼠标控制大球,当大球碰撞到小球后,游戏结束,显示坚持的时间.今天我们一起来开发这个小游 ...
- 进击的Python【第一章】:Python背景初探与Python基础(一)
Python背景初探 一.Python起源 Python的创始人为Guido van Rossum.1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,做 ...
- python游戏程序-Python游戏趣味编程
书名:Python游戏趣味编程 定价:69.0 ISBN:9787115538246 作者:童晶 版次:第1版 出版时间:2020-07 内容提要: 本书把趣味游戏开发应用于Python编程教学,通过 ...
- 《Python游戏趣味编程》第12章 坚持一百秒
12 坚持一百秒 图书简介可以看这里: 童晶:<Python游戏趣味编程>新书上架了 本章我们将编写一个坚持一百秒的游戏,玩家通过鼠标控制飞机躲避飞舞的小球,效果如图12-1所示.首先学习 ...
- 《Python游戏趣味编程》 第4章 疯狂的小圆圈
4 疯狂的小圆圈 图书简介可以看这里: 童晶:<Python游戏趣味编程>新书上架了 本章我们将实现一个好玩的程序,鼠标点击后,会在点击处出现一些同心圆圈,并在窗口中四处反弹,效果如图4- ...
- 《Python游戏趣味编程》新书上架了
<Python游戏趣味编程>案例视频 <Python游戏趣味编程>新书上架了,目前京东.淘宝.当当上搜书名就可以找到,比如: https://item.jd.com/12899 ...
最新文章
- TypeError(“cannot concatenate ‘str‘ and ‘instancemethod‘ objects“,)
- SQLyog普通版与SQLyog企业版对比分析
- 使用resnet训练CIFAR10
- zookeeper C API
- RTMP代理的协议规范(RtmpProxy)
- (Python)时序预测的七种方法
- 【面向对象】面向对象程序设计测试题9-对象之间的继承关系测试题
- oracle 10g 创建只读用户语法
- 基于知识的智能体 笔记
- asp.net mvc 伪静态路由配置
- (4)二进制文件方式部署Kubernetes高可用集群----------安装kubectl命令行工具
- Oracle的函数大全
- SiamFC复现结果
- java代码格式化的快捷键设置_如何使用VS中的快捷键快速格式化代码使好看,整齐...
- ptx760功能图解_ptx760对讲机使用教程
- 5G词汇通俗解释(5G核心网部分)
- 微信成语接龙小程序|微擎框架|带流量主|前端+后端完整源码
- ros学习——gmapping建图
- kindle亚马逊个人文档不显示_Kindle 没东西看?一个插件就搞定!
- 四舍六入五成双方法-js版