python3.6使用tkinter實現彈跳小球遊戲

這篇文章主要爲大家詳細介紹了python3.6使用tkinter實現彈跳小球遊戲,具有一定的參考價值,感興趣的小夥伴們可以參考一下

本文實例爲大家分享了python3.6實現彈跳小球遊戲的具體代碼,供大家參考,具體內容如下

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() #更新內容

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持神馬文庫。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章