Python代码,能玩30多款童年游戏!这些有几个是你玩过的

发表于:2021-5-24 09:39

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:程序猿中的BUG    来源:CSDN

  大游戏小游戏有千千万万,这些小游戏应该只有90后才玩过和懂吧!
  儿童节即将到来,虽然秃头程序员没有头发,但是童心还是一直都在的,今天就分享一些私藏的童年游戏,十几行代码就能进入使用Python开发的小游戏快乐玩耍!?
  使用工具:
  Python3.8、pycharm2020
  也可以不安装pycharm2020也可以直接运行~但是安装了些会好一点
  1.五子棋
  源码:
  '''游戏开始界面'''
  class gameStartUI(QWidget):
      def __init__(self, parent=None, **kwargs):
          super(gameStartUI, self).__init__(parent)
          self.setFixedSize(760, 650)
          self.setWindowTitle('五子棋 —— 九歌')
          self.setWindowIcon(QIcon(cfg.ICON_FILEPATH))
          # 背景图片
          palette = QPalette()
          palette.setBrush(self.backgroundRole(), QBrush(QPixmap(cfg.BACKGROUND_IMAGEPATHS.get('bg_start'))))
          self.setPalette(palette)
          # 按钮
          # --人机对战
          self.ai_button = PushButton(cfg.BUTTON_IMAGEPATHS.get('ai'), self)
          self.ai_button.move(250, 200)
          self.ai_button.show()
          self.ai_button.click_signal.connect(self.playWithAI)
          # --联机对战
          self.online_button = PushButton(cfg.BUTTON_IMAGEPATHS.get('online'), self)
          self.online_button.move(250, 350)
          self.online_button.show()
          self.online_button.click_signal.connect(self.playOnline)
      '''人机对战'''
      def playWithAI(self):
          self.close()
          self.gaming_ui = playWithAIUI(cfg)
          self.gaming_ui.exit_signal.connect(lambda: sys.exit())
          self.gaming_ui.back_signal.connect(self.show)
          self.gaming_ui.show()
      '''联机对战'''
      def playOnline(self):
          self.close()
          self.gaming_ui = playOnlineUI(cfg, self)
          self.gaming_ui.show()
   
   
  '''run'''
  if __name__ == '__main__':
      app = QApplication(sys.argv)
      handle = gameStartUI()
      font = QFont()
      font.setPointSize(12)
      handle.setFont(font)
      handle.show()
      sys.exit(app.exec_())
  2.炸弹人
  源码:
  '''游戏主程序'''
  def main(cfg):
      # 初始化
      pygame.init()
      pygame.mixer.init()
      pygame.mixer.music.load(cfg.BGMPATH)
      pygame.mixer.music.play(-1, 0.0)
      screen = pygame.display.set_mode(cfg.SCREENSIZE)
      pygame.display.set_caption('Bomber Man —— 九歌')
      # 开始界面
      Interface(screen, cfg, mode='game_start')
      # 游戏主循环
      font = pygame.font.SysFont('Consolas', 15)
      for gamemap_path in cfg.GAMEMAPPATHS:
          # -地图
          map_parser = mapParser(gamemap_path, bg_paths=cfg.BACKGROUNDPATHS, wall_paths=cfg.WALLPATHS, blocksize=cfg.BLOCKSIZE)
          # -水果
          fruit_sprite_group = pygame.sprite.Group()
          used_spaces = []
          for i in range(5):
              coordinate = map_parser.randomGetSpace(used_spaces)
              used_spaces.append(coordinate)
              fruit_sprite_group.add(Fruit(random.choice(cfg.FRUITPATHS), coordinate=coordinate, blocksize=cfg.BLOCKSIZE))
          # -我方Hero
          coordinate = map_parser.randomGetSpace(used_spaces)
          used_spaces.append(coordinate)
          ourhero = Hero(imagepaths=cfg.HEROZELDAPATHS, coordinate=coordinate, blocksize=cfg.BLOCKSIZE, map_parser=map_parser, hero_name='ZELDA')
          # -电脑Hero
          aihero_sprite_group = pygame.sprite.Group()
          coordinate = map_parser.randomGetSpace(used_spaces)
          aihero_sprite_group.add(Hero(imagepaths=cfg.HEROBATMANPATHS, coordinate=coordinate, blocksize=cfg.BLOCKSIZE, map_parser=map_parser, hero_name='BATMAN'))
          used_spaces.append(coordinate)
          coordinate = map_parser.randomGetSpace(used_spaces)
          aihero_sprite_group.add(Hero(imagepaths=cfg.HERODKPATHS, coordinate=coordinate, blocksize=cfg.BLOCKSIZE, map_parser=map_parser, hero_name='DK'))
          used_spaces.append(coordinate)
          # -炸弹bomb
          bomb_sprite_group = pygame.sprite.Group()
          # -用于判断游戏胜利或者失败的flag
          is_win_flag = False
          # -主循环
          screen = pygame.display.set_mode(map_parser.screen_size)
          clock = pygame.time.Clock()
          while True:
              dt = clock.tick(cfg.FPS)
              for event in pygame.event.get():
                  if event.type == pygame.QUIT:
                      pygame.quit()
                      sys.exit(-1)
                  # --↑↓←→键控制上下左右, 空格键丢炸弹
                  elif event.type == pygame.KEYDOWN:
                      if event.key == pygame.K_UP:
                          ourhero.move('up')
                      elif event.key == pygame.K_DOWN:
                          ourhero.move('down')
                      elif event.key == pygame.K_LEFT:
                          ourhero.move('left')
                      elif event.key == pygame.K_RIGHT:
                          ourhero.move('right')
                      elif event.key == pygame.K_SPACE:
                          if ourhero.bomb_cooling_count <= 0:
                              bomb_sprite_group.add(ourhero.generateBomb(imagepath=cfg.BOMBPATH, digitalcolor=cfg.YELLOW, explode_imagepath=cfg.FIREPATH))
              screen.fill(cfg.WHITE)
              # --电脑Hero随机行动
              for hero in aihero_sprite_group:
                  action, flag = hero.randomAction(dt)
                  if flag and action == 'dropbomb':
                      bomb_sprite_group.add(hero.generateBomb(imagepath=cfg.BOMBPATH, digitalcolor=cfg.YELLOW, explode_imagepath=cfg.FIREPATH))
              # --吃到水果加生命值(只要是Hero, 都能加)
              ourhero.eatFruit(fruit_sprite_group)
              for hero in aihero_sprite_group:
                  hero.eatFruit(fruit_sprite_group)
              # --游戏元素都绑定到屏幕上
              map_parser.draw(screen)
              for bomb in bomb_sprite_group:
                  if not bomb.is_being:
                      bomb_sprite_group.remove(bomb)
                  explode_area = bomb.draw(screen, dt, map_parser)
                  if explode_area:
                      # --爆炸火焰范围内的Hero生命值将持续下降
                      if ourhero.coordinate in explode_area:
                          ourhero.health_value -= bomb.harm_value
                      for hero in aihero_sprite_group:
                          if hero.coordinate in explode_area:
                              hero.health_value -= bomb.harm_value
              fruit_sprite_group.draw(screen)
              for hero in aihero_sprite_group:
                  hero.draw(screen, dt)
              ourhero.draw(screen, dt)
              # --左上角显示生命值
              pos_x = showText(screen, font, text=ourhero.hero_name+'(our):'+str(ourhero.health_value), color=cfg.YELLOW, position=[5, 5])
              for hero in aihero_sprite_group:
                  pos_x, pos_y = pos_x+15, 5
                  pos_x = showText(screen, font, text=hero.hero_name+'(ai):'+str(hero.health_value), color=cfg.YELLOW, position=[pos_x, pos_y])
              # --我方玩家生命值小于等于0/电脑方玩家生命值均小于等于0则判断游戏结束
              if ourhero.health_value <= 0:
                  is_win_flag = False
                  break
              for hero in aihero_sprite_group:
                  if hero.health_value <= 0:
                      aihero_sprite_group.remove(hero)
              if len(aihero_sprite_group) == 0:
                  is_win_flag = True
                  break
              pygame.display.update()
              clock.tick(cfg.FPS)
          if is_win_flag:
              Interface(screen, cfg, mode='game_switch')
          else:
              break
      Interface(screen, cfg, mode='game_end')
   
   
  '''run'''
  if __name__ == '__main__':
      while True:
          main(cfg)
  3.推箱子
  源码:
  '''开始游戏'''
  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()
  4.扫雷
  上学时恨不得一直待在电脑房玩这个游戏,哈哈哈!

  上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号