欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python 實(shí)現(xiàn)彈球游戲的示例代碼

 更新時(shí)間:2020年11月17日 17:03:31   作者:cunxi1992  
這篇文章主要介紹了python 實(shí)現(xiàn)彈球小游戲,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下

運(yùn)行效果

實(shí)現(xiàn)代碼

# -*- coding: utf-8 -*-
import tkinter as tkinter
import tkinter.messagebox as mb
import random,time

class Ball():
  '''
  創(chuàng)建Ball類,初始化對(duì)象,即創(chuàng)建對(duì)象設(shè)置屬性,
  init函數(shù)是在對(duì)象被創(chuàng)建的同時(shí)就設(shè)置屬性的一種方法,Python會(huì)在創(chuàng)建新對(duì)象時(shí)自動(dòng)調(diào)用這個(gè)函數(shù)。
  '''

  def __init__(self,canvas,paddle,score,color,init_x=100,init_y=100):
    '''
    Ball類初始化屬性
    :param canvas:畫布
    :param paddle:球拍
    :param score:得分
    :param color:小球的顏色
    :param init_x:小球球的初始橫坐標(biāo),有默認(rèn)值,可不傳
    :param init_y:小球球的初始縱坐標(biāo),有默認(rèn)值,可不傳
    '''
    self.canvas = canvas
    self.paddle = paddle
    self.score = score
    self.color = color

    # 保存tkinter畫小球返回的id,為后期移動(dòng)屏幕上的小球做準(zhǔn)備,
    # 參數(shù)分別表示為:(10,10)表示左上角x,y坐標(biāo),(30,30)表示右下角x,y坐標(biāo),即創(chuàng)建一個(gè)直徑為20的圓
    # fill為小球的填充色
    self.id = canvas.create_oval(10,10,30,30,fill=self.color)
    # 將小球移動(dòng)到初始位置,初始位置可通過(guò)傳參進(jìn)行更改,有默認(rèn)值
    self.canvas.move(self.id,init_x,init_y)

    # 給一串x分量的起始值(x和y代表橫坐標(biāo)和縱坐標(biāo)的分量)
    starts = [-3,-2,-1,1,2,3]
    # shuffle() 方法將序列的所有元素隨機(jī)排序
    random.shuffle(starts)
    # 隨機(jī)混排序,賦值給對(duì)象變量x,讓它起始的時(shí)候獲得隨機(jī)分量值,引起球每次起始角度都不同
    self.x = starts[0]
    # 對(duì)象變量y就是垂直分量移動(dòng)的初始值,等價(jià)于上下移動(dòng),值代表移動(dòng)多少像素點(diǎn)
    self.y = -3

    # winfo_height()函數(shù)來(lái)獲取畫布當(dāng)前的高度,賦值給對(duì)象變量
    self.canvas_height = self.canvas.winfo_height()
    # winfo_width()函數(shù)來(lái)獲取畫布當(dāng)前的寬度,賦值給對(duì)象變量
    self.canvas_width = self.canvas.winfo_width()
    # 小球是否碰觸到畫布底部,初始值為False,即沒(méi)有碰到
    self.hit_bottom = False


  def draw(self):
    '''
    該函數(shù)用于讓小球水平和垂直運(yùn)動(dòng),在運(yùn)動(dòng)的過(guò)程中,判斷是否得分、游戲是否結(jié)束
    '''
    # 讓小球可以水平和垂直運(yùn)動(dòng)
    self.canvas.move(self.id,self.x,self.y)
    # coords函數(shù)通過(guò)id返回畫布球的坐標(biāo)列表(兩個(gè)坐標(biāo),左上角的坐標(biāo)和右下角的兩個(gè)坐標(biāo))
    position = self.canvas.coords(self.id)
    # 判斷小球是否撞到畫布頂部或者底部,保證小球反彈回去,不消失
    if position[1] <= 0: # 如果小球的左上角y坐標(biāo)小于0,則向下移動(dòng)3個(gè)像素
      self.y = 3
    if position[3] >= self.canvas_height: # 如果小球的右下角y坐標(biāo)大于畫布寬度,則表示小球碰到了畫布底部,游戲結(jié)束
      self.hit_bottom = True
    if self.hit_paddle(position) == True: # 判斷 球 是否碰到了 球拍,如果碰到了則使小球回彈
      self.y = -3
    if position[0] <= 0: # 如果小球的左上角x坐標(biāo) 小于等于0,則向右移動(dòng)3個(gè)像素
      self.x = 3
    if position[2] >= self.canvas_width: # 如果小球的右下角x坐標(biāo) 大于等于畫布寬度,則向左移動(dòng)3個(gè)像素
      self.x = -3


  def hit_paddle(self,position):
    '''
    該函數(shù)用于判斷 球 是否碰到了 球拍,如果碰到了則使小球回彈,否則游戲結(jié)束
    :param position:小球的坐標(biāo)
    '''
    # 獲取球拍在畫布的坐標(biāo),返回一個(gè)數(shù)組(兩個(gè)坐標(biāo),左上角的坐標(biāo)和右下角的兩個(gè)坐標(biāo))
    paddle_position = self.canvas.coords(self.paddle.id)
    print ('paddle_position:',paddle_position[0],paddle_position[1],paddle_position[2],paddle_position[3])
    # 如果小球的右下角x坐標(biāo) 大于等于 球拍左上角x坐標(biāo),且小球左上角x坐標(biāo) 小于等于 球拍右下角x坐標(biāo)
    if position[2] >= paddle_position[0] and position[0] <= paddle_position[2]:
      # 如果小球右下角y坐標(biāo) 大于等于 球拍左上角y坐標(biāo),且小球右下角y坐標(biāo) 小于等于 球拍右下角坐標(biāo)
      if position[3] >= paddle_position[1] and position[3] <= paddle_position[3]:
        # 橫坐標(biāo) 等于
        self.x += self.paddle.x
        colors = ['red','green']
        # shuffle() 方法將序列的所有元素隨機(jī)排序,以便隨機(jī)獲得小球顏色
        random.shuffle(colors)
        self.color= colors[0]
        #
        self.canvas.itemconfig(self.id,fill=colors[0])
        # 計(jì)算得分并展示,且同時(shí)將小球的顏色、關(guān)卡顏色同步
        self.score.hit(ball_color = self.color)
        self.canvas.itemconfig(self.paddle.id,fill=self.color)
        # 增加或減少球拍的寬度
        self.adjust_paddle(paddle_position)
        return True

    return False


  def adjust_paddle(self,paddle_position):
    '''
    該函數(shù)用于增加或減少球拍的寬度
    :paddle_position:球拍的位置坐標(biāo)
    '''
    # 球拍每次的增量大小
    paddle_grow_length = 30
    # 球拍的寬度 = 球拍的右下角x坐標(biāo) - 球拍的左上角x坐標(biāo)
    paddle_width = paddle_position[2] - paddle_position[0]
    if self.color == 'red': # 如果當(dāng)前球的顏色為紅色
      if paddle_width > 30: # 如果球拍的寬度大于60
        if paddle_position[2] >= self.canvas_width: # 如果球拍右下角的x坐標(biāo) 大于等于 畫布寬度
          # 球拍右下角x坐標(biāo) = 球拍右下角x坐標(biāo) - 增量值
          paddle_position[2] = paddle_position[2] - paddle_grow_length
        else:
          # 球拍的左上角x坐標(biāo) = 球拍的左上角x坐標(biāo) + 增量值
          paddle_position[0] = paddle_position[0] + paddle_grow_length

    elif self.color == 'green': # 如果當(dāng)前球的顏色為綠色
      if paddle_width < 300: # 如果球拍的寬度小于300
        if paddle_position[2] >= self.canvas_width: # 如果球拍的右下角x坐標(biāo) 大于等于 畫布寬度
          # 球拍左上角x坐標(biāo) - 增量值
          paddle_position[0] = paddle_position[0] - paddle_grow_length
        else:
          # 球拍右下角x坐標(biāo) + 增量值
          paddle_position[2]=paddle_position[2]+paddle_grow_length


