用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自己休息的時間,可以理解爲一直畫圖的時候,間隔時間