用python編寫一個彈球遊戲

用python編寫一個簡單的彈球遊戲

這是學習python時用來練習的一個項目,作爲筆記。
最終是實現一個簡單的彈球遊戲,效果圖如下:
在這裏插入圖片描述

源代碼:

#無限命版的彈球遊戲python代碼
from tkinter import *  # 來源於python的標準庫,GUI
import random
import time


# 創建Ball類,對小球進行定義
class Ball:
    def __init__(self, canvas, paddle, color):  # 初始化函數
        self.canvas = canvas  # 把對象變量canvas賦值給對象變量canvas
        self.paddle = paddle #把對象變量賦值給paddle
        self.id = canvas.create_oval(10, 10, 25, 25, fill=color)  # 函數creat_oval返回的是創建目標的ID
        self.canvas.move(self.id, 245, 100)  # 移動小球到畫布中心
        starts = [-3, -2, -1, 1, 2, 3]  # 定義一個列表存初始速度
        random.shuffle(starts)  # 把列表裏面的數隨機排列
        self.x = starts[0]  # 取列表中的第一個數
        self.y = -3  # 把小球向上的速度變爲3,初始的合速度變大
        self.canvas_height = self.canvas.winfo_height()  # 獲取當前畫布高度並賦值給對象變量canvas_height
        self.canvas_width = self.canvas.winfo_width()
        self.hit_bottom = False

    def hit_paddle(self, pos): #定義彈球擊打操作,當兩個圖像有相交時返回true,否則false
        paddle_pos = self.canvas.coords(self.paddle.id)
        if pos[2] >= paddle_pos[0] and pos[0] <= paddle_pos[2]:
            if paddle_pos[1] <= pos[3] <= paddle_pos[3]:
                return True
        return False

#在畫布上按照定義的要求畫出小球
    def draw(self):
        self.canvas.move(self.id, self.x, self.y)  # 使小球移動,畫布上move函數的調用,傳入的參數是x,y
        pos = self.canvas.coords(self.id)  # 創建變量並將畫布函數coords賦值給pos,通過圓的ID返回一個列表,4個數分別是左上角和右下角的座標
        if pos[1] <= 0:#列表pos中0和1的位置是圓的左上方的座標,2和3的位置是右下方的座標
            self.y = 4  # 更改數字可以實現小球的不同方向的變速
        if pos[3] >= self.canvas_height:
#            self.hit_bottom = True #如果想實現小球到畫布底端就gameover可以加上這行,同時註釋掉下一行
            self.y = -4
        if self.hit_paddle(pos) == True:#實現球與球拍接觸時反彈
            self.y = -4
        if pos[0] <= 0:
            self.x = 4
        if pos[2] >= self.canvas_width:
            self.x = -4


# 創建球拍類
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:#這兩個if語句用來設置球拍邊界
            self.x = 0
        elif pos[2] >= self.canvas_width:
            self.x = 0

#定義左右鍵函數
    def turn_left(self, evt):
        self.x = -5#改變數值可以實現球拍靈活度的改變

    def turn_right(self, evt):
        self.x = 5


# 創建遊戲畫布
tk = Tk()  # 創建tk對象
tk.title("變速版彈球遊戲")  # 使用tk對象中的title函數給窗口加標題
tk.resizable(0, 0)  # 使窗口大小在水平和垂直方向上都不可以改變
tk.wm_attributes("-topmost", 1)  # 把包含我們畫布的窗口放到所有其他窗口之前
canvas = Canvas(tk, width=500, height=400, bd=0, highlightthickness=0)  # bd=0是確保在畫布之外沒有邊框
canvas.pack()  # 讓畫布按照前一行給出的寬度和高度參數來調整其自身大小
tk.update()  # 讓tkinter爲遊戲中的動畫做好初始化

paddle = Paddle(canvas, 'blue')
ball = Ball(canvas, paddle, 'red')  # 創建一個Ball類的對象

while 1:  # 動畫循環,讓tkinter一直畫圖
    if ball.hit_bottom == False:#如果球沒有被接到,gameover
        ball.draw()
        paddle.draw()
    tk.update_idletasks()
    tk.update()
    time.sleep(0.01)  # 循環一次,python自己休息的時間,可以理解爲一直畫圖的時候,間隔時間

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