初识python:tkinter 实现 弹球小游戏(面向对象)
使用蹩脚式面相对象,实现弹球小游戏(非面向对象实现,主要介绍tk基础用法)。

#!/user/bin env python
# author:Simple-Sir
# time:2020/8/7 10:09 import tkinter,time,random # 创建颜色列表
COLOR = ['#f173ac','#73b9a2','#fdb933','#d71345','#fffef9','#afdfe4','#ffe600'] # 创建窗口
tk = tkinter.Tk() # 声明一个TK,初始化一个“窗口”(画一个窗口)
tk.title('弹球游戏') # 窗口名称
tk.resizable(width=False,height=False) # 窗口是否可变(长、宽),也可用0,1表示
tk.wm_attributes('-topmost',1) # 窗口永远在前 # 创建画布
canvas = tkinter.Canvas(tk,width=600,height=500,bd=0) # 创建一个“画布”
canvas.pack() # 将画布添加到窗口中
tk.update() # 创建背景
class Bg():
def __init__(self,canvas,file):
self.filename = tkinter.PhotoImage(file=file) # 获取一张图片
canvas.create_image(300, 250,image=self.filename) # 将图片添加到画布,作为背景 # 创建球
class Ball():
def __init__(self,canvas,COLOR):
self.COLOR = COLOR
self.id_ball = canvas.create_oval(10,10,30,30, fill=random.choice(COLOR), width=0) # 定义一个球
canvas.move(self.id_ball,random.randint(-10,300),random.randint(-20,300))
self.ball_p_text = canvas.create_text(120, 20, text='球的坐标:{0}'.format(canvas.coords(self.id_ball)), fill='white')
self.x = 1
self.y = 1
self.score = 0
self.level = 1
self.wh = canvas.winfo_height() # 获取窗口高度(update刷新之后才能获取)
self.ww = canvas.winfo_width() # 获取窗口宽度(update刷新之后才能获取) def run_ball(self):
p_ball = canvas.coords(self.id_ball)
if p_ball[0] <= 0: # 当球落到右边框时:左上角x坐标判断
self.x = 1
elif p_ball[2] >= self.ww: # 当球落到右边框时,右下角x坐标判断
self.x = -1
if p_ball[1] <= 0: # 当球落到上边框时,左上角y坐标判断
self.y = 1
elif p_ball[3] >= self.wh: # 当球落到下边框时,右下角y坐标判断
self.y = -1 def touch(self):
p_ball = canvas.coords(self.id_ball)
canvas.itemconfig(self.ball_p_text,text='球的坐标:{0}'.format(p_ball))
p_paddle = canvas.coords(paddle.id_paddle) # 获取木板的坐标
if p_ball[2] >= p_paddle[0] and p_ball[2] <= p_paddle[2] and p_ball[3] == p_paddle[1]: # 球与模板接触:球的右下角x坐标在木板右上角x坐标内,且球的右下角x坐标在木板左下角x坐标内,球的右下角y坐标等于木板的左上角y坐标
self.y = -1 # 让球向上移动
self.score += 10 # 得分加10分
canvas.itemconfig(self.id_ball, fill=random.choice(self.COLOR)) # 修改球的颜色,随机颜色
canvas.itemconfig(paddle.id_paddle, fill=random.choice(self.COLOR)) # 修改木板的颜色,随机颜色
if self.score > 0 and self.score % 50 == 0: # 每50分升一级
self.level += 1 # 升级
canvas.move(self.id_ball, self.x, self.y) # 移动 class Paddle():
def __init__(self,canvas,COLOR):
self.canvas=canvas
self.COLOR=COLOR
self.x = 0
self.id_paddle = canvas.create_rectangle(0,400,150,420,fill=random.choice(COLOR),width=0) # 定义木板
self.canvas.move(self.id_paddle,225,0)
self.ww = canvas.winfo_width() # 获取窗口宽度(update刷新之后才能获取)
self.canvas.bind_all('<KeyPress-Left>', self.turn_left)
self.canvas.bind_all('<KeyPress-Right>', self.turn_right) def run_paddle(self):
canvas.move(self.id_paddle, self.x, 0) # 先移动,再判断位置。若先判断,在移动,则位置永远是0或最大
p_paddle = canvas.coords(self.id_paddle) # 获取木板的坐标
if p_paddle[0] <= 0 or p_paddle[2] >= self.ww:
self.x = 0 def turn_left(self,event):
p_paddle = canvas.coords(self.id_paddle) # 获取木板的坐标
if p_paddle[0] <= 0:
self.x = 0
else:
self.x = -2 def turn_right(self,event):
p_paddle = canvas.coords(self.id_paddle) # 获取木板的坐标
if p_paddle[2] >= self.ww:
self.x = 0
else:
self.x = 2 class Score():
def __init__(self,canvas):
canvas.create_text(400, 20, text='关卡:',fill='white',font=('宋体', '15'))
canvas.create_text(500, 20, text='得分:',fill='white',font=('宋体', '15'))
self.id_level = canvas.create_text(440, 20, text=1,fill='white',font=('宋体', '15'))
self.id_score = canvas.create_text(540, 20, text=0,fill='white',font=('宋体', '15')) def update_lv_sc(self):
canvas.itemconfig(self.id_level, text=ball.level) # 修改等级
canvas.itemconfig(self.id_score, text=ball.score) # 修改分数 class Sys_game():
is_start = False
def __init__(self,canvas):
self.id_start_game = canvas.create_text(300, 200, text='Start Game !', font=('宋体', '30'), fill='white')
canvas.bind_all('<Button-1>', self.start_game)
self.wh = canvas.winfo_height() # 获取窗口高度(update刷新之后才能获取) def start_game(self,event):
if self.is_start:
self.is_start = False
canvas.itemconfig(self.id_start_game,text='Stop Game !',state='normal',fill='red')
else:
self.is_start = True
canvas.itemconfig(self.id_start_game,state='hidden') def is_play(self):
p_ball = canvas.coords(ball.id_ball)
if p_ball[3] == self.wh: # 当球与下边框接触时,游戏失败。
canvas.create_text(300, 250, text='Game Over !', font=('宋体', '30'), fill='red') # 添加游戏结束界面
self.is_start = False # 搞起
bg = Bg(canvas,'bg.png')
ball = Ball(canvas,COLOR)
paddle = Paddle(canvas,COLOR)
score = Score(canvas)
sys_game = Sys_game(canvas)
while 1:
sys_game.is_play()
if sys_game.is_start == True:
tk.update()
ball.run_ball()
ball.touch()
score.update_lv_sc()
paddle.run_paddle()
time.sleep(0.01/ball.level)
else:
tk.update()
弹球小游戏
运行结果:




