用python自带Tkinter模块写一个弹球小游戏
效果图:
开发环境:
python 2.7.13
开发所需模块:
- Tkinter
- time
- random
- winsound
代码如下:
# -*- coding: utf-8 -*-
from Tkinter import *
import random
import time
import winsound
over_sound = 'over.wav'
#小球的类
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,100)
starts = [-3,-2,-1,1,2,3]
random.shuffle(starts)
self.x = starts[0]
self.y = -3
self.canvas_height = self.canvas.winfo_height() #获取画布当前的高度
self.canvas_width = self.canvas.winfo_width()
self.hit_bottom = False
#判断是否碰撞函数
def hit_paddle(self,pos):
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]:
return True
return False
#绘制和移动判断函数
def draw(self):
self.canvas.move(self.id,self.x,self.y)
pos = self.canvas.coords(self.id) #coords返回当前ID对象的位置列表[x1,y1,x2,y2]
if pos[1]<=0 :
self.y = 3
if pos[3]>=self.canvas_height:
self.hit_bottom = True
if self.hit_paddle(pos) == True:
self.y = -3
if pos[0]<= 0:
self.x = 3
if pos[2] >= self.canvas_width:
self.x = -3
#声明挡板的类
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)
self.x=0
self.canvas_width = self.canvas.winfo_width()
#绑定按键事件和函数
self.canvas.bind_all('<KeyPress-Left>',self.turn_left)
self.canvas.bind_all('<KeyPress-Right>',self.turn_right)
def draw(self):
self.canvas.move(self.id,self.x,0)
pos = self.canvas.coords(self.id)
if pos[0] <= 0:
self.x = 0
if pos[2] >= self.canvas_width:
self.x = 0
def turn_left(self,evt):
self.x = -3
def turn_right(self,evt):
self.x= 3
tk = Tk()
tk.title("Game")
tk.resizable(0,0) #使创口的大小不可调整
tk.wm_attributes("-topmost",1) #表示把包含画布的窗口放到其他窗口的前面
canvas = Canvas(tk,width=500,height=400,bd=0,highlightthickness=0)
#bd=0,highlightthickness=0确保在画布之外没有边框
canvas.pack()
tk.update()
paddle = Paddle(canvas,'blue')
ball = Ball(canvas,paddle,'red')
#如果关闭游戏窗口会打印出错误信息,这是因为代码要强行从while里面跳出来,
#Python觉得不爽
while 1:
if ball.hit_bottom == False:
ball.draw()
paddle.draw()
elif ball.hit_bottom == True:
break
tk.update_idletasks() #快一点把画布上的东西画出来
tk.update()
time.sleep(0.01)
canvas.create_text(260,190,text='GAME OVER',font=('黑体',20))
time.sleep(0.05)
winsound.PlaySound(over_sound,winsound.SND_NODEFAULT)
tk.mainloop()
项目下载地址:点我下载