当前位置 博文首页 > AI19970205的博客:30个Python小游戏,上班摸鱼我能玩一天【内附

    AI19970205的博客:30个Python小游戏,上班摸鱼我能玩一天【内附

    作者:[db:作者] 时间:2021-09-20 10:39

    大家好,我是辣条。

    今天给大家带来30个py小游戏,一定要收藏!

    目录

    有手就行

    1、吃金币

    2、打乒乓

    3、滑雪

    4、并夕夕版飞机大战

    5、打地鼠

    简简单单

    6、小恐龙

    7、消消乐

    8、俄罗斯方块

    9、贪吃蛇

    普普通通

    10、24点小游戏

    11、平衡木

    12、外星人入侵

    13、贪心鸟

    14、井字棋888‘’

    有点困难

    15、炸弹人

    16、保卫森林

    17、五子棋

    18、吃豆豆

    19、坦克大战

    20、超级玛丽

    21、水果忍者

    极度困难

    22、飞机大战

    23、2048

    24、推箱子

    25、塔防

    26、植物大战僵尸

    27、扫雷

    终极挑战?

    28、拼图

    ?29、走迷宫

    30、最强游戏


    有手就行

    1、吃金币

    【有手就行系列不介绍玩法了+附源码】

    源码分享:
    ?

    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 = 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、打乒乓

    源码分享:

    
    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、滑雪

    源码分享:

    
    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、并夕夕版飞机大战

    源码分享:

    
    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、打地鼠

    源码分享:

    
    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