初识python:tkinter 实现 弹球小游戏(面向对象)的更多相关文章
- 初识python:tkinter 实现 弹球小游戏(非面相对象)
通过 tkinter 采用非面相对象式实现弹球小游戏(使用蹩脚式面相对象实现). #!/user/bin env python # author:Simple-Sir # time:2020/8/3 ...
- 用Python设计一个经典小游戏
这是关于Python的第9篇文章,介绍如何用Python设计一个经典小游戏:猜大小. 在这个游戏中,将用到前面我介绍过的所有内容:变量的使用.参数传递.函数设计.条件控制和循环等,做个整体的总结和复习 ...
- java 图形化小工具Abstract Window Toolit :画笔Graphics,画布Canvas(),弹球小游戏
画笔Graphics Java中提供了Graphics类,他是一个抽象的画笔,可以在Canvas组件(画布)上绘制丰富多彩的几何图和位图. Graphics常用的画图方法如下: drawLine(): ...
- Python开发接水果小游戏
我研发的Python游戏引擎Pylash已经更新到1.4了.如今我们就来使用它完毕一个极其简单的小游戏:接水果. 下面是游戏截图: 游戏操作说明:点击屏幕左右两边或者使用键盘方向键控制人物移动.使人物 ...
- python【控制台】小游戏--贪吃蛇
传统贪吃蛇相信大家都玩过,也是一款很老很经典的游戏,今天我们用python控制台实现 项目有很多bug没有解决,因为本人一时兴起写的一个小游戏,所以只是实现可玩部分功能,并没有花较多的时间和精力去维护 ...
- python成语接龙小游戏
上一篇讲了小游戏的坑现在把源码放出来 #coding:utf-8 import string import pypinyin import sys import random print(" ...
- java_弹球小游戏
弹球游戏实现原理: 隔一定时间(小于1秒)重新绘制图像,因为Graphics类是一个抽象类,创建子类的时候需要把所有涉及的方法都得重写,所以这里使用的是创建Canvas的子类,只需要重写它的paint ...
- Python: tkinter实例改名小工具
#!/usr/bin/env python #coding=utf-8 # # 版权所有 2014 yao_yu (http://blog.csdn.net/yao_yu_126) # 本代码以MIT ...
- 【Python】猜数小游戏(文件操作)
人生苦短,我用Python 关键词 1.多用户 2.字典记录所有成绩 3.每次游戏轮数&总游戏次数&平均每次游戏需要多少轮 字典Dictionary.列表List.元组Tuple差异化 ...
随机推荐
- SpringBoot+MybatisPlus实现批量添加的两种方式
第一种: 因为Mysql数据每次发送sql语句的长度不能超过1M,所以,每次发送insert语句以固定长度发送: 将sql语句在provider中,以固定长度装入List集合中,然后返回service ...
- 利用ajax,js以及正则表达式来验证表单递交
<!DOCTYPE html><html lang="en"> <head> <meta charset="utf-8" ...
- 基于Web的质量和测试度量指标
直观了解软件质量和测试的完整性 VectorCAST/Analytics可提供便于用户理解的web仪表盘视图来显示软件代码质量和测试完整性指标,让用户能够掌握单个代码库的趋势,或对比多个代码库的度量指 ...
- Quartz在.NET中的使用
一.背景 例如需要在某年某月去将数据库的某个数据更新或者同步,又或者是每隔一段时间来执行一部分代码去调用接口,但是又不想人为的手动去执行 针对此类业务可以使用"定时调用任务",市面 ...
- 【简】题解 P4297 [NOI2006]网络收费
传送门:P4297 [NOI2006]网络收费 题目大意: 给定一棵满二叉树,每个叶节点有一个状态(0,1),任选两个叶节点,如果这两个叶节点状态相同但他们的LCA所管辖的子树中的与他们状态相同的叶节 ...
- Redis | 第12章 Sentinel 哨兵模式《Redis设计与实现》
目录 前言 1. 启动并初始化 Sentinel 2. Sentinel 与服务器间的默认通信 2.1 获取主服务器信息 2.2 获取从服务器信息 2.3 向主服务器和从服务器发送信息 3. 接受来自 ...
- vscode高效管理不同项目文件
vscode作为一个轻量级编辑器,深受大家喜爱,这其中当然也囊括了本人.我同时使用vscode写c++.java.python以及markdown文档,每次打开vscode都要切换到对应的文件夹,非常 ...
- 项目开发中,真的有必要定义VO,BO,PO,DO,DTO这些吗?
存在即是合理的,业务复杂,人员协同性要求高的场景下,这些规范性的东西不按着来虽然不会出错,程序照样跑,但是遵守规范会让程序更具扩展性和可读性,都是前辈血淋淋的宝贵经验,为什么不用? 随着现在后端编程标 ...
- Boss直聘App上“天使投资、VC、PE” 与“A轮、B轮、C轮融资”的关系
我们经常看到朋友圈里某某公司获得了某轮融资,所谓的A轮B轮究竟是个什么概念呢?今天就跟小伙伴们分享一下A.B.C.D轮融资与天使投资.VC.PE的关系. 天使投资(AI):天使投资所投的是一些非常早期 ...
- Airtest结合tidevice实现IOS自动化测试
这篇博文内容,是基于之前的配置而来的.我们可以先回顾一下之前博文,Windows搭建mac黑苹果系统:WebDriverAgent重签名爬坑记 . 今天来分享下如何通过 tidevice实现IOS自动 ...