class Paddle:
  '''
  球拍類
  '''
  def __init__(self,canvas,color):
    '''
    :param canvas:畫布
    :param color:球拍的顏色
    '''
    self.canvas = canvas
    # winfo_width()函數(shù)來(lái)獲取畫布當(dāng)前的寬度,賦值給對(duì)象變量
    self.canvas_width = self.canvas.winfo_width()
    # winfo_height()函數(shù)來(lái)獲取畫布當(dāng)前的高度,賦值給對(duì)象變量
    self.canvas_height = self.canvas.winfo_height()
    # 保存tkinter畫球拍時(shí)返回的id,為后期移動(dòng)屏幕上的球拍做準(zhǔn)備,
    # create_rectangle 畫矩形,fill為球拍的顏色
    self.id = canvas.create_rectangle(0,0,180,15,fill=color)
    # 將球拍移動(dòng)至初始位置
    self.canvas.move(self.id,200,self.canvas_height*0.75)
    # 設(shè)置對(duì)象變量x,初始值為0.也就是球拍先不移動(dòng)
    self.x = 0
    # 游戲是否開(kāi)始,默認(rèn)為Flase,即 不開(kāi)始
    self.started = False
    # 是否繼續(xù)游戲,默認(rèn)值為 否
    self.continue_game = False
    # 初始化時(shí)將事件‘按下左鍵'和函數(shù)向左移動(dòng)綁定
    self.canvas.bind_all('<KeyPress-Left>',self.turn_left)
    # 初始化時(shí)將事件‘按下右鍵'和函數(shù)向右移動(dòng)綁定
    self.canvas.bind_all('<KeyPress-Right>',self.turn_right)
    # 初始化時(shí)將事件‘按下Enter鍵'和函數(shù)繼續(xù)游戲綁定
    self.canvas.bind_all('<KeyPress-Enter>',self.continue_game)
    # 按任意鍵開(kāi)始游戲
    self.canvas.bind_all('<Button-1>',self.start_game)
    # 初始化時(shí)將事件‘按下space鍵'和函數(shù)暫停游戲綁定
    self.canvas.bind_all('<space>',self.pause_game)

  def turn_left(self,event):
    '''
    該函數(shù)用于向左移動(dòng)時(shí),
    '''
    # 獲取球拍的位置坐標(biāo)
    position = self.canvas.coords(self.id)
    # 如果球拍的左上角x坐標(biāo) 小于 0
    if position[0] <= 0:
      # 則再次按向左移動(dòng)時(shí),移動(dòng)距離為0
      self.x = 0
    else:
      # 每次向左移動(dòng)3個(gè)像素
      self.x = -3

  def turn_right(self,event):

    # 獲取球拍的位置坐標(biāo)
    position = self.canvas.coords(self.id)
    # 如果球拍的右下角x坐標(biāo) 大于等于 畫布寬度
    if position[2] >= self.canvas_width:
      # 則再次按向右移動(dòng)時(shí),移動(dòng)距離為0
      self.x = 0
    else:
      # 每次向右移動(dòng)3個(gè)像素
      self.x = 3

  def start_game(self,evt):
    self.started = True

  def pause_game(self,evt):
    if self.started:
      self.started=False
    else:
      self.started=True

  def draw(self):
    '''
    該函數(shù)用于移動(dòng)球拍
    '''
    # 球拍類可以水平移動(dòng)
    self.canvas.move(self.id,self.x,0)
    # 獲取球拍的位置坐標(biāo)
    position = self.canvas.coords(self.id)
    # 如果球拍左上角x坐標(biāo)小于等于0,則停止移動(dòng)
    if position[0] <= 0:
      self.x = 0
    # 如果球拍右下角x坐標(biāo)大于等于0,則停止移動(dòng)
    elif position[2] >= self.canvas_width:
      self.x = 0


