本文实例为大家分享了python3.6实现弹跳小球游戏的具体代码,供大家参考,具体内容如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
import random
import time
from tkinter import *
#下面定义一个球的类,有canvas和color两个对象
class ball: #定义一个ball类的函数
def __init__( self ,canvas,paddle,color): #这是ball类的属性函数,ball类下的函数都有这些性质
self .canvas = canvas
self .paddle = paddle
self . id = canvas.create_oval( 10 , 10 , 25 , 25 ,fill = color) #返回所绘小球的调用值放入对象self.id
self .canvas.move( self . id , 245 , 100 ) #移动小球到(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() #画布高度函数winfo_height()返回值放入canvas_height对象中
self .canvas_width = self .canvas.winfo_width() #winfo_width()返回画布宽度放入canvas_width对象中
self .hit_bottom = false #设定hit_bottom初始值为false
def hit_paddle( self ,pos): #声明函数,以供调用
paddle_pos = self .canvas.coords( self .paddle. id ) #将球拍的(x1,y1)(x2,y2)的坐标放到paddle_pos中
if pos[ 2 ]> = paddle_pos[ 0 ] and pos[ 0 ]< = paddle_pos[ 2 ]: #
if pos[ 3 ]> = paddle_pos[ 1 ] and pos[ 3 ]< = paddle_pos[ 3 ]: #比较小球y轴是否在球拍y轴内
return true #表示小球碰到了球拍
return false #表示小球没有碰到球拍
def draw( self ): #声明draw函数,
self .canvas.move( self . id , self .x, self .y) #移动小球,移动速度为(self.x,self.y),在init中的属性可以直接用
pos = self .canvas.coords( self . id ) #把小球的左上角和右下角的坐标以列表形式(可能元组)放入pos对象中
if pos[ 1 ]< = 0 : #如果小球碰到画布上方
self .y = 3 #则改变移动方向向下方
if pos[ 3 ]> = self .canvas_height: #如果小球碰到画布底端 则返回hit_bottom为true
self .hit_bottom = true
if self .hit_paddle(pos) = = true: #小球碰到了球拍,则改变y轴方向向上运动
self .y = - 3
if pos[ 0 ]< = 0 : #如果小球碰到了画布左边,则把x轴速度改成每次向右3个像素
self .x = 3
if pos[ 2 ]> = self .canvas_width: #如果小球碰到了画布右边,则把速度改成每次向左3个像素
self .x = - 3
class paddle: #定义一个paddle类
def __init__( self ,canvas,color): #paddle类的属性函数,默认有两个变量画布和颜色
self .canvas = canvas #将canvas对象赋给self.canvas
self . id = canvas.create_rectangle( 0 , 0 , 100 , 10 ,fill = color) #创建球拍,将球拍的调用编号存入self.id
self .canvas.move( self . id , 200 , 300 ) #将球拍移动到(200,300)处
self .x = 0 #
self .canvas_width = self .canvas.winfo_width() #将画布的宽度放入canvas_width对象
self .canvas.bind_all( '<keypress-left>' , self .turn_left) #用bind_all()函数绑定键盘左键与tun_left函数
self .canvas.bind_all( '<keypress-right>' , self .turn_right) #绑定键盘右键与turn_right函数
def draw( self ): #声明一个draw函数
self .canvas.move( self . id , self .x, 0 ) #左右移动球拍的速度为self.x,默认不动
pos = self .canvas.coords( self . id ) #将球拍的左上角和右下角的坐标存入pos对象中
if pos[ 0 ]< = 0 : #如果球拍x轴小于0,则不再向右移动
self .x = 0
elif pos[ 2 ]> = self .canvas_width: #如果球拍要超过画布右侧了,则球拍的移动速度变为0
self .x = 0
def turn_left( self ,evt): #这里的evt是调用方传过来的参数,改变球拍的移动速度向左,
self .x = - 5
def turn_right( self ,evt): #改变球拍的移动速度向右每次5个像素
self .x = 5
#创建框架并且命名和固定,然后创建该框架的画布
tk = tk() #创建框架对象tk
tk.title( 'game' ) #框架对象tk显示的名字为'game'
tk.resizable( 0 , 0 ) #固定框架
tk.wm_attributes( '-topmost' , 1 ) #显示在最外层
canvas = canvas(tk,width = 500 ,height = 400 ,bd = 0 ,highlightthickness = 0 ) #创建画布canvas,属于tk框架对象,
canvas.pack() #显示画布的变化
tk.update() #显示框架的变化
#把类赋值给对象ball,如果调用了ball就可以实现该类的作用
paddle = paddle(canvas, "blue" ) #调用拍的类给对象paddle用
ball = ball(canvas,paddle, 'green' ) #调用球的类给对象ball用
while true: #要注意while语句以防止死循环,先设置为真
if ball.hit_bottom = = false: #没有碰到底部的话执行下面的语句
ball.draw() #调用ball对象的函数draw()
paddle.draw() #调用paddle对象的函数draw()
tk.update_idletasks()
tk.update() #更新框架
time.sleep( 0.01 ) #睡眠0.01秒
elif ball.hit_bottom = = true: #要是小球接触了底部
canvas.create_text( 200 , 100 ,text = 'aha,you lose it,\nhow about try again?' ,font = ( 'times' , 22 )) #在(200,100)坐标处创建文本‘...',字号22号
tk.update() #更新内容
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/K_caesura/article/details/80022807