关键词搜索

源码搜索 ×
×

【pygame游戏开发】这几个经典游戏,勾起了少年的快乐

发布2022-02-25浏览25961次

详情内容

给大家分享几个好玩有趣的小游戏,既提升了学习的兴趣,又提升了学习效率,告别枯燥的学习。

一、飞机大战

1、源码部分

模块导入

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)
    
      5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125

    主函数

    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)
    
      5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    2、全部代码

    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)
     
    if __name__ == '__main__':
        main()
    
      5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149

    3、效果展示

    实现效果

    二、打地鼠

    1、代码部分

    模块导入

    import cfg
    import pygame
    import random
    from modules.sprites.mole import *
    from modules.sprites.hammer import *
    from modules.interfaces.endinterface import *
    from modules.interfaces.startinterface import *
    
      5
    • 6
    • 7

    游戏初始化

    def initGame():
    	pygame.init()
    	pygame.mixer.init()
    	screen = pygame.display.set_mode(cfg.SCREENSIZE)
    	pygame.display.set_caption('Whac A Mole-青灯教育')
    	return screen
    
      5
    • 6

    主函数

    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
    
      5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100

    2、全部代码

    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
     
    if __name__ == '__main__':
        while True:
            is_restart = main()
            if not is_restart:
                break
    
      5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119

    3、效果展示

    在这里插入图片描述

    三、滑雪游戏

    1、代码部分

    导入模块

    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])
      
        5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33

      障碍物类

      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
      
        5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13

      创建障碍物

      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
      
        5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14

      合并障碍物

      def AddObstacles(obstacles0, obstacles1):
          obstacles = pygame.sprite.Group()
          for obstacle in obstacles0:
              obstacles.add(obstacle)
          for obstacle in obstacles1:
              obstacles.add(obstacle)
          return obstacles
      
        5
      • 6
      • 7

      显示游戏开始界面

      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()
      
        5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20

      显示分数

      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()
        
          5
        • 6

        主程序

        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)
        
          5
        • 6
        • 7
        • 8
        • 9
        • 10
        • 11
        • 12
        • 13
        • 14
        • 15
        • 16
        • 17
        • 18
        • 19
        • 20
        • 21
        • 22
        • 23
        • 24
        • 25
        • 26
        • 27
        • 28
        • 29
        • 30
        • 31
        • 32
        • 33
        • 34
        • 35
        • 36
        • 37
        • 38
        • 39
        • 40
        • 41
        • 42
        • 43
        • 44
        • 45
        • 46
        • 47
        • 48
        • 49
        • 50
        • 51
        • 52
        • 53
        • 54
        • 55
        • 56
        • 57
        • 58
        • 59
        • 60
        • 61
        • 62
        • 63
        • 64
        • 65
        • 66
        • 67
        • 68
        • 69
        • 70
        • 71
        • 72
        • 73

        2、完整代码

        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])
         
         
        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)
         
        if __name__ == '__main__':
            main()
          5
        • 6
        • 7
        • 8
        • 9
        • 10
        • 11
        • 12
        • 13
        • 14
        • 15
        • 16
        • 17
        • 18
        • 19
        • 20
        • 21
        • 22
        • 23
        • 24
        • 25
        • 26
        • 27
        • 28
        • 29
        • 30
        • 31
        • 32
        • 33
        • 34
        • 35
        • 36
        • 37
        • 38
        • 39
        • 40
        • 41
        • 42
        • 43
        • 44
        • 45
        • 46
        • 47
        • 48
        • 49
        • 50
        • 51
        • 52
        • 53
        • 54
        • 55
        • 56
        • 57
        • 58
        • 59
        • 60
        • 61
        • 62
        • 63
        • 64
        • 65
        • 66
        • 67
        • 68
        • 69
        • 70
        • 71
        • 72
        • 73
        • 74
        • 75
        • 76
        • 77
        • 78
        • 79
        • 80
        • 81
        • 82
        • 83
        • 84
        • 85
        • 86
        • 87
        • 88
        • 89
        • 90
        • 91
        • 92
        • 93
        • 94
        • 95
        • 96
        • 97
        • 98
        • 99
        • 100
        • 101
        • 102
        • 103
        • 104
        • 105
        • 106
        • 107
        • 108
        • 109
        • 110
        • 111
        • 112
        • 113
        • 114
        • 115
        • 116
        • 117
        • 118
        • 119
        • 120
        • 121
        • 122
        • 123
        • 124
        • 125
        • 126
        • 127
        • 128
        • 129
        • 130
        • 131
        • 132
        • 133
        • 134
        • 135
        • 136
        • 137
        • 138
        • 139
        • 140
        • 141
        • 142
        • 143
        • 144
        • 145
        • 146
        • 147
        • 148
        • 149
        • 150
        • 151
        • 152
        • 153
        • 154
        • 155
        • 156
        • 157
        • 158
        • 159
        • 160
        • 161
        • 162
        • 163
        • 164
        • 165
        • 166
        • 167
        • 168
        • 169
        • 170
        • 171
        • 172
        • 173
        • 174
        • 175
        • 176
        • 177
        • 178
        • 179
        • 180
        • 181
        • 182
        • 183
        • 184
        • 185
        • 186
        • 187
        • 188
        • 189

        3、效果展示

        在这里插入图片描述

        四、打乒乓

        1、代码部分

        导入模块

        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))
          
            5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11

          开始界面

          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()
          
            5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16
          • 17

          结束界面

          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()
          
            5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16
          • 17
          • 18
          • 19
          • 20
          • 21
          • 22
          • 23
          • 24
          • 25

          运行游戏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()
          
            5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16
          • 17
          • 18
          • 19
          • 20
          • 21
          • 22
          • 23
          • 24
          • 25
          • 26
          • 27
          • 28
          • 29
          • 30
          • 31
          • 32
          • 33
          • 34
          • 35
          • 36
          • 37
          • 38
          • 39
          • 40
          • 41
          • 42
          • 43
          • 44
          • 45
          • 46
          • 47
          • 48
          • 49
          • 50
          • 51
          • 52
          • 53
          • 54
          • 55
          • 56
          • 57

          主函数

          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)
          
            5
          • 6
          • 7
          • 8
          • 9
          • 10

          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))
          
          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()
           
          
          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)
           
          if __name__ == '__main__':
              main()
          
          
            5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16
          • 17
          • 18
          • 19
          • 20
          • 21
          • 22
          • 23
          • 24
          • 25
          • 26
          • 27
          • 28
          • 29
          • 30
          • 31
          • 32
          • 33
          • 34
          • 35
          • 36
          • 37
          • 38
          • 39
          • 40
          • 41
          • 42
          • 43
          • 44
          • 45
          • 46
          • 47
          • 48
          • 49
          • 50
          • 51
          • 52
          • 53
          • 54
          • 55
          • 56
          • 57
          • 58
          • 59
          • 60
          • 61
          • 62
          • 63
          • 64
          • 65
          • 66
          • 67
          • 68
          • 69
          • 70
          • 71
          • 72
          • 73
          • 74
          • 75
          • 76
          • 77
          • 78
          • 79
          • 80
          • 81
          • 82
          • 83
          • 84
          • 85
          • 86
          • 87
          • 88
          • 89
          • 90
          • 91
          • 92
          • 93
          • 94
          • 95
          • 96
          • 97
          • 98
          • 99
          • 100
          • 101
          • 102
          • 103
          • 104
          • 105
          • 106
          • 107
          • 108
          • 109
          • 110
          • 111
          • 112
          • 113
          • 114
          • 115
          • 116
          • 117
          • 118
          • 119
          • 120
          • 121
          • 122
          • 123
          • 124
          • 125
          • 126
          • 127
          • 128
          • 129
          • 130
          • 131
          • 132
          • 133
          • 134
          • 135

          3、效果展示

          五、吃金币

          1、代码部分

          导入模块

          import os
          import cfg
          import sys
          import pygame
          import random
          from modules import *
          
            5
          • 6

          游戏初始化

          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
          
            5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16
          • 17
          • 18
          • 19
          • 20

          主函数

          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)
          
            5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16
          • 17
          • 18
          • 19
          • 20
          • 21
          • 22
          • 23
          • 24
          • 25
          • 26
          • 27
          • 28
          • 29
          • 30
          • 31
          • 32
          • 33
          • 34
          • 35
          • 36
          • 37
          • 38
          • 39
          • 40
          • 41
          • 42
          • 43
          • 44
          • 45
          • 46
          • 47
          • 48
          • 49
          • 50
          • 51
          • 52
          • 53
          • 54
          • 55
          • 56
          • 57
          • 58
          • 59
          • 60
          • 61
          • 62
          • 63
          • 64
          • 65
          • 66
          • 67
          • 68
          • 69
          • 70
          • 71
          • 72
          • 73
          • 74
          • 75
          • 76
          • 77

          2、全部代码

          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)
          
          if __name__ == '__main__':
              while main():
                  pass
          
            5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16
          • 17
          • 18
          • 19
          • 20
          • 21
          • 22
          • 23
          • 24
          • 25
          • 26
          • 27
          • 28
          • 29
          • 30
          • 31
          • 32
          • 33
          • 34
          • 35
          • 36
          • 37
          • 38
          • 39
          • 40
          • 41
          • 42
          • 43
          • 44
          • 45
          • 46
          • 47
          • 48
          • 49
          • 50
          • 51
          • 52
          • 53
          • 54
          • 55
          • 56
          • 57
          • 58
          • 59
          • 60
          • 61
          • 62
          • 63
          • 64
          • 65
          • 66
          • 67
          • 68
          • 69
          • 70
          • 71
          • 72
          • 73
          • 74
          • 75
          • 76
          • 77
          • 78
          • 79
          • 80
          • 81
          • 82
          • 83
          • 84
          • 85
          • 86
          • 87
          • 88
          • 89
          • 90
          • 91
          • 92
          • 93
          • 94
          • 95
          • 96
          • 97
          • 98
          • 99
          • 100
          • 101
          • 102
          • 103
          • 104
          • 105
          • 106
          • 107
          • 108
          • 109
          • 110
          • 111
          • 112

          3、效果展示

          在这里插入图片描述

          六、消消乐

          1、代码部分

          模块导入

          import os
          import sys
          import cfg
          import pygame
          from modules import *
          
            5

          游戏主程序

          加载背景音乐

          pygame.mixer.init()
          pygame.mixer.music.load(os.path.join(cfg.ROOTDIR, "resources/audios/bg.mp3"))
          pygame.mixer.music.set_volume(0.6)
          pygame.mixer.music.play(-1)
          

            加载音效

            sounds = {}
            sounds['mismatch'] = pygame.mixer.Sound(os.path.join(cfg.ROOTDIR, 'resources/audios/badswap.wav'))
            sounds['match'] = []
            for i in range(6):
                sounds['match'].append(pygame.mixer.Sound(os.path.join(cfg.ROOTDIR, 'resources/audios/match%s.wav' % i)))
            
              5

            加载字体

            font = pygame.font.Font(os.path.join(cfg.ROOTDIR, 'resources/font/font.TTF'), 25)
            
            • 1

            图片加载

            gem_imgs = []
            for i in range(1, 8):
                gem_imgs.append(os.path.join(cfg.ROOTDIR, 'resources/images/gem%s.png' % i))
            
            • 1
            • 2
            • 3

            主循环

            game = gemGame(screen, sounds, font, gem_imgs, cfg)
            while True:
                score = game.start()
                flag = False
            

              一轮游戏结束后玩家选择重玩或者退出

              while True:
                  for event in pygame.event.get():
                      if event.type == pygame.QUIT or (event.type == pygame.KEYUP and event.key == pygame.K_ESCAPE):
                          pygame.quit()
                          sys.exit()
                      elif event.type == pygame.KEYUP and event.key == pygame.K_r:
                          flag = True
                  if flag:
                      break
                  screen.fill((135, 206, 235))
                  text0 = 'Final score: %s' % score
                  text1 = 'Press <R> to restart the game.'
                  text2 = 'Press <Esc> to quit the game.'
                  y = 150
                  for idx, text in enumerate([text0, text1, text2]):
                      text_render = font.render(text, 1, (85, 65, 0))
                      rect = text_render.get_rect()
                      if idx == 0:
                          rect.left, rect.top = (212, y)
                      elif idx == 1:
                          rect.left, rect.top = (122.5, y)
                      else:
                          rect.left, rect.top = (126.5, y)
                      y += 100
                      screen.blit(text_render, rect)
                  pygame.display.update()
              game.reset()
              
                5
              • 6
              • 7
              • 8
              • 9
              • 10
              • 11
              • 12
              • 13
              • 14
              • 15
              • 16
              • 17
              • 18
              • 19
              • 20
              • 21
              • 22
              • 23
              • 24
              • 25
              • 26
              • 27

              2、全部代码

              import os
              import sys
              import cfg
              import pygame
              from modules import *
               
               
              
              def main():
                  pygame.init()
                  screen = pygame.display.set_mode(cfg.SCREENSIZE)
                  pygame.display.set_caption('Gemgem —— 九歌')
              
                  pygame.mixer.init()
                  pygame.mixer.music.load(os.path.join(cfg.ROOTDIR, "resources/audios/bg.mp3"))
                  pygame.mixer.music.set_volume(0.6)
                  pygame.mixer.music.play(-1)
              
                  sounds = {}
                  sounds['mismatch'] = pygame.mixer.Sound(os.path.join(cfg.ROOTDIR, 'resources/audios/badswap.wav'))
                  sounds['match'] = []
                  for i in range(6):
                      sounds['match'].append(pygame.mixer.Sound(os.path.join(cfg.ROOTDIR, 'resources/audios/match%s.wav' % i)))
              
                  font = pygame.font.Font(os.path.join(cfg.ROOTDIR, 'resources/font/font.TTF'), 25)
              
                  gem_imgs = []
                  for i in range(1, 8):
                      gem_imgs.append(os.path.join(cfg.ROOTDIR, 'resources/images/gem%s.png' % i))
              
                  game = gemGame(screen, sounds, font, gem_imgs, cfg)
                  while True:
                      score = game.start()
                      flag = False
               
                      while True:
                          for event in pygame.event.get():
                              if event.type == pygame.QUIT or (event.type == pygame.KEYUP and event.key == pygame.K_ESCAPE):
                                  pygame.quit()
                                  sys.exit()
                              elif event.type == pygame.KEYUP and event.key == pygame.K_r:
                                  flag = True
                          if flag:
                              break
                          screen.fill((135, 206, 235))
                          text0 = 'Final score: %s' % score
                          text1 = 'Press <R> to restart the game.'
                          text2 = 'Press <Esc> to quit the game.'
                          y = 150
                          for idx, text in enumerate([text0, text1, text2]):
                              text_render = font.render(text, 1, (85, 65, 0))
                              rect = text_render.get_rect()
                              if idx == 0:
                                  rect.left, rect.top = (212, y)
                              elif idx == 1:
                                  rect.left, rect.top = (122.5, y)
                              else:
                                  rect.left, rect.top = (126.5, y)
                              y += 100
                              screen.blit(text_render, rect)
                          pygame.display.update()
                      game.reset()
               
              if __name__ == '__main__':
                  main()
              
                5
              • 6
              • 7
              • 8
              • 9
              • 10
              • 11
              • 12
              • 13
              • 14
              • 15
              • 16
              • 17
              • 18
              • 19
              • 20
              • 21
              • 22
              • 23
              • 24
              • 25
              • 26
              • 27
              • 28
              • 29
              • 30
              • 31
              • 32
              • 33
              • 34
              • 35
              • 36
              • 37
              • 38
              • 39
              • 40
              • 41
              • 42
              • 43
              • 44
              • 45
              • 46
              • 47
              • 48
              • 49
              • 50
              • 51
              • 52
              • 53
              • 54
              • 55
              • 56
              • 57
              • 58
              • 59
              • 60
              • 61
              • 62
              • 63
              • 64
              • 65

              3、效果展示

              在这里插入图片描述

              七、贪吃蛇

              1、代码部分

              模块导入

              import cfg
              import pygame
              from food import *
              from snake import *
              from utils import *
              from endInterface import *
              
                5
              • 6

              主函数

              游戏初始化

              pygame.init()
              screen = pygame.display.set_mode(cfg.SCREENSIZE)
              pygame.display.set_caption('Greedy Snake')
              clock = pygame.time.Clock()
              

                播放背景音乐

                pygame.mixer.music.load(cfg.BGMPATH)
                pygame.mixer.music.play(-1)
                
                • 1
                • 2

                游戏主循环

                snake = Snake(cfg)
                apple = Apple(cfg, snake.coords)
                score = 0
                while True:
                	screen.fill(cfg.BLACK)
                	
                	for event in pygame.event.get():
                		if event.type == pygame.QUIT:
                			pygame.quit()
                			sys.exit()
                		elif event.type == pygame.KEYDOWN:
                			if event.key in [pygame.K_UP, pygame.K_DOWN, pygame.K_LEFT, pygame.K_RIGHT]:
                				snake.setDirection({pygame.K_UP: 'up', pygame.K_DOWN: 'down', pygame.K_LEFT: 'left', pygame.K_RIGHT: 'right'}[event.key])
                
                  5
                • 6
                • 7
                • 8
                • 9
                • 10
                • 11
                • 12
                • 13

                更新贪吃蛇和食物

                if snake.update(apple):
                	apple = Apple(cfg, snake.coords)
                	score += 1
                
                • 1
                • 2
                • 3

                判断游戏是否结束

                if snake.isgameover: break
                
                • 1

                显示游戏里必要的元素

                drawGameGrid(cfg, screen)
                snake.draw(screen)
                apple.draw(screen)
                showScore(cfg, score, screen)	
                

                  屏幕更新

                  	pygame.display.update()
                  	clock.tick(cfg.FPS)
                  return endInterface(screen, cfg)
                  
                  • 1
                  • 2
                  • 3

                  2、全部代码

                  import cfg
                  import pygame
                  from food import *
                  from snake import *
                  from utils import *
                  from endInterface import *
                  
                  def main(cfg):
                  	
                  	pygame.init()
                  	screen = pygame.display.set_mode(cfg.SCREENSIZE)
                  	pygame.display.set_caption('Greedy Snake ')
                  	clock = pygame.time.Clock()
                  	
                  	pygame.mixer.music.load(cfg.BGMPATH)
                  	pygame.mixer.music.play(-1)
                  	
                  	snake = Snake(cfg)
                  	apple = Apple(cfg, snake.coords)
                  	score = 0
                  	while True:
                  		screen.fill(cfg.BLACK)
                  		
                  		for event in pygame.event.get():
                  			if event.type == pygame.QUIT:
                  				pygame.quit()
                  				sys.exit()
                  			elif event.type == pygame.KEYDOWN:
                  				if event.key in [pygame.K_UP, pygame.K_DOWN, pygame.K_LEFT, pygame.K_RIGHT]:
                  					snake.setDirection({pygame.K_UP: 'up', pygame.K_DOWN: 'down', pygame.K_LEFT: 'left', pygame.K_RIGHT: 'right'}[event.key])
                  		
                  		if snake.update(apple):
                  			apple = Apple(cfg, snake.coords)
                  			score += 1
                  		
                  		if snake.isgameover: break
                  		
                  		drawGameGrid(cfg, screen)
                  		snake.draw(screen)
                  		apple.draw(screen)
                  		showScore(cfg, score, screen)
                  		
                  		pygame.display.update()
                  		clock.tick(cfg.FPS)
                  	return endInterface(screen, cfg)
                  
                  if __name__ == '__main__':
                  	while True:
                  		if not main(cfg):
                  			break
                  
                    5
                  • 6
                  • 7
                  • 8
                  • 9
                  • 10
                  • 11
                  • 12
                  • 13
                  • 14
                  • 15
                  • 16
                  • 17
                  • 18
                  • 19
                  • 20
                  • 21
                  • 22
                  • 23
                  • 24
                  • 25
                  • 26
                  • 27
                  • 28
                  • 29
                  • 30
                  • 31
                  • 32
                  • 33
                  • 34
                  • 35
                  • 36
                  • 37
                  • 38
                  • 39
                  • 40
                  • 41
                  • 42
                  • 43
                  • 44
                  • 45
                  • 46
                  • 47
                  • 48
                  • 49
                  • 50

                  3、效果展示

                  在这里插入图片描述

                  八、消消乐

                  1、代码部分

                  模块导入

                  import os
                  import sys
                  import random
                  from modules import *
                  from PyQt5.QtGui import *
                  from PyQt5.QtCore import *
                  from PyQt5.QtWidgets import *
                  
                    5
                  • 6
                  • 7

                  定义俄罗斯方块游戏类

                  class TetrisGame(QMainWindow):
                      def __init__(self, parent=None):
                          super(TetrisGame, self).__init__(parent)
                          # 是否暂停ing
                          self.is_paused = False
                          # 是否开始ing
                          self.is_started = False
                          self.initUI()
                  
                    5
                  • 6
                  • 7
                  • 8

                  界面初始化

                  def initUI(self):
                      # icon
                      self.setWindowIcon(QIcon(os.path.join(os.getcwd(), 'resources/icon.jpg')))
                      # 块大小
                      self.grid_size = 22
                      # 游戏帧率
                      self.fps = 200
                      self.timer = QBasicTimer()
                      # 焦点
                      self.setFocusPolicy(Qt.StrongFocus)
                      # 水平布局
                      layout_horizontal = QHBoxLayout()
                      self.inner_board = InnerBoard()
                      self.external_board = ExternalBoard(self, self.grid_size, self.inner_board)
                      layout_horizontal.addWidget(self.external_board)
                      self.side_panel = SidePanel(self, self.grid_size, self.inner_board)
                      layout_horizontal.addWidget(self.side_panel)
                      self.status_bar = self.statusBar()
                      self.external_board.score_signal[str].connect(self.status_bar.showMessage)
                      self.start()
                      self.center()
                      self.setWindowTitle('Tetris —— 九歌')
                      self.show()
                      self.setFixedSize(self.external_board.width() + self.side_panel.width(), self.side_panel.height() + self.status_bar.height())
                  
                    5
                  • 6
                  • 7
                  • 8
                  • 9
                  • 10
                  • 11
                  • 12
                  • 13
                  • 14
                  • 15
                  • 16
                  • 17
                  • 18
                  • 19
                  • 20
                  • 21
                  • 22
                  • 23
                  • 24

                  游戏界面移动到屏幕中间

                  def center(self):
                      screen = QDesktopWidget().screenGeometry()
                      size = self.geometry()
                      self.move((screen.width() - size.width()) // 2, (screen.height() - size.height()) // 2)
                  

                    更新界面

                    def updateWindow(self):
                        self.external_board.updateData()
                        self.side_panel.updateData()
                        self.update()
                    

                      开始

                      def start(self):
                          if self.is_started:
                              return
                          self.is_started = True
                          self.inner_board.createNewTetris()
                          self.timer.start(self.fps, self)
                      
                        5
                      • 6

                      暂停/不暂停

                      def pause(self):
                          if not self.is_started:
                              return
                          self.is_paused = not self.is_paused
                          if self.is_paused:
                              self.timer.stop()
                              self.external_board.score_signal.emit('Paused')
                          else:
                              self.timer.start(self.fps, self)
                          self.updateWindow()
                      
                        5
                      • 6
                      • 7
                      • 8
                      • 9
                      • 10

                      计时器事件

                      def timerEvent(self, event):
                          if event.timerId() == self.timer.timerId():
                              removed_lines = self.inner_board.moveDown()
                              self.external_board.score += removed_lines
                              self.updateWindow()
                          else:
                              super(TetrisGame, self).timerEvent(event)
                      
                        5
                      • 6
                      • 7

                      按键事件

                      def keyPressEvent(self, event):
                          if not self.is_started or self.inner_board.current_tetris == tetrisShape().shape_empty:
                              super(TetrisGame, self).keyPressEvent(event)
                              return
                          key = event.key()
                          # P键暂停
                          if key == Qt.Key_P:
                              self.pause()
                              return
                          if self.is_paused:
                              return
                          # 向左
                          elif key == Qt.Key_Left:
                              self.inner_board.moveLeft()
                          # 向右
                          elif key == Qt.Key_Right:
                              self.inner_board.moveRight()
                          # 旋转
                          elif key == Qt.Key_Up:
                              self.inner_board.rotateAnticlockwise()
                          # 快速坠落
                          elif key == Qt.Key_Space:
                              self.external_board.score += self.inner_board.dropDown()
                          else:
                              super(TetrisGame, self).keyPressEvent(event)
                          self.updateWindow()
                      
                        5
                      • 6
                      • 7
                      • 8
                      • 9
                      • 10
                      • 11
                      • 12
                      • 13
                      • 14
                      • 15
                      • 16
                      • 17
                      • 18
                      • 19
                      • 20
                      • 21
                      • 22
                      • 23
                      • 24
                      • 25
                      • 26

                      2、全部代码

                      import os
                      import sys
                      import random
                      from modules import *
                      from PyQt5.QtGui import *
                      from PyQt5.QtCore import *
                      from PyQt5.QtWidgets import *
                       
                      class TetrisGame(QMainWindow):
                          def __init__(self, parent=None):
                              super(TetrisGame, self).__init__(parent)
                              # 是否暂停ing
                              self.is_paused = False
                              # 是否开始ing
                              self.is_started = False
                              self.initUI()
                      
                          def initUI(self):
                              # icon
                              self.setWindowIcon(QIcon(os.path.join(os.getcwd(), 'resources/icon.jpg')))
                              # 块大小
                              self.grid_size = 22
                              # 游戏帧率
                              self.fps = 200
                              self.timer = QBasicTimer()
                              # 焦点
                              self.setFocusPolicy(Qt.StrongFocus)
                              # 水平布局
                              layout_horizontal = QHBoxLayout()
                              self.inner_board = InnerBoard()
                              self.external_board = ExternalBoard(self, self.grid_size, self.inner_board)
                              layout_horizontal.addWidget(self.external_board)
                              self.side_panel = SidePanel(self, self.grid_size, self.inner_board)
                              layout_horizontal.addWidget(self.side_panel)
                              self.status_bar = self.statusBar()
                              self.external_board.score_signal[str].connect(self.status_bar.showMessage)
                              self.start()
                              self.center()
                              self.setWindowTitle('Tetris —— 九歌')
                              self.show()
                              self.setFixedSize(self.external_board.width() + self.side_panel.width(), self.side_panel.height() + self.status_bar.height())
                      
                          def center(self):
                              screen = QDesktopWidget().screenGeometry()
                              size = self.geometry()
                              self.move((screen.width() - size.width()) // 2, (screen.height() - size.height()) // 2)
                      
                          def updateWindow(self):
                              self.external_board.updateData()
                              self.side_panel.updateData()
                              self.update()
                      
                          def start(self):
                              if self.is_started:
                                  return
                              self.is_started = True
                              self.inner_board.createNewTetris()
                              self.timer.start(self.fps, self)
                      
                          def pause(self):
                              if not self.is_started:
                                  return
                              self.is_paused = not self.is_paused
                              if self.is_paused:
                                  self.timer.stop()
                                  self.external_board.score_signal.emit('Paused')
                              else:
                                  self.timer.start(self.fps, self)
                              self.updateWindow()
                      
                          def timerEvent(self, event):
                              if event.timerId() == self.timer.timerId():
                                  removed_lines = self.inner_board.moveDown()
                                  self.external_board.score += removed_lines
                                  self.updateWindow()
                              else:
                                  super(TetrisGame, self).timerEvent(event)
                      
                          def keyPressEvent(self, event):
                              if not self.is_started or self.inner_board.current_tetris == tetrisShape().shape_empty:
                                  super(TetrisGame, self).keyPressEvent(event)
                                  return
                              key = event.key()
                              # P键暂停
                              if key == Qt.Key_P:
                                  self.pause()
                                  return
                              if self.is_paused:
                                  return
                              # 向左
                              elif key == Qt.Key_Left:
                                  self.inner_board.moveLeft()
                              # 向右
                              elif key == Qt.Key_Right:
                                  self.inner_board.moveRight()
                              # 旋转
                              elif key == Qt.Key_Up:
                                  self.inner_board.rotateAnticlockwise()
                              # 快速坠落
                              elif key == Qt.Key_Space:
                                  self.external_board.score += self.inner_board.dropDown()
                              else:
                                  super(TetrisGame, self).keyPressEvent(event)
                              self.updateWindow()
                       
                      if __name__ == '__main__':
                          app = QApplication([])
                          tetris = TetrisGame()
                          sys.exit(app.exec_())
                      
                        5
                      • 6
                      • 7
                      • 8
                      • 9
                      • 10
                      • 11
                      • 12
                      • 13
                      • 14
                      • 15
                      • 16
                      • 17
                      • 18
                      • 19
                      • 20
                      • 21
                      • 22
                      • 23
                      • 24
                      • 25
                      • 26
                      • 27
                      • 28
                      • 29
                      • 30
                      • 31
                      • 32
                      • 33
                      • 34
                      • 35
                      • 36
                      • 37
                      • 38
                      • 39
                      • 40
                      • 41
                      • 42
                      • 43
                      • 44
                      • 45
                      • 46
                      • 47
                      • 48
                      • 49
                      • 50
                      • 51
                      • 52
                      • 53
                      • 54
                      • 55
                      • 56
                      • 57
                      • 58
                      • 59
                      • 60
                      • 61
                      • 62
                      • 63
                      • 64
                      • 65
                      • 66
                      • 67
                      • 68
                      • 69
                      • 70
                      • 71
                      • 72
                      • 73
                      • 74
                      • 75
                      • 76
                      • 77
                      • 78
                      • 79
                      • 80
                      • 81
                      • 82
                      • 83
                      • 84
                      • 85
                      • 86
                      • 87
                      • 88
                      • 89
                      • 90
                      • 91
                      • 92
                      • 93
                      • 94
                      • 95
                      • 96
                      • 97
                      • 98
                      • 99
                      • 100
                      • 101
                      • 102
                      • 103
                      • 104
                      • 105
                      • 106
                      • 107
                      • 108
                      • 109

                      3、效果展示

                      在这里插入图片描述
                      兄弟们,今天的分享就到这,运行不了的话,可以点这里,有些是需要素材才能运行的。

                      相关技术文章

                      点击QQ咨询
                      开通会员
                      返回顶部
                      ×
                      微信扫码支付
                      微信扫码支付
                      确定支付下载
                      请使用微信描二维码支付
                      ×

                      提示信息

                      ×

                      选择支付方式

                      • 微信支付
                      • 支付宝付款
                      确定支付下载