首頁 > 軟體

python中的pygame實現接球小遊戲

2022-04-22 10:00:54

一、介紹模組

最小開發框架:

基於python 的Pygame最小開發框架

1、Pygame和sys模組

import pygame #製作遊戲時要使用的模組
import sys #python的標準庫,對內部各功能模組進行初始化建立,系統模組

2、random模組

需要在螢幕上隨機生成小球

from random import randint

詳情請看此文章:python中的亂數 Random介紹

二、相關功能

1、視窗尺寸改變

可以調節遊戲螢幕的大小

# 改變視窗尺寸
        elif event.type == pygame.VIDEORESIZE:
            size = w,h = event.w,event.h
            screen = pygame.display.set_mode(size,pygame.RESIZABLE)

pygame.VIDEORESIZE 這是視窗大小改變事件,事件發生後,返回event.size元組,包含新視窗的寬度和高度。 .size[0] 高度,也可以用event.w表示 .size[1] 寬度,也可以用event.h表示 返回引數僅在事件發生時有用

2、鍵盤控制擋板

# 鍵盤控制擋板
        elif event.type == pygame.KEYDOWN: #鍵盤按下事件檢測
            if event.key == pygame.K_LEFT:  # 判斷擋板是否左移
                if board_rect.left > 0 and board_rect.left <= w - 186:
                    board_rect.left -= board_x
                elif board_rect.left <= 0:  # 判斷擋板左邊的座標是否小於0
                    board_rect.left = 0
                    board_rect.top -= board_y
            elif event.key == pygame.K_RIGHT:  # 判斷擋板是否右移
                if board_rect.right >= 186 and board_rect.right < w:
                    board_rect.right += board_x
                elif board_rect.right >= w:  # 判斷擋板右邊的座標是否大於螢幕的寬度                        board_rect.right = w
                    board_rect.bottom += board_y

3、滑鼠控制

#滑鼠控制擋板
        elif event.type == pygame.MOUSEMOTION:
            # 滑鼠左鍵按下並跟隨滑鼠移動
            if event.buttons[0] == 1:
                if event.pos[0] >= 0 and event.pos[0] < w - 186:#判斷滑鼠的位置
                    board_rect.left = event.pos[0] #將滑鼠的x座標給Rect物件的左邊
                elif event.pos[0] >= w - 186 and event.pos[0] <= w:
                    board_rect.left = w - 186
                # board_rect.top = h - 17 #檔板位置在底部
        elif event.type == pygame.MOUSEBUTTONDOWN:  #滑鼠按鍵按下
            # 將滑鼠當前位置給擋板
            if event.button == 1:
                if event.pos[0] >= 0 and event.pos[0] < w - 186:#判斷滑鼠的位置
                    board_rect.left = event.pos[0] #將滑鼠的x座標給Rect物件的左邊
                if event.pos[0] >= w - 186 and event.pos[0] <= w:
                    board_rect.left = w - 186
                # board_rect.top = h - 17

4、擋板接住小球並得分

# 下方擋板接到小球
    if ball_y >= h - 37 and (ball_x >= board_rect.left - 20 and ball_x <= board_rect.left + 206):
        move_y = - move_y  # y方向速度反向
        score += points  #得分
        count += 1   #次數增加1次
        if count == 5:  # 每滿五次,難度和單次接球得分增加
            count = 0  # 接球得分的次數清零
            points += points
            # x方向速度增加
            if move_x > 0:
                move_x += 1
            else:
                move_x -= 1
            move_y -= 1

5、小球未接住小球

# 下方擋板未接到小球
    if ball_y > h - 27 and (ball_x < board_rect.left - 20 or ball_x > board_rect.left + 206):
        # 遊戲結束
        ball_y = 200  #小球所在的位置
        break

6、小球移動

# 移動小球
    ball_x += move_x
    ball_y += move_y
    if ball_x <= 20 or ball_x >= w - 20:  # 碰到左右兩側牆壁
        move_x = - move_x  # x方向速度反向
    if ball_y <= 20:  # 碰到上方牆壁
        move_y = - move_y  # y方向速度反向

7、顯示分數

my_score = font.render(str(score), False, (255, 255, 0))  # 建立文字物件(文字,是否平滑,文字顏色)
    screen.blit(my_score, (w - 100, 30))  # 將文字新增到視窗上

三、完整程式碼

import sys
from random import randint
import pygame

pygame.init() # 初始化

size = w, h = (600,500) # 螢幕顯示的區域,高度和寬度
screen = pygame.display.set_mode(size,pygame.RESIZABLE)
pygame.display.set_caption("接球遊戲") # 螢幕的標題
fpsClock = pygame.time.Clock() # 幀速率 視窗重新整理速度 越大執行越快

