Tkinter做弹球游戏

要求:小球撞击到墙壁的时候,会反弹,当碰到球拍的时候,也会反弹,如果碰到底部的时候,游戏结束,输出总共碰撞了多少次。


控制程序运行的类(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
		

小球的类(the_ball.py)

#!/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

球拍的类(the_paddle.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
		

在命令行中输入

python paddleball.py

执行以后运行的环境,

Tkinter做弹球游戏_第1张图片

Tkinter做弹球游戏_第2张图片


当然,也可以把上面的代码进行打包,生成可执行的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'])

进入到setup.py文件所在的文件夹,执行python setup.py py2exe

如果没有错误的话会生成dist和build这两个文件夹。

在dist文件夹下面有一个paddleball.exe的exe文件,双击执行即可。


提示:对于所有的代码,最好都放在同一个文件夹,避免不必要的错误

你可能感兴趣的:(Tkinter做弹球游戏)