1. 程式人生 > >【pygame遊戲編程】第四篇-----打字測速遊戲

【pygame遊戲編程】第四篇-----打字測速遊戲

ext boa star enter tex pat display 內置函數 none

下面我們一起用pygame編寫一個打字測速遊戲

這是一個很實用的有趣的小遊戲:

技術分享圖片

開始之前先來學習幾個小函數:

1、 ord(ch)

python內置函數,傳入一個字符,返回字符的ascii碼


2、chr(num)

python內置函數,傳入一個十進制或十六進制,返回ascii碼對應的字符

3、os.path.getsize(filename)

傳入文件路徑,返回文件大小,返回0為空文件

4、pygame.key.get_pressed()

返回一個記錄按鍵事件的字典,字典中的鍵為按鍵類型,字典中的值為bool中的True或者False、

例如:

keys = pygame.key.get_pressed()

if keys[K_RETURN]: print("按了回車鍵")

下面是我們的代碼

我們將全部代碼寫在多個.py文件中,最後通過主程序引入各個子程序,這樣做可以讓我們編寫程序邏輯更清晰,有助於修改調整程序。

遊戲主程序

技術分享圖片
import pygame
import sys
import time
from random import randint

from settings import Setting
from displayboard import Displayboard
import functions as fun

pygame.init()

my_settings 
= Setting() screen = pygame.display.set_mode((my_settings.screen_width, my_settings.screen_high)) pygame.display.set_caption("Test Your Typing") dis_board = Displayboard(my_settings, screen) #標誌變量 letter_ascii = randint(97, 122) letter = chr(letter_ascii - 32) game_active
= False scores = 0 speed = 0 timing = False remaining_time = my_settings.limited_time fastest_speed = int (fun.read_fastest_speed(my_settings.filename)) while True: ‘‘‘遊戲的主循環‘‘‘ for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() elif event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: pygame.quit() sys.exit() keys = pygame.key.get_pressed() if keys[pygame.K_RETURN] and not game_active: scores = 0 remaining_time = my_settings.limited_time game_active = True timing = True #開始計時 if timing: start_time = time.perf_counter() timing = False #填充界面 screen.fill(my_settings.BLUE) #顯示文本圖像 dis_board.display_speed_text(speed) dis_board.display_fastest_text(fastest_speed) #遊戲還未開始時執行的操作 if not game_active: pygame.mouse.set_visible(True) dis_board.display_top_text() dis_board.display_start_text() #遊戲進行時執行的操作 if game_active: pygame.mouse.set_visible(False) dis_board.display_letter_text(letter) dis_board.display_remaining_time_text(remaining_time) if event.type == pygame.KEYDOWN: dis_board.display_typing_text() if event.key == letter_ascii: scores += 1 letter_ascii = randint(97, 122) letter = chr(letter_ascii - 32) speed = scores * 3 current_time = time.perf_counter() remaining_time = int (my_settings.limited_time - (current_time - start_time)) if remaining_time < 0: game_active = False if speed >= fastest_speed: fastest_speed = speed fun.write_fastest_speed(speed, my_settings.filename) pygame.display.flip()
View Code

存放遊戲設置的程序

技術分享圖片
class Setting():
    ‘‘‘存放遊戲中的設置‘‘‘
    
    def __init__(self):
        
        #屏幕尺寸
        self.screen_width = 700
        self.screen_high = 550
        #字體大小
        self.s_font_size = 24
        self.m_font_size = 35
        self.l_font_size = 200
        #按鈕尺寸
        self.button_width = 100
        self.button_high = 35
        #測試時間
        self.limited_time = 20
        
        #顏色
        self.YELLOW    = (255, 255,   0)
        self.WHITE     = (255, 255, 255)
        self.BLACK     = (  0,   0,   0)
        self.RED       = (255,   0,   0)
        self.GREEN     = (  0, 255,   0)
        self.DARKGREEN = (  0, 155,   0)
        self.DARKGRAY  = ( 40,  40,  40)
        self.OLIVE     = (128, 128,   0)
        self.BLUE      = (  0,   0, 255)
        self.NAVYBLUE  = (  0,   0, 128)
        
        #位置
        self.top_text_position = (20, 20)
        self.speed_text_position = (20, 100)
        
        #文本內容
        self.top_text = "Try to keep up " + str(self.limited_time) + " seconds!"
        self.start_text = "Please Enter To Start!"
        
        #文件名
        self.filename = rflies\speed.txt
