百木园-与人分享,
就是让自己快乐。

周末用Python写了5个小游戏(附源码)

周末不能出去玩多无聊啊,那就来几个小游戏给大家助助兴,,可以自己复现玩玩,研究下里面的编程逻辑,对学习编程(特别是初学者)应该会有很大帮助。学会了别忘记教你的小伙伴,好的东西大家要学会分享。

在这里插入图片描述

由于文章较长,大家可以先点赞收藏后再慢慢看哦~

在这里插入图片描述

1、吃金币

源码分享:
#####Python学习Q群:906715085###
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)

 

 

 # 加载必要的游戏素材
    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 = countdown_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

 

在这里插入图片描述

2、打乒乓

源码分享:
####Python学习Q群:906715085####
import sys
import cfg
import pygame
from modules import *
\'\'\'定义按钮\'\'\'
def Button(screen, position, text, button_size=(200, 50)):
   left, top = position
   bwidth, bheight = button_size
   pygame.draw.line(screen, (150, 150, 150), (left, top), (left+bwidth, top), 5)
   pygame.draw.line(screen, (150, 150, 150), (left, top-2), (left, top+bheight), 5)
   pygame.draw.line(screen, (50, 50, 50), (left, top+bheight), (left+bwidth, top+bheight), 5)
   pygame.draw.line(screen, (50, 50, 50), (left+bwidth, top+bheight), (left+bwidth, top), 5)
   pygame.draw.rect(screen, (100, 100, 100), (left, top, bwidth, bheight))
   font = pygame.font.Font(cfg.FONTPATH, 30)
   text_render = font.render(text, 1, (255, 235, 205))
   return screen.blit(text_render, (left+50, top+10))

 

\'\'\'
Function:
   开始界面
Input:
   --screen: 游戏界面
Return:
   --game_mode: 1(单人模式)/2(双人模式)
