30個Python小遊戲,上班摸魚我能玩一天【內附原始碼】

專注的阿熊發表於2022-01-25

import os

import cfg

import sys

import pygame

import random

from modules import *

''' 遊戲初始化 '''

def initGame():

     # 初始化 pygame, 設定展示視窗

     pygame.init()

     screen = pygame.display.set_mode(cfg.SCREENSIZE)

     pygame.display.set_caption('catch coins —— 九歌 ')

     # 載入必要的遊戲素材

     game_images = {}

     for key, value in cfg.IMAGE_PATHS.items():

         if isinstance(value, list):

             images = []

             for item in value: images.append(pygame.image.load(item))

             game_images[key] = images

         else:

             game_images[key] = pygame.image.load(value)

     game_sounds = {}

     for key, value in cfg.AUDIO_PATHS.items():

         if key == 'bgm': continue

         game_sounds[key] = pygame.mixer.Sound(value)

     # 返回初始化資料

     return screen, game_images, game_sounds

''' 主函式 '''

def main():

     # 初始化

     screen, game_images, game_sounds = initGame()

     # 播放背景音樂

     pygame.mixer.music.load(cfg.AUDIO_PATHS['bgm'])

     pygame.mixer.music.play(-1, 0.0)

     # 字型載入

     font = pygame.font.Font(cfg.FONT_PATH, 40)

     # 定義 hero

     hero = Hero(game_images['hero'], position=(375, 520))

     # 定義食物組

     food_sprites_group = pygame.sprite.Group()

     generate_food_freq = random.randint(10, 20)

     generate_food_count = 0

     # 當前分數 / 歷史最高分

     score = 0

     highest_score = 0 if not os.path.exists(cfg.HIGHEST_SCORE_RECORD_FILEPATH) else int(open(cfg.HIGHEST_SCORE_RECORD_FILEPATH).read())

     # 遊戲主迴圈

     clock = pygame.time.Clock()

     while True:

         # -- 填充背景

         screen.fill(0)

         screen.blit(game_images['background'], (0, 0))

         # -- 倒數計時資訊

         countdown_text = 'Count down: ' + str((90000 - pygame.time.get_ticks()) // 60000) + ":" + str((90000 - pygame.time.get_ticks()) // 1000 % 60).zfill(2)

         countdown_text = font.render(countdown_text, True, (0, 0, 0))

         countdown_rect = 外匯跟單gendan5.comcountdown_text.get_rect()

         countdown_rect.topright = [cfg.SCREENSIZE[0]-30, 5]

         screen.blit(countdown_text, countdown_rect)

         # -- 按鍵檢測

         for event in pygame.event.get():

             if event.type == pygame.QUIT:

                 pygame.quit()

                 sys.exit()

         key_pressed = pygame.key.get_pressed()

         if key_pressed[pygame.K_a] or key_pressed[pygame.K_LEFT]:

             hero.move(cfg.SCREENSIZE, 'left')

         if key_pressed[pygame.K_d] or key_pressed[pygame.K_RIGHT]:

             hero.move(cfg.SCREENSIZE, 'right')

         # -- 隨機生成食物

         generate_food_count += 1

         if generate_food_count > generate_food_freq:

             generate_food_freq = random.randint(10, 20)

             generate_food_count = 0

             food = Food(game_images, random.choice(['gold',] * 10 + ['apple']), cfg.SCREENSIZE)

             food_sprites_group.add(food)

         # -- 更新食物

         for food in food_sprites_group:

             if food.update(): food_sprites_group.remove(food)

         # -- 碰撞檢測

         for food in food_sprites_group:

             if pygame.sprite.collide_mask(food, hero):

                 game_sounds['get'].play()

                 food_sprites_group.remove(food)

                 score += food.score

                 if score > highest_score: highest_score = score

         # -- hero

         hero.draw(screen)

         # -- 畫食物

         food_sprites_group.draw(screen)

         # -- 顯示得分

         score_text = f'Score: {score}, Highest: {highest_score}'

         score_text = font.render(score_text, True, (0, 0, 0))

         score_rect = score_text.get_rect()

         score_rect.topleft = [5, 5]

         screen.blit(score_text, score_rect)

         # -- 判斷遊戲是否結束

         if pygame.time.get_ticks() >= 90000:

             break

         # -- 更新螢幕

         pygame.display.flip()

         clock.tick(cfg.FPS)

     # 遊戲結束 , 記錄最高分並顯示遊戲結束畫面

     fp = open(cfg.HIGHEST_SCORE_RECORD_FILEPATH, 'w')

     fp.write(str(highest_score))

     fp.close()

     return showEndGameInterface(screen, cfg, score, highest_score)

'''run'''

if __name__ == '__main__':

     while main():

         pass


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69946337/viewspace-2853987/,如需轉載,請註明出處,否則將追究法律責任。

相關文章