class Score():
  '''
  得分類
  '''
  def __init__(self,canvas,color):
    '''
    初始化得分類
    :param canvas:畫布
    :param color:得分文本的顏色
    '''
    # 初始化得分為0
    self.score = 0
    # 把參數(shù)canvas賦值給對(duì)象變量canvas
    self.canvas = canvas
    # winfo_width()函數(shù)來(lái)獲取畫布當(dāng)前的寬度,賦值給對(duì)象變量
    self.canvas_width = self.canvas.winfo_width()
    # winfo_height()函數(shù)來(lái)獲取畫布當(dāng)前的高度,賦值給對(duì)象變量
    self.canvas_height = self.canvas.winfo_height()
    # 創(chuàng)建文本控件,用戶保存用戶保存得分
    self.id = canvas.create_text(self.canvas_width-150,10,text='score:0',fill=color,font=(None, 18, "bold"))
    # 用戶保存游戲的關(guān)卡顏色
    self.note = canvas.create_text(self.canvas_width-70,10,text='--',fill='red',font=(None, 18, "bold"))

  def hit(self,ball_color='grey'):
    '''
    該函數(shù)用于將計(jì)算得分并展示,且同時(shí)將小球的顏色、關(guān)卡顏色同步
    :param ball_color:小球的顏色,默認(rèn)為'grey'
    '''
    # 得分遞增
    self.score += 1
    # 將得分展示在文本控件中
    self.canvas.itemconfig(self.id,text='score:{}'.format(self.score))
    # 將小球的顏色同步至游戲關(guān)卡的顏色
    if ball_color == 'red':
      self.canvas.itemconfig(self.note,text='{}-'.format('W'),fill='red')
    elif ball_color=='green':
      self.canvas.itemconfig(self.note,text='{}+'.format('W'),fill='green')
    else:
      self.canvas.itemconfig(self.note,text='--',fill='grey')