\'\'\'
def startInterface(screen):
   clock = pygame.time.Clock()
   while True:
       screen.fill((41, 36, 33))
       button_1 = Button(screen, (150, 175), \'1 Player\')
       button_2 = Button(screen, (150, 275), \'2 Player\')
       for event in pygame.event.get():
           if event.type == pygame.QUIT:
               pygame.quit()
               sys.exit()
           if event.type == pygame.MOUSEBUTTONDOWN:
               if button_1.collidepoint(pygame.mouse.get_pos()):
                   return 1
               elif button_2.collidepoint(pygame.mouse.get_pos()):
                   return 2
       clock.tick(10)
       pygame.display.update()
\'\'\'结束界面\'\'\'
def endInterface(screen, score_left, score_right):
   clock = pygame.time.Clock()
   font1 = pygame.font.Font(cfg.FONTPATH, 30)
   font2 = pygame.font.Font(cfg.FONTPATH, 20)
   msg = \'Player on left won!\' if score_left > score_right else \'Player on right won!\'
   texts = [font1.render(msg, True, cfg.WHITE),
           font2.render(\'Press ESCAPE to quit.\', True, cfg.WHITE),
           font2.render(\'Press ENTER to continue or play again.\', True, cfg.WHITE)]
   positions = [[120, 200], [155, 270], [80, 300]]
   while True:
       screen.fill((41, 36, 33))
       for event in pygame.event.get():
           if event.type == pygame.QUIT:
               pygame.quit()
               sys.exit()
           if event.type == pygame.KEYDOWN:
               if event.key == pygame.K_RETURN:
                   return
               elif event.key == pygame.K_ESCAPE:
                   sys.exit()
                   pygame.quit()
       for text, pos in zip(texts, positions):
           screen.blit(text, pos)
       clock.tick(10)
       pygame.display.update()
\'\'\'运行游戏Demo\'\'\'
def runDemo(screen):
   #加载游戏素材
   hit_sound = pygame.mixer.Sound(cfg.HITSOUNDPATH)
   goal_sound = pygame.mixer.Sound(cfg.GOALSOUNDPATH)
   pygame.mixer.music.load(cfg.BGMPATH)
   pygame.mixer.music.play(-1, 0.0)
   font = pygame.font.Font(cfg.FONTPATH, 50)
   #开始界面
   game_mode = startInterface(screen)
   #游戏主循环
   #--左边球拍(ws控制, 仅双人模式时可控制)
   score_left = 0
   racket_left = Racket(cfg.RACKETPICPATH, \'LEFT\', cfg)
   #--右边球拍(↑↓控制)
   score_right = 0
   racket_right = Racket(cfg.RACKETPICPATH, \'RIGHT\', cfg)
   #--球
   ball = Ball(cfg.BALLPICPATH, cfg)
   clock = pygame.time.Clock()
   while True:
       for event in pygame.event.get():
           if event.type == pygame.QUIT:
               pygame.quit()
               sys.exit(-1)
       screen.fill((41, 36, 33))
       # 玩家操作
       pressed_keys = pygame.key.get_pressed()
       if pressed_keys[pygame.K_UP]:
           racket_right.move(\'UP\')
       elif pressed_keys[pygame.K_DOWN]:
           racket_right.move(\'DOWN\')
       if game_mode == 2:
           if pressed_keys[pygame.K_w]:
               racket_left.move(\'UP\')
           elif pressed_keys[pygame.K_s]:
               racket_left.move(\'DOWN\')
       else:
           racket_left.automove(ball)
       # 球运动
       scores = ball.move(ball, racket_left, racket_right, hit_sound, goal_sound)
       score_left += scores[0]
       score_right += scores[1]
       # 显示
       # --分隔线
       pygame.draw.rect(screen, cfg.WHITE, (247, 0, 6, 500))
       # --球
       ball.draw(screen)
       # --拍
       racket_left.draw(screen)
       racket_right.draw(screen)
       # --得分
       screen.blit(font.render(str(score_left), False, cfg.WHITE), (150, 10))
       screen.blit(font.render(str(score_right), False, cfg.WHITE), (300, 10))
       if score_left == 11 or score_right == 11:
           return score_left, score_right
       clock.tick(100)
       pygame.display.update()
\'\'\'主函数\'\'\'
def main():
   #初始化
   pygame.init()
   pygame.mixer.init()
   screen = pygame.display.set_mode((cfg.WIDTH, cfg.HEIGHT))
   pygame.display.set_caption(\'pingpong —— 九歌\')
   #开始游戏
   while True:
       score_left, score_right = runDemo(screen)
       endInterface(screen, score_left, score_right)

 

\'\'\'run\'\'\'
if __name__ == \'__main__\':
   main()

 

在这里插入图片描述

3、滑雪

源码分享:
###Python学习群:906715085### 
import sys
import cfg
import pygame
import random
\'\'\'滑雪者类\'\'\'
class SkierClass(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        # 滑雪者的朝向(-2到2)
        self.direction = 0
        self.imagepaths = cfg.SKIER_IMAGE_PATHS[:-1]
        self.image = pygame.image.load(self.imagepaths[self.direction])
        self.rect = self.image.get_rect()
        self.rect.center = [320, 100]
        self.speed = [self.direction, 6-abs(self.direction)*2]
    \'\'\'改变滑雪者的朝向. 负数为向左,正数为向右,0为向前\'\'\'
    def turn(self, num):
        self.direction += num
        self.direction = max(-2, self.direction)
        self.direction = min(2, self.direction)
        center = self.rect.center
        self.image = pygame.image.load(self.imagepaths[self.direction])
        self.rect = self.image.get_rect()
        self.rect.center = center
        self.speed = [self.direction, 6-abs(self.direction)*2]
        return self.speed
    \'\'\'移动滑雪者\'\'\'
    def move(self):
        self.rect.centerx += self.speed[0]
        self.rect.centerx = max(20, self.rect.centerx)
        self.rect.centerx = min(620, self.rect.centerx)
    \'\'\'设置为摔倒状态\'\'\'
    def setFall(self):
        self.image = pygame.image.load(cfg.SKIER_IMAGE_PATHS[-1])
    \'\'\'设置为站立状态\'\'\'
    def setForward(self):
        self.direction = 0
        self.image = pygame.image.load(self.imagepaths[self.direction])

 

 

\'\'\'
Function:
    障碍物类
Input:
    img_path: 障碍物图片路径
    location: 障碍物位置
    attribute: 障碍物类别属性
\'\'\'
class ObstacleClass(pygame.sprite.Sprite):
    def __init__(self, img_path, location, attribute):
        pygame.sprite.Sprite.__init__(self)
        self.img_path = img_path
        self.image = pygame.image.load(self.img_path)
        self.location = location
        self.rect = self.image.get_rect()
        self.rect.center = self.location
        self.attribute = attribute
        self.passed = False
    \'\'\'移动\'\'\'
    def move(self, num):
        self.rect.centery = self.location[1] - num
\'\'\'创建障碍物\'\'\'
def createObstacles(s, e, num=10):
    obstacles = pygame.sprite.Group()
    locations = []
    for i in range(num):
        row = random.randint(s, e)
        col = random.randint(0, 9)
        location  = [col*64+20, row*64+20]
        if location not in locations:
            locations.append(location)
            attribute = random.choice(list(cfg.OBSTACLE_PATHS.keys()))
            img_path = cfg.OBSTACLE_PATHS[attribute]
            obstacle = ObstacleClass(img_path, location, attribute)
            obstacles.add(obstacle)
    return obstacles
\'\'\'合并障碍物\'\'\'
def AddObstacles(obstacles0, obstacles1):
    obstacles = pygame.sprite.Group()
    for obstacle in obstacles0:
        obstacles.add(obstacle)
    for obstacle in obstacles1:
        obstacles.add(obstacle)
    return obstacles

 

\'\'\'显示游戏开始界面\'\'\'
def ShowStartInterface(screen, screensize):
    screen.fill((255, 255, 255))
    tfont = pygame.font.Font(cfg.FONTPATH, screensize[0]//5)
    cfont = pygame.font.Font(cfg.FONTPATH, screensize[0]//20)
    title = tfont.render(u\'滑雪游戏\', True, (255, 0, 0))
    content = cfont.render(u\'按任意键开始游戏\', True, (0, 0, 255))
    trect = title.get_rect()
    trect.midtop = (screensize[0]/2, screensize[1]/5)
    crect = content.get_rect()
    crect.midtop = (screensize[0]/2, screensize[1]/2)
    screen.blit(title, trect)
    screen.blit(content, crect)
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                return
        pygame.display.update()
\'\'\'显示分数\'\'\'
def showScore(screen, score, pos=(10, 10)):
    font = pygame.font.Font(cfg.FONTPATH, 30)
    score_text = font.render(\"Score: %s\" % score, True, (0, 0, 0))
    screen.blit(score_text, pos)

 

 

\'\'\'更新当前帧的游戏画面\'\'\'
def updateFrame(screen, obstacles, skier, score):
    screen.fill((255, 255, 255))
    obstacles.draw(screen)
    screen.blit(skier.image, skier.rect)
    showScore(screen, score)
    pygame.display.update()
\'\'\'主程序\'\'\'
def main():
    # 游戏初始化
    pygame.init()
    pygame.mixer.init()
    pygame.mixer.music.load(cfg.BGMPATH)
    pygame.mixer.music.set_volume(0.4)
    pygame.mixer.music.play(-1)
    # 设置屏幕
    screen = pygame.display.set_mode(cfg.SCREENSIZE)
    pygame.display.set_caption(\'滑雪游戏 —— 九歌\')
    # 游戏开始界面
    ShowStartInterface(screen, cfg.SCREENSIZE)
    # 实例化游戏精灵
    # --滑雪者
    skier = SkierClass()
    # --创建障碍物
    obstacles0 = createObstacles(20, 29)
    obstacles1 = createObstacles(10, 19)
    obstaclesflag = 0
    obstacles = AddObstacles(obstacles0, obstacles1)
    # 游戏clock
    clock = pygame.time.Clock()
    # 记录滑雪的距离
    distance = 0
    # 记录当前的分数
    score = 0
    # 记录当前的速度
    speed = [0, 6]
    # 游戏主循环
    while True:
        # --事件捕获
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT or event.key == pygame.K_a:
                    speed = skier.turn(-1)
                elif event.key == pygame.K_RIGHT or event.key == pygame.K_d:
                    speed = skier.turn(1)
        # --更新当前游戏帧的数据
        skier.move()
        distance += speed[1]
        if distance >= 640 and obstaclesflag == 0:
            obstaclesflag = 1
            obstacles0 = createObstacles(20, 29)
            obstacles = AddObstacles(obstacles0, obstacles1)
        if distance >= 1280 and obstaclesflag == 1:
            obstaclesflag = 0
            distance -= 1280
            for obstacle in obstacles0:
                obstacle.location[1] = obstacle.location[1] - 1280
            obstacles1 = createObstacles(10, 19)
            obstacles = AddObstacles(obstacles0, obstacles1)
        for obstacle in obstacles:
            obstacle.move(distance)
        # --碰撞检测
        hitted_obstacles = pygame.sprite.spritecollide(skier, obstacles, False)
        if hitted_obstacles:
            if hitted_obstacles[0].attribute == \"tree\" and not hitted_obstacles[0].passed:
                score -= 50
                skier.setFall()
                updateFrame(screen, obstacles, skier, score)
                pygame.time.delay(1000)
                skier.setForward()
                speed = [0, 6]
                hitted_obstacles[0].passed = True
            elif hitted_obstacles[0].attribute == \"flag\" and not hitted_obstacles[0].passed:
                score += 10
                obstacles.remove(hitted_obstacles[0])
        # --更新屏幕
        updateFrame(screen, obstacles, skier, score)
        clock.tick(cfg.FPS)

 

 
\'\'\'run\'\'\'
if __name__ == \'__main__\':
    main();

 

在这里插入图片描述

4、并夕夕版飞机大战

源码分享:
###Python学习群:906715085####
import sys
import cfg
import pygame
from modules import *

 

\'\'\'游戏界面\'\'\'
def GamingInterface(num_player, screen):
    # 初始化
    pygame.mixer.music.load(cfg.SOUNDPATHS[\'Cool Space Music\'])
    pygame.mixer.music.set_volume(0.4)
    pygame.mixer.music.play(-1)
    explosion_sound = pygame.mixer.Sound(cfg.SOUNDPATHS[\'boom\'])
    fire_sound = pygame.mixer.Sound(cfg.SOUNDPATHS[\'shot\'])
    font = pygame.font.Font(cfg.FONTPATH, 20)
    # 游戏背景图
    bg_imgs = [cfg.IMAGEPATHS[\'bg_big\'], cfg.IMAGEPATHS[\'seamless_space\'], cfg.IMAGEPATHS[\'space3\']]
    bg_move_dis = 0
    bg_1 = pygame.image.load(bg_imgs[0]).convert()
    bg_2 = pygame.image.load(bg_imgs[1]).convert()
    bg_3 = pygame.image.load(bg_imgs[2]).convert()
    # 玩家, 子弹和小行星精灵组
    player_group = pygame.sprite.Group()
    bullet_group = pygame.sprite.Group()
    asteroid_group = pygame.sprite.Group()
    # 产生小行星的时间间隔
    asteroid_ticks = 90
    for i in range(num_player):
        player_group.add(Ship(i+1, cfg))
    clock = pygame.time.Clock()
    # 分数
    score_1, score_2 = 0, 0
    # 游戏主循环
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
        # --玩家一: ↑↓←→控制, j射击; 玩家二: wsad控制, 空格射击
        pressed_keys = pygame.key.get_pressed()
        for idx, player in enumerate(player_group):
            direction = None
            if idx == 0:
                if pressed_keys[pygame.K_UP]:
                    direction = \'up\'
                elif pressed_keys[pygame.K_DOWN]:
                    direction = \'down\'
                elif pressed_keys[pygame.K_LEFT]:
                    direction = \'left\'
                elif pressed_keys[pygame.K_RIGHT]:
                    direction = \'right\'
                if direction:
                    player.move(direction)
                if pressed_keys[pygame.K_j]:
                    if player.cooling_time == 0:
                        fire_sound.play()
                        bullet_group.add(player.shot())
                        player.cooling_time = 20
            elif idx == 1:
                if pressed_keys[pygame.K_w]:
                    direction = \'up\'
                elif pressed_keys[pygame.K_s]:
                    direction = \'down\'
                elif pressed_keys[pygame.K_a]:
                    direction = \'left\'
                elif pressed_keys[pygame.K_d]:
                    direction = \'right\'
                if direction:
                    player.move(direction)
                if pressed_keys[pygame.K_SPACE]:
                    if player.cooling_time == 0:
                        fire_sound.play()
                        bullet_group.add(player.shot())
                        player.cooling_time = 20
            if player.cooling_time > 0:
                player.cooling_time -= 1
        if (score_1 + score_2) < 500:
            background = bg_1
        elif (score_1 + score_2) < 1500:
            background = bg_2
        else:
            background = bg_3
        # --向下移动背景图实现飞船向上移动的效果
        screen.blit(background, (0, -background.get_rect().height + bg_move_dis))
        screen.blit(background, (0, bg_move_dis))
        bg_move_dis = (bg_move_dis + 2) % background.get_rect().height
        # --生成小行星
        if asteroid_ticks == 0:
            asteroid_ticks = 90
            asteroid_group.add(Asteroid(cfg))
        else:
            asteroid_ticks -= 1
        # --画飞船
        for player in player_group:
            if pygame.sprite.spritecollide(player, asteroid_group, True, None):
                player.explode_step = 1
                explosion_sound.play()
            elif player.explode_step > 0:
                if player.explode_step > 3:
                    player_group.remove(player)
                    if len(player_group) == 0:
                        return
                else:
                    player.explode(screen)
            else:
                player.draw(screen)
        # --画子弹
        for bullet in bullet_group:
            bullet.move()
            if pygame.sprite.spritecollide(bullet, asteroid_group, True, None):
                bullet_group.remove(bullet)
                if bullet.player_idx == 1:
                    score_1 += 1
                else:
                    score_2 += 1
            else:
                bullet.draw(screen)
        # --画小行星
        for asteroid in asteroid_group:
            asteroid.move()
            asteroid.rotate()
            asteroid.draw(screen)
        # --显示分数
        score_1_text = \'玩家一得分: %s\' % score_1
        score_2_text = \'玩家二得分: %s\' % score_2
        text_1 = font.render(score_1_text, True, (0, 0, 255))
        text_2 = font.render(score_2_text, True, (255, 0, 0))
        screen.blit(text_1, (2, 5))
        screen.blit(text_2, (2, 35))
        # --屏幕刷新
        pygame.display.update()
        clock.tick(60)

 

\'\'\'主函数\'\'\'
def main():
    pygame.init()
    pygame.font.init()
    pygame.mixer.init()
    screen = pygame.display.set_mode(cfg.SCREENSIZE)
    pygame.display.set_caption(\'飞机大战 —— 九歌\')
    num_player = StartInterface(screen, cfg)
    if num_player == 1:
        while True:
            GamingInterface(num_player=1, screen=screen)
            EndInterface(screen, cfg)
    else:
        while True:
            GamingInterface(num_player=2, screen=screen)
            EndInterface(screen, cfg)

 

\'\'\'run\'\'\'
if __name__ == \'__main__\':
    main()

 

在这里插入图片描述

5、打地鼠

源码分享:
###PYTHON 学习群:906715085####
import cfg
import sys
import pygame
import random
from modules import *

 

\'\'\'游戏初始化\'\'\'
def initGame():
    pygame.init()
    pygame.mixer.init()
    screen = pygame.display.set_mode(cfg.SCREENSIZE)
    pygame.display.set_caption(\'打地鼠 —— 九歌\')
    return screen

 

\'\'\'主函数\'\'\'
def main():
    # 初始化
    screen = initGame()
    # 加载背景音乐和其他音效
    pygame.mixer.music.load(cfg.BGM_PATH)
    pygame.mixer.music.play(-1)
    audios = {
        \'count_down\': pygame.mixer.Sound(cfg.COUNT_DOWN_SOUND_PATH),
        \'hammering\': pygame.mixer.Sound(cfg.HAMMERING_SOUND_PATH)
    }
    # 加载字体
    font = pygame.font.Font(cfg.FONT_PATH, 40)
    # 加载背景图片
    bg_img = pygame.image.load(cfg.GAME_BG_IMAGEPATH)
    # 开始界面
    startInterface(screen, cfg.GAME_BEGIN_IMAGEPATHS)
    # 地鼠改变位置的计时
    hole_pos = random.choice(cfg.HOLE_POSITIONS)
    change_hole_event = pygame.USEREVENT
    pygame.time.set_timer(change_hole_event, 800)
    # 地鼠
    mole = Mole(cfg.MOLE_IMAGEPATHS, hole_pos)
    # 锤子
    hammer = Hammer(cfg.HAMMER_IMAGEPATHS, (500, 250))
    # 时钟
    clock = pygame.time.Clock()
    # 分数
    your_score = 0
    flag = False
    # 初始时间
    init_time = pygame.time.get_ticks()
    # 游戏主循环
    while True:
        # --游戏时间为60s
        time_remain = round((61000 - (pygame.time.get_ticks() - init_time)) / 1000.)
        # --游戏时间减少, 地鼠变位置速度变快
        if time_remain == 40 and not flag:
            hole_pos = random.choice(cfg.HOLE_POSITIONS)
            mole.reset()
            mole.setPosition(hole_pos)
            pygame.time.set_timer(change_hole_event, 650)
            flag = True
        elif time_remain == 20 and flag:
            hole_pos = random.choice(cfg.HOLE_POSITIONS)
            mole.reset()
            mole.setPosition(hole_pos)
            pygame.time.set_timer(change_hole_event, 500)
            flag = False
        # --倒计时音效
        if time_remain == 10:
            audios[\'count_down\'].play()
        # --游戏结束
        if time_remain < 0: break
        count_down_text = font.render(\'Time: \'+str(time_remain), True, cfg.WHITE)
        # --按键检测
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            elif event.type == pygame.MOUSEMOTION:
                hammer.setPosition(pygame.mouse.get_pos())
            elif event.type == pygame.MOUSEBUTTONDOWN:
                if event.button == 1:
                    hammer.setHammering()
            elif event.type == change_hole_event:
                hole_pos = random.choice(cfg.HOLE_POSITIONS)
                mole.reset()
                mole.setPosition(hole_pos)
        # --碰撞检测
        if hammer.is_hammering and not mole.is_hammer:
            is_hammer = pygame.sprite.collide_mask(hammer, mole)
            if is_hammer:
                audios[\'hammering\'].play()
                mole.setBeHammered()
                your_score += 10
        # --分数
        your_score_text = font.render(\'Score: \'+str(your_score), True, cfg.BROWN)
        # --绑定必要的游戏元素到屏幕(注意顺序)
        screen.blit(bg_img, (0, 0))
        screen.blit(count_down_text, (875, 8))
        screen.blit(your_score_text, (800, 430))
        mole.draw(screen)
        hammer.draw(screen)
        # --更新
        pygame.display.flip()
        clock.tick(60)
    # 读取最佳分数(try块避免第一次游戏无.rec文件)
    try:
        best_score = int(open(cfg.RECORD_PATH).read())
    except:
        best_score = 0
    # 若当前分数大于最佳分数则更新最佳分数
    if your_score > best_score:
        f = open(cfg.RECORD_PATH, \'w\')
        f.write(str(your_score))
        f.close()
    # 结束界面
    score_info = {\'your_score\': your_score, \'best_score\': best_score}
    is_restart = endInterface(screen, cfg.GAME_END_IMAGEPATH, cfg.GAME_AGAIN_IMAGEPATHS, score_info, cfg.FONT_PATH, [cfg.WHITE, cfg.RED], cfg.SCREENSIZE)
    return is_restart
 

 

 
\'\'\'run\'\'\'
if __name__ == \'__main__\':
    while True:
        is_restart = main()
        if not is_restart:
            break

 

五个小游戏,一个都不能少,你要的全拿走。今天真的是最辛苦的一天了,这得点个赞安慰一下密密麻麻的代码,这一篇到这里就没有了,大家周末愉快呀!

在这里插入图片描述


来源:https://www.cnblogs.com/123456feng/p/16060470.html
本站部分图文来源于网络,如有侵权请联系删除。

未经允许不得转载:百木园 » 周末用Python写了5个小游戏(附源码)

相关推荐

  • 暂无文章