python小遊戲-pygame模組
阿新 • • 發佈:2020-05-12
一、tkinter模組的GUI
基本上使用tkinter來開發GUI應用需要以下5個步驟:
- 匯入tkinter模組中我們需要的東西。
- 建立一個頂層視窗物件並用它來承載整個GUI應用。
- 在頂層視窗物件上新增GUI元件。
- 通過程式碼將這些GUI元件的功能組織起來。
- 進入主事件迴圈(main loop)。
程式碼:
1 import tkinter 2 import tkinter.messagebox 3 4 def main(): 5 flag = True 6 #修改標籤上的文字 7 def change_label_text(): 8 nonlocal flag 9 flag = not flag 10 color,msg = ('red','hello,world')\ 11 if flag else ('blue','Goodbye,world!') 12 label.config(text=msg, fg=color) 13 #確認退出 14 def confirm_to_quit(): 15 if tkinter.messagebox.askokcancel('溫馨提示','確認要退出嗎?'): 16 top.quit() 17 18 #建立頂層視窗 19 top = tkinter.Tk() 20 #設定視窗大小 21 top.geometry('240x160') 22 #設定視窗標題 23 top.title('小遊戲') 24 #建立標籤物件並新增到頂層視窗 25 label = tkinter.Label(top,text='hello,world!',font = 'Arial -32',fg = 'red') 26 label.pack(expand = 1) 27 #建立一個裝按鈕的容器 28 panel = tkinter.Frame(top) 29 #建立按鈕物件 指定新增到哪個容器中 通過command引數繫結事件回撥函式 30 button1 = tkinter.Button(panel,text = '修改',command = change_label_text) 31 button1.pack(side = 'left') 32 button2 = tkinter.Button(panel,text = '退出',command = change_label_text) 33 button2.pack(side = 'right') 34 panel.pack(side = 'bottom') 35 #開啟主事件迴圈 36 tkinter.mainloop() 37 #主函式 38 if __name__ == '__main__': 39 main()
二、pygame的遊戲視窗
製作遊戲視窗
1 import pygame 2 def main(): 3 # 初始化匯入pygame中的模組 4 pygame.init() 5 #初始化用於顯示的視窗並設定視窗尺寸 6 screen = pygame.display.set_mode((800,600)) 7 # 設定當前視窗的標題 8 pygame.display.set_caption('大球吃小球') 9 running = True 10 # 開啟一個事件 迴圈處理髮生的事件 11 while running: 12 for event in pygame.event.get(): 13 if event.type == pygame.QUIT: 14 running = False 15 if __name__ == '__main__': 16 main()
執行效果:
三、往遊戲窗口裡畫一個圓
通過pygame中draw模組的函式在視窗上繪圖,可以繪製的圖形包括:線條、矩形、多邊形、圓、橢圓、圓弧等。需要說明的是,螢幕座標系是將螢幕左上角設定為座標原點(0, 0)
,向右是x軸的正向,向下是y軸的正向,在表示位置或者設定尺寸的時候,我們預設的單位都是畫素。所謂畫素就是螢幕上的一個點,你可以用瀏覽圖片的軟體試著將一張圖片放大若干倍,就可以看到這些點。pygame中表示顏色用的是色光三原色表示法,即通過一個元組或列表來指定顏色的RGB值,每個值都在0~255之間,因為是每種原色都用一個8位(bit)的值來表示,三種顏色相當於一共由24位構成,這也就是常說的“24位顏色表示法”。
1 import pygame 2 def main(): 3 # 初始化匯入pygame中的模組 4 pygame.init() 5 #初始化用於顯示的視窗並設定視窗尺寸 6 screen = pygame.display.set_mode((800,600)) 7 # 設定當前視窗的標題 8 pygame.display.set_caption('大球吃小球') 9 10 # 設定視窗的背景色 11 screen.fill((242,242,242)) 12 # 繪製一個圓,引數分別為:(螢幕,顏色,圓心位置,半徑,0表示填充圓) 13 pygame.draw.circle(screen,(255,0,0),(100,100),30,0) 14 # 重新整理當前視窗 15 pygame.display.flip() 16 running = True 17 # 開啟一個事件 迴圈處理髮生的事件 18 while running: 19 for event in pygame.event.get(): 20 if event.type == pygame.QUIT: 21 running = False 22 if __name__ == '__main__': 23 main()
畫了一個圓:
四、載入影象
使用pygame中image模組的函式來載入影象,再通過之前獲得的視窗物件的blit
方法渲染影象。
ball_image = pygame.image.load("ball.png")
# 重新整理當前視窗 pygame.display.flip()
效果圖
五、實現動畫效果
要讓上面程式碼中的小球動起來,可以將小球的位置用變數來表示,並在迴圈中修改小球的位置再重新整理整個視窗即可。
import pygame def main(): # 初始化匯入pygame中的模組 pygame.init() #初始化用於顯示的視窗並設定視窗尺寸 screen = pygame.display.set_mode((800,600)) # 設定當前視窗的標題 pygame.display.set_caption('大球吃小球') # 定義變數來表示小球在螢幕上的位置 x,y = 50,50 running = True # 開啟一個事件 迴圈處理髮生的事件 while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False # 設定視窗的背景色 screen.fill((255, 255, 255)) # 繪製一個圓,引數分別為:(螢幕,顏色,圓心位置,半徑,0表示填充圓) pygame.draw.circle(screen,(255,0,0),(x,y),30,0) # 重新整理當前視窗 pygame.display.flip() # 每隔50毫秒改變小球的位置 pygame.time.delay(50) x,y = x+5,y+5 running = True if __name__ == '__main__': main()
效果圖
http://ww1.sinaimg.cn/large/0069IOlEly1gepsrb3ndwg30rs0kumxp.gif
六、加入碰撞檢測,做成一個大球吃小球小遊戲
程式碼
from enum import Enum,unique from math import sqrt from random import randint import pygame # unique class Color(Enum): """顏色配置""" RED = (255,0,0) GREEN = (0,255,0) BLUE = (0,0,255) BLACK = (0,0,0) WHITE = (255,255,255) GRAY = (242,242,242) #隨機獲取顏色 def random_color(): r = randint(0,255) g = randint(0,255) b = randint(0,255) return (r,g,b) class Ball(object): """球類""" def __init__(self,x,y,radius,sx,sy,color = Color.RED): #初始化方法 self.x = x self.y = y self.radius = radius self.sx = sx self.sy = sy self.color = color self.alive = True def move(self,screen): """移動""" self.x += self.sx self.y += self.sy if self.x - self.radius <= 0 or self.x + self.radius >= screen.get_width(): self.sx = -self.sx if self.y - self.radius <= 0 or self.y + self.radius >= screen.get_width(): self.sy = -self.sy def eat(self,other): """吃其他球""" if self.alive and other.alive and self != other: dx,dy = self.x - other.x,self.y-other.y distance = sqrt(dx**2 + dy ** 2) if distance <self.radius+other.radius and self.radius > other.radius: other.alive = False self.radius = self.radius + int(other.radius*0.146) def draw(self,screen): """在視窗上繪製球""" pygame.draw.circle(screen,self.color,(self.x,self.y),self.radius,0) def main(): balls = [] # 裝球的容器 # 初始化匯入pygame中的模組 pygame.init() #初始化用於顯示的視窗並設定視窗尺寸 screen = pygame.display.set_mode((800,600)) # 設定當前視窗的標題 pygame.display.set_caption('大球吃小球') running = True # 開啟一個事件 迴圈處理髮生的事件 while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False #處理滑鼠事件的程式碼 if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1: x,y = event.pos# 獲取滑鼠點選的事件 radius = randint(10,100) sx,sy = randint(-10,10),randint(-10,10) color = Color.random_color() # 在滑鼠點下的位置建立一個球(大小/速度和顏色隨機) ball = Ball(x,y,radius,sx,sy,color) # 將球新增到列表容器中 balls.append(ball) # 設定視窗的背景色 screen.fill((255, 255, 255)) # 取出容器中被吃掉的球,如果沒吃掉就繪製,吃掉了就移除 for ball in balls: if ball.alive: ball.draw(screen) else: balls.remove(ball) # 重新整理當前視窗 pygame.display.flip() # 每隔50毫秒改變小球的位置 pygame.time.delay(50) for ball in balls: ball.move(screen) #檢查有沒有吃到其它的球 for other in balls: ball.eat(other) if __name__ == '__main__': main()
最終效果圖:
點選檢視
&n