def main():
  # tkinter.Tk()類創(chuàng)建一個(gè)tk對(duì)象,它就是一個(gè)基本窗口,可以在其上增加其他東西
  tk = tkinter.Tk()
  # call back for Quit
  def callback():
    '''
    該函數(shù)用于,當(dāng)點(diǎn)擊窗口 關(guān)閉 按鈕時(shí),展示一個(gè)消息提示框,詢問(wèn)是否要關(guān)閉,
    點(diǎn)擊 是,則退出窗口
    '''
    if mb.askokcancel("Quit", "Do you really wish to quit?"):
      # Ball.flag = False
      tk.destroy()
  # 使用protocol將 WM_DELETE_WINDOW 與 callback 綁定,程序在退出時(shí)打印 'WM_DELETE_WINDOW'
  tk.protocol("WM_DELETE_WINDOW", callback)

  # 畫布的寬
  canvas_width = 600
  # 畫布的高
  canvas_hight = 500
  # 窗口標(biāo)題
  tk.title("Ball Game V1.2")
  # 窗口不可被拉伸,(0,0)的意思是“窗口的大小在水平方向上和垂直方向上都不能改變”
  tk.resizable(0,0)
  # 調(diào)用wm_attributes,將窗口始終放到所有其他窗口之前(-topmost),將1改為0畫布窗口不在其他窗口之前
  tk.wm_attributes("-topmost",1)
  # 創(chuàng)建畫布,bd=0,highlightthickness=0 作用是畫布之外沒(méi)有邊框,可以使游戲屏幕看上去更加美觀。最后一個(gè)bd是畫布的背景色。
  canvas = tkinter.Canvas(tk,width=canvas_width,height=canvas_hight,bd=0,highlightthickness=0,bg='#00ffff')
  # 按照上面一行指定的寬度高度參數(shù)調(diào)整其自身大小
  canvas.pack()
  # update強(qiáng)制更新屏幕,實(shí)時(shí)更新畫布
  tk.update()

  # 創(chuàng)建得分類,得分控件的顏色為紅色
  score = Score(canvas,'red')
  # 創(chuàng)建 球拍類,
  paddle = Paddle(canvas,"red")
  # 創(chuàng)建 小球類,小球的默認(rèn)顏色為灰色
  ball = Ball(canvas,paddle,score,"grey")

  # 游戲結(jié)束時(shí)的提示
  game_over_text = canvas.create_text(canvas_width/2,canvas_hight/2,text='Game over',state='hidden',fill='red',font=(None, 18, "bold"))
  # 游戲開(kāi)始時(shí)的提示
  introduce = 'Welcome to Ball GameV1.2:\nClick Any Key--Start\nStop--Enter\nContinue-Enter\n'
  game_start_text = canvas.create_text(canvas_width/2,canvas_hight/2,text=introduce,state='normal',fill='magenta',font=(None, 18, "bold"))

  # 主循環(huán),讓tkinter不停地重畫屏幕
  while True:
    # 如果小球沒(méi)有碰到了底部,且 游戲尚未開(kāi)始
    if (ball.hit_bottom == False) and ball.paddle.started:
      canvas.itemconfig(game_start_text,state='hidden')
      ball.draw()
      paddle.draw()
    # 如果小球碰到了底部,則游戲結(jié)束
    if ball.hit_bottom == True:
      time.sleep(0.1)
      canvas.itemconfig(game_over_text,state='normal')
    # 不停的刷新畫布
    tk.update_idletasks()
    # 強(qiáng)制更新屏幕
    tk.update()
    time.sleep(0.01)

