要求:小球撞击到墙壁的时候,会反弹,当碰到球拍的时候,也会反弹,如果碰到底部的时候,游戏结束,输出总共碰撞了多少次。
控制程序运行的类(paddleball.py)
#!/usr/bin/python
#coding: utf-8
#from __future__ import unicode_literals
from Tkinter import *
# from the_ball import Ball
import random
import time
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, 250, 400)
# x为左右移动的时候每一步的距离
self.x = 0
# 左右移动的速度
self.speed = 2
# 获取画布的宽度
self.canvas_width = self.canvas.winfo_width()
# 处理事件,当点击向左向右的时候作出反应
self.canvas.bind_all('', self.turn_left)
self.canvas.bind_all('', self.turn_right)
self.canvas.bind_all('', self.reduce_speed)
self.canvas.bind_all('', self.increase_speed)
def draw(self):
self.canvas.move(self.id, self.x, 0)
pos = self.canvas.coords(self.id)
# 设置如果碰到边界就自动反弹
if pos[0] <= 0:
self.x = self.speed
elif pos[2] >= self.canvas_width:
self.x = -self.speed
def turn_left(self, event):
self.x = -self.speed
def turn_right(self, event):
self.x = self.speed
# 注意:速度的更新只有在碰到墙壁或者是改变移动方向的时候才有用,不然的话不会对速度改变产生影响
def increase_speed(self, event):
'增加移动的速度'
if self.speed == 5:
self.speed = 5
elif self.speed < 5:
self.speed += 1
def reduce_speed(self, event):
'减少移动的速度'
if self.speed == 1:
self.speed = 1
elif self.speed > 1:
self.speed -= 1
#!/usr/bin/python
#coding: utf-8
#from __future__ import unicode_literals
from Tkinter import *
# from the_paddle import Paddle
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, 245)
# 设置起始时的x的所有可能取值
self.starts = [-3, -2, -1, 1, 2, 3]
# 重排,
random.shuffle(self.starts)
# 初始变量x为starts[0],y为-1
self.x = self.starts[0]
self.y = -3
# winfo_height 函数用来获取画布当前的高度
self.canvas_height = self.canvas.winfo_height()
self.canvas_width = self.canvas.winfo_width()
# 判断输赢,通过是否撞击到底部判断
self.hit_bottom = False
# 统计撞击次数
self.sum = 0
def hit_paddle(self, pos):
# 获得木板此时的id
paddle_pos = self.canvas.coords(self.paddle.id)
# 判断是否相撞
if pos[2] >= paddle_pos[0] and pos[0] <= paddle_pos[2]:
if pos[3] >= paddle_pos[1] and pos[3] <= paddle_pos[3]:
self.sum += 1
return True
return False
def draw(self):
'draw函数中每次转换方向的时候都使用了random函数的方法,目的是增加随机性'
self.canvas.move(self.id, self.x, self.y)
# 画布函数coords,通过id来返回画布上任何画好的东西的当前的x和y的坐标
# 返回四个值
# 前两个表示的是左上角的坐标
# 后两个表示的是右下角的坐标
# 都是先x后y
pos = self.canvas.coords(self.id)
#print(pos)
if pos[1] <= 0: # 表示的是左上角的y
self.y = abs(self.starts[random.randrange(6)])
elif pos[3] >= self.canvas_height:
self.hit_bottom = True
# self.y = -abs(self.starts[random.randrange(6)])
elif pos[0] <= 0:
self.x = abs(self.starts[random.randrange(6)])
elif pos[2] >= self.canvas_width:
self.x = -abs(self.starts[random.randrange(6)])
# 如果撞击到木板,把y轴的方向反转
if self.hit_paddle(pos) == True:
self.y = -self.y
#!/usr/bin/python
#coding: utf-8
#from __future__ import unicode_literals
from Tkinter import *
# from the_ball import Ball
import random
import time
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, 250, 400)
# x为左右移动的时候每一步的距离
self.x = 0
# 左右移动的速度
self.speed = 2
# 获取画布的宽度
self.canvas_width = self.canvas.winfo_width()
# 处理事件,当点击向左向右的时候作出反应
self.canvas.bind_all('', self.turn_left)
self.canvas.bind_all('', self.turn_right)
self.canvas.bind_all('', self.reduce_speed)
self.canvas.bind_all('', self.increase_speed)
def draw(self):
self.canvas.move(self.id, self.x, 0)
pos = self.canvas.coords(self.id)
# 设置如果碰到边界就自动反弹
if pos[0] <= 0:
self.x = self.speed
elif pos[2] >= self.canvas_width:
self.x = -self.speed
def turn_left(self, event):
self.x = -self.speed
def turn_right(self, event):
self.x = self.speed
# 注意:速度的更新只有在碰到墙壁或者是改变移动方向的时候才有用,不然的话不会对速度改变产生影响
def increase_speed(self, event):
'增加移动的速度'
if self.speed == 5:
self.speed = 5
elif self.speed < 5:
self.speed += 1
def reduce_speed(self, event):
'减少移动的速度'
if self.speed == 1:
self.speed = 1
elif self.speed > 1:
self.speed -= 1
python paddleball.py
执行以后运行的环境,
当然,也可以把上面的代码进行打包,生成可执行的exe文件,使用py2exe,
百度下载py2exe即可
打包要用的setup.py文件如下
#!/usr/bin/python
#coding: utf-8
#from __future__ import unicode_literals
from distutils.core import setup
import py2exe
setup(console = ['paddleball.py'])
如果没有错误的话会生成dist和build这两个文件夹。
在dist文件夹下面有一个paddleball.exe的exe文件,双击执行即可。
提示:对于所有的代码,最好都放在同一个文件夹,避免不必要的错误