1. 程式人生 > >python小遊戲-pygame模組

python小遊戲-pygame模組

一、tkinter模組的GUI

  基本上使用tkinter來開發GUI應用需要以下5個步驟:

  1. 匯入tkinter模組中我們需要的東西。
  2. 建立一個頂層視窗物件並用它來承載整個GUI應用。
  3. 在頂層視窗物件上新增GUI元件。
  4. 通過程式碼將這些GUI元件的功能組織起來。
  5. 進入主事件迴圈(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()
View Code

二、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