if __name__=='__main__':
  main()

以上就是python 實(shí)現(xiàn)彈球小游戲的詳細(xì)內(nèi)容,更多關(guān)于python 彈球游戲的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 對(duì)python中的for循環(huán)和range內(nèi)置函數(shù)詳解

    對(duì)python中的for循環(huán)和range內(nèi)置函數(shù)詳解

    下面小編就為大家分享一篇對(duì)python中的for循環(huán)和range內(nèi)置函數(shù)詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • Python 京東云無(wú)線寶消息推送功能

    Python 京東云無(wú)線寶消息推送功能

    這篇文章主要介紹了Python 京東云無(wú)線寶消息推送功能,發(fā)送釘釘消息獲取可用積分,詳細(xì)配置文件通過(guò)實(shí)例代碼給大家講解的很詳細(xì),代碼+注釋講解的很詳細(xì),需要的朋友可以參考下
    2021-05-05
  • python 布爾注入原理及滲透過(guò)程示例

    python 布爾注入原理及滲透過(guò)程示例

    這篇文章主要介紹了python 布爾注入原理及滲透過(guò)程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • python3使用SMTP發(fā)送簡(jiǎn)單文本郵件

    python3使用SMTP發(fā)送簡(jiǎn)單文本郵件

    這篇文章主要為大家詳細(xì)介紹了python3使用SMTP發(fā)送簡(jiǎn)單文本郵件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • Python如何定義接口和抽象類

    Python如何定義接口和抽象類

    這篇文章主要介紹了Python如何定義接口和抽象類,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • Python使用python-docx讀寫word文檔

    Python使用python-docx讀寫word文檔

    這篇文章主要為大家詳細(xì)介紹了Python使用python-docx讀寫word文檔,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • Numpy 數(shù)組操作之元素添加、刪除和修改的實(shí)現(xiàn)

    Numpy 數(shù)組操作之元素添加、刪除和修改的實(shí)現(xiàn)

    本文主要介紹了Numpy 數(shù)組操作之元素添加、刪除和修改的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • PyQt5 QSerialPort子線程操作的實(shí)現(xiàn)

    PyQt5 QSerialPort子線程操作的實(shí)現(xiàn)

    這篇文章主要介紹了PyQt5 QSerialPort子線程操作的實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • Python Series從0開(kāi)始索引的方法

    Python Series從0開(kāi)始索引的方法

    今天小編就為大家分享一篇Python Series從0開(kāi)始索引的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-11-11
  • python中的RSA加密與解密實(shí)例解析

    python中的RSA加密與解密實(shí)例解析

    這篇文章主要介紹了python中的RSA加密與解密實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11

最新評(píng)論