zoukankan      html  css  js  c++  java
  • python使用tkinter写的弹跳游戏。

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

     用IDLE自带的tkinter写的小球游戏,

    参考教材《教孩子学编程》作者Jason R.Briggs

  • 相关阅读:
    登陆中发现css页面不见了,变成了光秃秃的输入框问题
    servlet基础一
    解决问题:Error:(5, 59) java: 程序包javax.servlet.http不存在
    静态方法的引用
    登录功能之添加验证码(包含切换验证码)
    生成图片验证码(VerifyCode)
    idea编辑器中批量完成注释及批量取消注释
    jdbc连接测试
    利用IO流复制图片
    js 判空
  • 原文地址:https://www.cnblogs.com/caesura-k/p/8893027.html
Copyright © 2011-2022 走看看