当前位置:   article > 正文

用Python代码制作6款小游戏(动画演示+代码分享),学习再也不会枯燥无味啦!!!_python游戏代码

python游戏代码

大家好,我是疯狂的超级玛丽
在编程过程中都是枯燥无味的,所以呢今天给大家带来一些有趣的小项目。
让我们快乐的学习和编程吧!
如果大家喜欢,一定要收藏哦!还有更多的教程和项目教学需要的可以联系我哦!!

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)


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


'''run'''
if __name__ == '__main__':
    main()
  • 1
  • 2
  • 3
  • 4
  • 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
    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()
    
    
    '''run'''
    if __name__ == '__main__':
        main()
    
    • 1
    • 2
    • 3
    • 4
    • 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
      3、俄罗斯方块

      玩法:童年经典,普通模式没啥意思,小时候我们都是玩加速的。

      源码分享:

      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()
      
      
      '''run'''
      if __name__ == '__main__':
          app = QApplication([])
          tetris = TetrisGame()
          sys.exit(app.exec_())
      
      • 1
      • 2
      • 3
      • 4
      • 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

        扫一扫获取更多实战小项目
        安装包

        4、贪吃蛇

        玩法:童年经典,普通魔术也没啥意思,小时候玩的也是加速的。

        源码分享:

        
        import cfg
        import sys
        import pygame
        from modules 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)
        
        
        '''run'''
        if __name__ == '__main__':
            while True:
                if not main(cfg):
                    break
        
        • 1
        • 2
        • 3
        • 4
        • 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
          5、24点小游戏

          玩法:通过加减乘除操作,小学生都没问题的。

          源码分享:

          import os
          import sys
          import pygame
          from cfg import *
          from modules import *
          from fractions import Fraction
          
          
          '''检查控件是否被点击'''
          def checkClicked(group, mouse_pos, group_type='NUMBER'):
              selected = []
              # 数字卡片/运算符卡片
              if group_type == GROUPTYPES[0] or group_type == GROUPTYPES[1]:
                  max_selected = 2 if group_type == GROUPTYPES[0] else 1
                  num_selected = 0
                  for each in group:
                      num_selected += int(each.is_selected)
                  for each in group:
                      if each.rect.collidepoint(mouse_pos):
                          if each.is_selected:
                              each.is_selected = not each.is_selected
                              num_selected -= 1
                              each.select_order = None
                          else:
                              if num_selected < max_selected:
                                  each.is_selected = not each.is_selected
                                  num_selected += 1
                                  each.select_order = str(num_selected)
                      if each.is_selected:
                          selected.append(each.attribute)
              # 按钮卡片
              elif group_type == GROUPTYPES[2]:
                  for each in group:
                      if each.rect.collidepoint(mouse_pos):
                          each.is_selected = True
                          selected.append(each.attribute)
              # 抛出异常
              else:
                  raise ValueError('checkClicked.group_type unsupport %s, expect %s, %s or %s...' % (group_type, *GROUPTYPES))
              return selected
          
          
          '''获取数字精灵组'''
          def getNumberSpritesGroup(numbers):
              number_sprites_group = pygame.sprite.Group()
              for idx, number in enumerate(numbers):
                  args = (*NUMBERCARD_POSITIONS[idx], str(number), NUMBERFONT, NUMBERFONT_COLORS, NUMBERCARD_COLORS, str(number))
                  number_sprites_group.add(Card(*args))
              return number_sprites_group
          
          
          '''获取运算符精灵组'''
          def getOperatorSpritesGroup(operators):
              operator_sprites_group = pygame.sprite.Group()
              for idx, operator in enumerate(operators):
                  args = (*OPERATORCARD_POSITIONS[idx], str(operator), OPERATORFONT, OPREATORFONT_COLORS, OPERATORCARD_COLORS, str(operator))
                  operator_sprites_group.add(Card(*args))
              return operator_sprites_group
          
          
          '''获取按钮精灵组'''
          def getButtonSpritesGroup(buttons):
              button_sprites_group = pygame.sprite.Group()
              for idx, button in enumerate(buttons):
                  args = (*BUTTONCARD_POSITIONS[idx], str(button), BUTTONFONT, BUTTONFONT_COLORS, BUTTONCARD_COLORS, str(button))
                  button_sprites_group.add(Button(*args))
              return button_sprites_group
          
          
          '''计算'''
          def calculate(number1, number2, operator):
              operator_map = {'+': '+', '-': '-', '×': '*', '÷': '/'}
              try:
                  result = str(eval(number1+operator_map[operator]+number2))
                  return result if '.' not in result else str(Fraction(number1+operator_map[operator]+number2))
              except:
                  return None
          
          
          '''在屏幕上显示信息'''
          def showInfo(text, screen):
              rect = pygame.Rect(200, 180, 400, 200)
              pygame.draw.rect(screen, PAPAYAWHIP, rect)
              font = pygame.font.Font(FONTPATH, 40)
              text_render = font.render(text, True, BLACK)
              font_size = font.size(text)
              screen.blit(text_render, (rect.x+(rect.width-font_size[0])/2, rect.y+(rect.height-font_size[1])/2))
          
          
          '''主函数'''
          def main():
              # 初始化, 导入必要的游戏素材
              pygame.init()
              pygame.mixer.init()
              screen = pygame.display.set_mode(SCREENSIZE)
              pygame.display.set_caption('24 point —— 九歌')
              win_sound = pygame.mixer.Sound(AUDIOWINPATH)
              lose_sound = pygame.mixer.Sound(AUDIOLOSEPATH)
              warn_sound = pygame.mixer.Sound(AUDIOWARNPATH)
              pygame.mixer.music.load(BGMPATH)
              pygame.mixer.music.play(-1, 0.0)
              # 24点游戏生成器
              game24_gen = game24Generator()
              game24_gen.generate()
              # 精灵组
              # --数字
              number_sprites_group = getNumberSpritesGroup(game24_gen.numbers_now)
              # --运算符
              operator_sprites_group = getOperatorSpritesGroup(OPREATORS)
              # --按钮
              button_sprites_group = getButtonSpritesGroup(BUTTONS)
              # 游戏主循环
              clock = pygame.time.Clock()
              selected_numbers = []
              selected_operators = []
              selected_buttons = []
              is_win = False
              while True:
                  for event in pygame.event.get():
                      if event.type == pygame.QUIT:
                          pygame.quit()
                          sys.exit(-1)
                      elif event.type == pygame.MOUSEBUTTONUP:
                          mouse_pos = pygame.mouse.get_pos()
                          selected_numbers = checkClicked(number_sprites_group, mouse_pos, 'NUMBER')
                          selected_operators = checkClicked(operator_sprites_group, mouse_pos, 'OPREATOR')
                          selected_buttons = checkClicked(button_sprites_group, mouse_pos, 'BUTTON')
                  screen.fill(AZURE)
                  # 更新数字
                  if len(selected_numbers) == 2 and len(selected_operators) == 1:
                      noselected_numbers = []
                      for each in number_sprites_group:
                          if each.is_selected:
                              if each.select_order == '1':
                                  selected_number1 = each.attribute
                              elif each.select_order == '2':
                                  selected_number2 = each.attribute
                              else:
                                  raise ValueError('Unknow select_order %s, expect 1 or 2...' % each.select_order)
                          else:
                              noselected_numbers.append(each.attribute)
                          each.is_selected = False
                      for each in operator_sprites_group:
                          each.is_selected = False
                      result = calculate(selected_number1, selected_number2, *selected_operators)
                      if result is not None:
                          game24_gen.numbers_now = noselected_numbers + [result]
                          is_win = game24_gen.check()
                          if is_win:
                              win_sound.play()
                          if not is_win and len(game24_gen.numbers_now) == 1:
                              lose_sound.play()
                      else:
                          warn_sound.play()
                      selected_numbers = []
                      selected_operators = []
                      number_sprites_group = getNumberSpritesGroup(game24_gen.numbers_now)
                  # 精灵都画到screen上
                  for each in number_sprites_group:
                      each.draw(screen, pygame.mouse.get_pos())
                  for each in operator_sprites_group:
                      each.draw(screen, pygame.mouse.get_pos())
                  for each in button_sprites_group:
                      if selected_buttons and selected_buttons[0] in ['RESET', 'NEXT']:
                          is_win = False
                      if selected_buttons and each.attribute == selected_buttons[0]:
                          each.is_selected = False
                          number_sprites_group = each.do(game24_gen, getNumberSpritesGroup, number_sprites_group, button_sprites_group)
                          selected_buttons = []
                      each.draw(screen, pygame.mouse.get_pos())
                  # 游戏胜利
                  if is_win:
                      showInfo('Congratulations', screen)
                  # 游戏失败
                  if not is_win and len(game24_gen.numbers_now) == 1:
                      showInfo('Game Over', screen)
                  pygame.display.flip()
                  clock.tick(30)
          
          
          '''run'''
          if __name__ == '__main__':
              main()
          
          • 1
          • 2
          • 3
          • 4
          • 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
            6、外星人入侵

            玩法:这让我想起了魂斗罗那第几关的boss,有点类似,不过魂斗罗那个难度肯定高点。

            源码分享:

            
            import os
            import sys
            import cfg
            import random
            import pygame
            from modules import *
            
            
            '''开始游戏'''
            def startGame(screen):
                clock = pygame.time.Clock()
                # 加载字体
                font = pygame.font.SysFont('arial', 18)
                if not os.path.isfile('score'):
                    f = open('score', 'w')
                    f.write('0')
                    f.close()
                with open('score', 'r') as f:
                    highest_score = int(f.read().strip())
                # 敌方
                enemies_group = pygame.sprite.Group()
                for i in range(55):
                    if i < 11:
                        enemy = enemySprite('small', i, cfg.WHITE, cfg.WHITE)
                    elif i < 33:
                        enemy = enemySprite('medium', i, cfg.WHITE, cfg.WHITE)
                    else:
                        enemy = enemySprite('large', i, cfg.WHITE, cfg.WHITE)
                    enemy.rect.x = 85 + (i % 11) * 50
                    enemy.rect.y = 120 + (i // 11) * 45
                    enemies_group.add(enemy)
                boomed_enemies_group = pygame.sprite.Group()
                en_bullets_group = pygame.sprite.Group()
                ufo = ufoSprite(color=cfg.RED)
                # 我方
                myaircraft = aircraftSprite(color=cfg.GREEN, bullet_color=cfg.WHITE)
                my_bullets_group = pygame.sprite.Group()
                # 用于控制敌方位置更新
                # --移动一行
                enemy_move_count = 24
                enemy_move_interval = 24
                enemy_move_flag = False
                # --改变移动方向(改变方向的同时集体下降一次)
                enemy_change_direction_count = 0
                enemy_change_direction_interval = 60
                enemy_need_down = False
                enemy_move_right = True
                enemy_need_move_row = 6
                enemy_max_row = 5
                # 用于控制敌方发射子弹
                enemy_shot_interval = 100
                enemy_shot_count = 0
                enemy_shot_flag = False
                # 游戏进行中
                running = True
                is_win = False
                # 主循环
                while running:
                    screen.fill(cfg.BLACK)
                    for event in pygame.event.get():
                        # --点右上角的X或者按Esc键退出游戏
                        if event.type == pygame.QUIT:
                            pygame.quit()
                            sys.exit()
                        if event.type == pygame.KEYDOWN:
                            if event.key == pygame.K_ESCAPE:
                                pygame.quit()
                                sys.exit()
                        # --射击
                        if event.type == pygame.MOUSEBUTTONDOWN:
                            my_bullet = myaircraft.shot()
                            if my_bullet:
                                my_bullets_group.add(my_bullet)
                    # --我方子弹与敌方/UFO碰撞检测
                    for enemy in enemies_group:
                        if pygame.sprite.spritecollide(enemy, my_bullets_group, True, None):
                            boomed_enemies_group.add(enemy)
                            enemies_group.remove(enemy)
                            myaircraft.score += enemy.reward
                    if pygame.sprite.spritecollide(ufo, my_bullets_group, True, None):
                        ufo.is_dead = True
                        myaircraft.score += ufo.reward
                    # --更新并画敌方
                    # ----敌方子弹
                    enemy_shot_count += 1
                    if enemy_shot_count > enemy_shot_interval:
                        enemy_shot_flag = True
                        enemies_survive_list = [enemy.number for enemy in enemies_group]
                        shot_number = random.choice(enemies_survive_list)
                        enemy_shot_count = 0
                    # ----敌方移动
                    enemy_move_count += 1
                    if enemy_move_count > enemy_move_interval:
                        enemy_move_count = 0
                        enemy_move_flag = True
                        enemy_need_move_row -= 1
                        if enemy_need_move_row == 0:
                            enemy_need_move_row = enemy_max_row
                        enemy_change_direction_count += 1
                        if enemy_change_direction_count > enemy_change_direction_interval:
                            enemy_change_direction_count = 1
                            enemy_move_right = not enemy_move_right
                            enemy_need_down = True
                            # ----每次下降提高移动和射击速度
                            enemy_move_interval = max(15, enemy_move_interval-3)
                            enemy_shot_interval = max(50, enemy_move_interval-10)
                    # ----遍历更新
                    for enemy in enemies_group:
                        if enemy_shot_flag:
                            if enemy.number == shot_number:
                                en_bullet = enemy.shot()
                                en_bullets_group.add(en_bullet)
                        if enemy_move_flag:
                            if enemy.number in range((enemy_need_move_row-1)*11, enemy_need_move_row*11):
                                if enemy_move_right:
                                    enemy.update('right', cfg.SCREENSIZE[1])
                                else:
                                    enemy.update('left', cfg.SCREENSIZE[1])
                        else:
                            enemy.update(None, cfg.SCREENSIZE[1])
                        if enemy_need_down:
                            if enemy.update('down', cfg.SCREENSIZE[1]):
                                running = False
                                is_win = False
                            enemy.change_count -= 1
                        enemy.draw(screen)
                    enemy_move_flag = False
                    enemy_need_down = False
                    enemy_shot_flag = False
                    # ----敌方爆炸特效
                    for boomed_enemy in boomed_enemies_group:
                        if boomed_enemy.boom(screen):
                            boomed_enemies_group.remove(boomed_enemy)
                            del boomed_enemy
                    # --敌方子弹与我方飞船碰撞检测
                    if not myaircraft.one_dead:
                        if pygame.sprite.spritecollide(myaircraft, en_bullets_group, True, None):
                            myaircraft.one_dead = True
                    if myaircraft.one_dead:
                        if myaircraft.boom(screen):
                            myaircraft.resetBoom()
                            myaircraft.num_life -= 1
                            if myaircraft.num_life < 1:
                                running = False
                                is_win = False
                    else:
                        # ----更新飞船
                        myaircraft.update(cfg.SCREENSIZE[0])
                        # ----画飞船
                        myaircraft.draw(screen)
                    if (not ufo.has_boomed) and (ufo.is_dead):
                        if ufo.boom(screen):
                            ufo.has_boomed = True
                    else:
                        # ----更新UFO
                        ufo.update(cfg.SCREENSIZE[0])
                        # ----画UFO
                        ufo.draw(screen)
                    # --画我方飞船子弹
                    for bullet in my_bullets_group:
                        if bullet.update():
                            my_bullets_group.remove(bullet)
                            del bullet
                        else:
                            bullet.draw(screen)
                    # --画敌方子弹
                    for bullet in en_bullets_group:
                        if bullet.update(cfg.SCREENSIZE[1]):
                            en_bullets_group.remove(bullet)
                            del bullet
                        else:
                            bullet.draw(screen)
                    if myaircraft.score > highest_score:
                        highest_score = myaircraft.score
                    # --得分每增加2000我方飞船增加一条生命
                    if (myaircraft.score % 2000 == 0) and (myaircraft.score > 0) and (myaircraft.score != myaircraft.old_score):
                        myaircraft.old_score = myaircraft.score
                        myaircraft.num_life = min(myaircraft.num_life + 1, myaircraft.max_num_life)
                    # --敌人都死光了的话就胜利了
                    if len(enemies_group) < 1:
                        is_win = True
                        running = False
                    # --显示文字
                    # ----当前得分
                    showText(screen, 'SCORE: ', cfg.WHITE, font, 200, 8)
                    showText(screen, str(myaircraft.score), cfg.WHITE, font, 200, 24)
                    # ----敌人数量
                    showText(screen, 'ENEMY: ', cfg.WHITE, font, 370, 8)
                    showText(screen, str(len(enemies_group)), cfg.WHITE, font, 370, 24)
                    # ----历史最高分
                    showText(screen, 'HIGHEST: ', cfg.WHITE, font, 540, 8)
                    showText(screen, str(highest_score), cfg.WHITE, font, 540, 24)
                    # ----FPS
                    showText(screen, 'FPS: ' + str(int(clock.get_fps())), cfg.RED, font, 8, 8)
                    # --显示剩余生命值
                    showLife(screen, myaircraft.num_life, cfg.GREEN)
                    pygame.display.update()
                    clock.tick(cfg.FPS)
                with open('score', 'w') as f:
                    f.write(str(highest_score))
                return is_win
            
            
            '''主函数'''
            def main():
                # 初始化
                pygame.init()
                pygame.display.set_caption('外星人入侵 —— 九歌')
                screen = pygame.display.set_mode(cfg.SCREENSIZE)
                pygame.mixer.init()
                pygame.mixer.music.load(cfg.BGMPATH)
                pygame.mixer.music.set_volume(0.4)
                pygame.mixer.music.play(-1)
                while True:
                    is_win = startGame(screen)
                    endInterface(screen, cfg.BLACK, is_win)
            
            
            '''run'''
            if __name__ == '__main__':
                main()
            
            • 1
            • 2
            • 3
            • 4
            • 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
            • 190
            • 191
            • 192
            • 193
            • 194
            • 195
            • 196
            • 197
            • 198
            • 199
            • 200
            • 201
            • 202
            • 203
            • 204
            • 205
            • 206
            • 207
            • 208
            • 209
            • 210
            • 211
            • 212
            • 213
            • 214
            • 215
            • 216
            • 217
            • 218
            • 219
            • 220
            • 221
            • 222

              想要学习交流,获取学习资料请扫一扫!
              在这里插入图片描述

              声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
              推荐阅读
              相关标签
                

              闽ICP备14008679号