View Code

存放主程序函數的程序

技術分享圖片
import os

def read_fastest_speed(speed_file):
    file_size = os.path.getsize(speed_file)
    if file_size == 0:
        return 0
    else:
        with open(speed_file) as speed_file:
            lines = speed_file.readlines()
            return lines[0]
        
def write_fastest_speed(speed, speed_file):
    with open(speed_file) as file:
        file.write(str(speed))
View Code

顯示文本的程序

技術分享圖片
import pygame

class Displayboard():
    ‘‘‘展示程序中的文本‘‘‘
    
    def __init__(self, my_settings, screen):
        
        self.screen = screen
        self.my_settings = my_settings
        self.screen_rect = screen.get_rect()
        
        #獲取字體對象
        self.s_font = pygame.font.Font(rfonts\freesansbold.ttf, 
                                       my_settings.s_font_size)
        self.m_font = pygame.font.Font(rfonts\freesansbold.ttf, 
                                       my_settings.m_font_size)
        self.l_font = pygame.font.Font(rfonts\freesansbold.ttf, 
                                       my_settings.l_font_size)
        
        #獲取文本圖片
        self.top_text_image = self.s_font.render(my_settings.top_text, True, 
                                                 my_settings.YELLOW)
        
        self.typing_flag_image = self.s_font.render("typing!", True, 
                                                    my_settings.DARKGRAY)
        
        self.start_text_image = self.m_font.render(my_settings.start_text, True, 
                                         my_settings.GREEN, my_settings.OLIVE)
        
        #獲取surface的rect
        self.start_image_rect = self.start_text_image.get_rect()
        self.start_image_rect.center = self.screen_rect.center
        
        self.typing_image_rect = self.typing_flag_image.get_rect()
        self.typing_image_rect.right = self.screen_rect.right - 20
        self.typing_image_rect.top = 20

#顯示各個文本的函數
    def display_top_text(self):
        self.screen.blit(self.top_text_image, 
                         self.my_settings.top_text_position)

    def display_typing_text(self):
        self.screen.blit(self.typing_flag_image, self.typing_image_rect)
        
    def display_start_text(self):
        self.screen.blit(self.start_text_image, self.start_image_rect)
        
    def display_speed_text(self, speed):
        speed_text_image = self.s_font.render("Current Speed: " + str(speed) + " letters/min", 
                                  True, self.my_settings.YELLOW)
        speed_text_rect = speed_text_image.get_rect()
        speed_text_rect.centery = self.screen_rect.centery / 2
        speed_text_rect.right = self.screen_rect.right - 20
        self.screen.blit(speed_text_image, speed_text_rect)
        
    def display_letter_text(self, letter):
        letter_text_image = self.l_font.render(letter, True, 
                                               self.my_settings.RED)
        letter_rect = letter_text_image.get_rect()
        letter_rect.centerx = self.screen_rect.centerx
        letter_rect.centery = self.screen_rect.bottom * 2 / 3
        self.screen.blit(letter_text_image, letter_rect)
        
    def display_remaining_time_text(self, remaining_time):
        remaining_time_image = self.s_font.render("Remaining Time: " + str(remaining_time), 
                             True, self.my_settings.OLIVE)
        remaining_time_rect = remaining_time_image.get_rect()
        remaining_time_rect.top = self.screen_rect.top + 20
        remaining_time_rect.centerx = self.screen_rect.centerx
        self.screen.blit(remaining_time_image, remaining_time_rect)
        
    def display_fastest_text(self, fastest_speed):
        fastest_speed_image = self.s_font.render("Fastest Speed: " + str(fastest_speed),
                                                 True, self.my_settings.YELLOW)
        fastest_speed_rect = fastest_speed_image.get_rect()
        fastest_speed_rect.centery = self.screen_rect.centery / 2
        fastest_speed_rect.left = 20
        self.screen.blit(fastest_speed_image, fastest_speed_rect)
View Code

【pygame遊戲編程】第四篇-----打字測速遊戲