python Tkinter 写一个弹球的小游戏
#!usr/bin/python
#-*- coding:utf-8 -*-
from Tkinter import *
import Tkinter
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) #参数:左上角坐标(x1,y1),右下角坐标(x2,y2),填充色
self.canvas.move(self.id,245,100) #把椭圆形移到画布的中心(245,100)
starts = [-3,-2,-1,1,2,3] #用一个列表随机一个小球的初始横向 X 坐标
random.shuffle(starts) #利用shuffle函数使starts列表混排一下,这样starts[0]就是列表中的随机值
self.x = starts[0] #所以X可能是以列表中的任意一个值开始的
self.y = -2 #初始的竖直方向运动的速度
self.canvas_height = self.canvas.winfo_height() #调用画布上的winfo_height函数来获取画布当前的高度
self.canvas_width = self.canvas.winfo_width() #保证小球不会从屏幕的两边消失,把画布的宽度保存到一个新的对象变量canvas_width中
self.hit_bottom =False
def hit_paddle(self,pos): #包含小球的当前坐标
paddle_pos = self.canvas.coords(self.paddle.id) #得到拍子的坐标,并把它们放到变量paddle_pos中
#pos[2]包含了小球的右侧X坐标,pos[0]包含了小球左侧的X坐标
if pos[2] >= paddle_pos[0] and pos[0] <=paddle_pos[2]: #如果小球的右侧大于球拍的左侧,并且小球的左侧小于球拍的右侧
#pos[3]表示小球的底部(此处判断小球的底部是否在球拍的顶部和底部之间,注:坐标从上到下是逐渐变大的,零点在上面)
if pos[3] >=paddle_pos[1] and pos[3] <= paddle_pos[3]:#可以理解为,第一个if判断和球拍的长那个面是否碰撞,第二个是侧面
return True
return False
def draw(self):
self.canvas.move(self.id,self.x,self.y)
pos = self.canvas.coords(self.id) #coords函数通过ID来返回当前画布上任何画好的东西的当前X和Y坐标
if pos[1] <=0: #coords函数返回一个由四个数字组成的列表来表示坐标(椭圆的左上角坐标和右下角的)
self.y=2#判断是否撞击到顶面
if pos[3] >=self.canvas_height:#判断小球是否撞到了屏幕的底部,如果小球一旦碰到了画布的底端,游戏就结束了i
self.hit_bottom = True
print"你输了!"
if self.hit_paddle(pos) == True: #hit_paddle()函数是用来判断小球是否撞击到球拍(如果撞到了就改变方向运动"-"代表反向,2代表速度)
self.y = -2
if pos[0] <=0:#最后两个if判断小球是否撞到了画布的左侧和右侧
self.x = 2
if pos[2] >= self.canvas_width:
self.x = -2
#球拍类
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)#把球拍的坐标移到(200,300)横向200像素,纵向300像素
self.x =0
self.canvas_width = self.canvas.winfo_width() #保存画布宽度的变量
self.canvas.bind_all('<KeyPress-Left>',self.turn_left)#把turn_left()函数绑定到左方向键上
self.canvas.bind_all('<KeyPress-Right>',self.turn_right)#把turn_right()函数班规定到右方向键上
def draw(self):
self.canvas.move(self.id,self.x,0) #在x的方向上移动球拍
pos =self.canvas.coords(self.id)#获得球拍的坐标
if pos[0] <=0:#如果球拍运动到左边缘的时候,就让球拍停止运动,以下的elif道理相同
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
t = Tkinter.Tk()
t.title("Game") #用t对象中的title函数给窗口加一个标题,t对象是由t=Tk()创建的
t.resizable(0,0)#规定窗口不可调,两个参数0,0,表示在水平和竖直方向上都不可改变
t.wm_attributes("-topmost",1)#调用wm_attributes来告诉tkinter把包含我们画布的窗口放到所有其他窗口之前(-topmost)
canvas = Canvas(t,width=500,height=400,bd=0,highlightthickness=0)
canvas.pack()#按前一行给出的宽度和高度的参数来调整自身大小
t.update()#做好初始化
paddle = Paddle(canvas,'blue')
ball = Ball(canvas,paddle,'red')
while 1:
if ball.hit_bottom ==False:
ball.draw()
paddle.draw()
else:
break
t.update_idletasks()
t.update()#快速更新画布
time.sleep(0.01)
t.mainloop()
python Tkinter 写一个弹球的小游戏的更多相关文章
- 10分钟用scratch写一个大鱼吃小鱼的小游戏
第一次给张江小朋友教Scratch课程之前,还在担心一些概念能不能向小朋友解释清楚,可上完课发现,我严重低估了小朋友的聪明程度,发现现在的孩子相比较自己8.9岁的时候,简直聪明太多倍了. 所以总结了半 ...
- Python3的tkinter写一个简单的小程序
一.这个学期开始学习python,但是看了python2和python3,最后还是选择了python3 本着熟悉python的原因,并且也想做一些小程序来增加自己对python的熟练度.所以写了一个简 ...
- Python中写一个乒乓球类的游戏
最近开始学Python,感觉挺好玩的,既有脚本语言的灵活性,又有丰富的类库与面向对象的特点,开发起来很方便. 游戏的规则和乒乓球一样,如果妙蛙种子掉地上了就算输,你可以用蓝色的跷跷板弹它,使他不落到地 ...
- 用js写一个贪吃蛇小游戏
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Java 用java GUI写一个贪吃蛇小游戏
目录 主要用到 swing 包下的一些类 上代码 游戏启动类 游戏数据类 游戏面板类 代码地址 主要用到 swing 包下的一些类 JFrame 窗口类 JPanel 面板类 KeyListener ...
- 利用 Python 写一个颜值测试小工具
我们知道现在有一些利用照片来测试颜值的网站或软件,其实使用 Python 就可以实现这一功能,本文我们使用 Python 来写一个颜值测试小工具. 很多人学习python,不知道从何学起.很多人学习p ...
- canvas写个简单的小游戏
之前在HTML5 Canvas属性和方法汇总一文中,介绍过Canvas的各种属性以及方法的说明,并列举了自己写的一些Canvas demo,接下来开始写一个简单的小游戏吧,有多简单,这么说吧,代码不到 ...
- python小练习:使用循环和函数实现一个摇骰子小游戏。游戏规则如下:游戏开始,首先玩家选择Big or Small(押大小),选择完成后开始摇三个骰子,计算总值,11<=总值<=18为“大”,3<=总值<=10为“小”。然后告诉玩家猜对或者是猜错的结果。
python小练习:使用循环和函数实现一个摇骰子小游戏.游戏规则如下:游戏开始,首先玩家选择Big or Small(押大小),选择完成后开始摇三个骰子,计算总值,11<=总值<=18为“ ...
- 【C语言探索之旅】 第一部分第八课:第一个C语言小游戏
内容简介 1.课程大纲 2.第一部分第八课:第一个C语言小游戏 3.第一部分第九课预告: 函数 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写 ...
随机推荐
- [CodeChef - GERALD07 ] Chef and Graph Queries
Read problems statements in Mandarin Chineseand Russian. Problem Statement Chef has a undirected gra ...
- shell下在while循环中使用ssh命令的问题
1 现象描述 最近使用ssh批量执行命令(已经做了密钥互信了),脚本读取配置文件中的主机列表(内容为每行一台主机IP地址),然后执行,可是每次只是执行第一台,就退出循环了. 2 排查思路 由于脚本比较 ...
- Linux 入门记录:二十、Linux 包管理工具 YUM
一.YUM(Yellowdog Updater, Modified) 1. YUM 简介 RPM 软件包形式管理软件虽然方便,但是需要手动解决软件包的依赖问题.很多时候安装一个软件首先需要安装 1 个 ...
- device tree 負值 property 寫法
倘若你要設定 負值的property, 可能需要括符才會 build 過. 正確 decidegc = <(-10)>; 錯誤 decidegc = <-10>;
- python基础===通过菲波那契数列,理解函数
def fib(n): # write Fibonacci series up to n """Print a Fibonacci series up to n.&quo ...
- MySQL多线程复制故障(slave_pending_jobs_size_max)
MySQL多线程复制故障(slave_pending_jobs_size_max) http://www.xuchanggang.cn/archives/1079.html
- 图论-最小生成树-Kruskal算法
有关概念: 最小生成树:在连通图G中,连接图G所有顶点且总权最小的边构成的树 思路: 首先对边按权从小到大排序,紧接着枚举每一条边,如果两个结点的祖先结点不同(并查集),则连上此边,直到边数等于结点数 ...
- 怎么快速入门一个老的java项目
作者:eilen著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 1.有文档肯定先看文档,先看设计文档,产品的.技术的设计文档,接口文档写的好的可以看看,要是写的不好不着急看. 2 ...
- 数据库简述(以MySQL为例)
一.数据库中的概念 1.数据库是用户存放数据.访问数据.操作数据的存储仓库,用户的各种数据被有组织地存放在数据库中.可以随时被有权限的用户查询.统计.添加.删除和修改.可以说,数据库是长期存储在计算机 ...
- CSS3 icon font
大家都知道现在各个浏览器都支持CSS3的自定义字体(@font-face),包括IE6都支持,只是各自对字体文件格式的支持不太一样.那么对于网站中用到的各种icon,我们就可以尝试使用font来实现, ...