board = pygame.image.load(r"D:pycharmWorkTime(大二上)擋板.jpg")
board_rect = board.get_rect() #對圖片進行加框 利用surface生成rect

color = pygame.Color(255,255,255) # 螢幕(視窗)的顏色:白色
Green = pygame.Color('green') # 小球的顏色:綠色

# 隨機生成小球的x、y座標(整數,包括兩端)
ball_x = randint(20,580)
ball_y = randint(20,200)

# 小球x、y座標變化量
move_x = 1
move_y = 1

# 擋板x、y座標變化量
board_x = 46
board_y = 0

score=0	#得分
font=pygame.font.Font(r'D:字型檔書法和新增字型檔微軟雅黑.ttf',60) #設定字型(前者是字型路徑)和字型大小
points=1 #一次接球的加分
count=0	#接球得分的次數

# size1 = board.get_size() #獲取圖片大小
# print(size1)
while True:
    board_rect.top = h - 17
    for event in pygame.event.get(): # pygame.event.get() 從事件佇列中取出事件,並從佇列中刪除該事件
        if event.type == pygame.QUIT:
            sys.exit()

        # 改變視窗尺寸
        elif event.type == pygame.VIDEORESIZE:
            size = w,h = event.w,event.h
            screen = pygame.display.set_mode(size,pygame.RESIZABLE)


        # 鍵盤控制擋板
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:  # 擋板左移
                if board_rect.left > 0 and board_rect.left <= w - 186:
                    board_rect.left -= board_x
                elif board_rect.left <= 0:  # 判斷擋板左邊的座標是否小於0
                    board_rect.left = 0
                    board_rect.top -= board_y
            elif event.key == pygame.K_RIGHT:  # 擋板右移
                if board_rect.right >= 186 and board_rect.right < w:
                    board_rect.right += board_x
                elif board_rect.right >= w:  # 判斷擋板右邊的座標是否大於螢幕的寬度                        board_rect.right = w
                    board_rect.bottom += board_y

        #滑鼠控制擋板
        elif event.type == pygame.MOUSEMOTION:
            # 滑鼠左鍵按下並跟隨滑鼠移動
            if event.buttons[0] == 1:
                if event.pos[0] >= 0 and event.pos[0] < w - 186:#判斷滑鼠的位置
                    board_rect.left = event.pos[0] #將滑鼠的x座標給Rect物件的左邊
                elif event.pos[0] >= w - 186 and event.pos[0] <= w:
                    board_rect.left = w - 186
                # board_rect.top = h - 17 #檔板位置在底部
        elif event.type == pygame.MOUSEBUTTONDOWN:  #滑鼠按鍵按下
            # 將滑鼠當前位置給擋板
            if event.button == 1:
                if event.pos[0] >= 0 and event.pos[0] < w - 186:#判斷滑鼠的位置
                    board_rect.left = event.pos[0] #將滑鼠的x座標給Rect物件的左邊
                if event.pos[0] >= w - 186 and event.pos[0] <= w:
                    board_rect.left = w - 186
                # board_rect.top = h - 17

    # 下方擋板接到小球
    if ball_y >= h - 37 and (ball_x >= board_rect.left - 20 and ball_x <= board_rect.left + 206):
        move_y = - move_y  # y方向速度反向
        score += points
        count += 1
        if count == 5:  # 每滿五次,難度和單次接球得分增加
            count = 0  # 接球得分的次數清零
            points += points
            # x方向速度增加
            if move_x > 0:
                move_x += 1
            else:
                move_x -= 1
            move_y -= 1

    # 下方擋板未接到小球
    if ball_y > h - 27 and (ball_x < board_rect.left - 20 or ball_x > board_rect.left + 206):
        # 遊戲結束
        ball_y = 200
        break

    # 移動小球
    ball_x += move_x
    ball_y += move_y
    if ball_x <= 20 or ball_x >= w - 20:  # 碰到左右兩側牆壁
        move_x = - move_x  # x方向速度反向
    if ball_y <= 20:  # 碰到上方牆壁
        move_y = - move_y  # y方向速度反向

    fpsClock.tick(200)
    screen.fill(color)
    # 顯示分數
    my_score = font.render(str(score), False, (255, 255, 0))  # 建立文字物件(文字,是否平滑,文字顏色)
    screen.blit(my_score, (w - 100, 30))  # 將文字新增到視窗上
    screen.blit(board,board_rect)  #將一個影象繪製在另一個影象上 把surface物件覆蓋到移動後的rect物件
    pygame.draw.circle(screen, Green, (ball_x, ball_y), 20)  # 繪製小球
    pygame.display.update() # 對顯示視窗進行更新,預設視窗全部重繪

到此這篇關於python中的pygame實現接球小遊戲的文章就介紹到這了,更多相關pygame接球遊戲內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com