阅读 92

Python完美还原超级玛丽游戏附代码与视频

读万卷书不如行万里路,只学书上的理论是远远不够的,只有在实战中才能获得能力的提升,本篇文章手把手带你用Python实现超级玛丽,90后的回忆老游戏,快来看戴帽子的大胡子穿着背带裤的马里奥

目录
  • 导语????

  • 正文????

    • 1)准备中????

      • 1.1环境安装????

      • 1.2图片素材+背景音乐+字体(可修改)????

    • 2)开始敲代码????

      • 2.1 运行程序:mario_level_1.py。????

      • 2.2 配置音乐文字等setup.py。????

      • 2.3游戏音乐设置game_sound.py。????

      • 2.4取得的分数????

    • 3)完整的游戏????

      • 4)效果展示(仅部分)????

        • 4.1 展示动态视频一波,完美。????

        • 4.2 Part 1 游戏运行界面——????

        • 4.3 Part 2 三条命——????

        • 4.4 Part 3 吃了蘑菇的马里奥——????

    • 总结????

      导语????

      哈喽!哈喽!我是木木子????,今日游戏更新——超级玛丽华丽上线????啦!

      “超级玛丽”有多少人还记得这款经典游戏?对于90、00后应该不大熟悉,但多多少少印象中见过

      那个戴帽子的大胡子穿着背带裤的马里奥????!

      图片

      ????这款游戏1985年发售,因上手简单、情节有趣等因素迅速走红!

      图片

      陪伴70后、80后走过了青涩难忘的童年超级玛丽成了大家心目中的经典!

      如果你的童年也曾被魔性的 灯~灯灯~灯~灯灯~灯洗脑那就接着来怀旧一番吧~

      今天木木子就带着大家自制一款超级玛丽游戏,还原度超高哦~还在等什么动动手就能拥有属于自

      己的”超级玛丽“游戏呢,赶快学起来吧????????‍????‍????????~

      正文????

      嗯呐~写游戏Python还是用的Pygame模块啦

      1)准备中????

      1.1环境安装????

      Python3、Pycharm、Pygame模块很多自带的模块等。

      模块安装统一用的豆瓣镜像源:

      1
      pip install -i https://pypi.douban.com/simple/ +模块名。

      1.2图片素材+背景音乐+字体(可修改)????

      2)开始敲代码????

      2.1 运行程序:mario_level_1.py。????

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      #!/usr/bin/env python
      __author__ = '超级玛丽-源码基地'
        
      """
      This is an attempt to recreate the first level of
      Super Mario Bros for the NES.
      """
        
      import sys
      import pygame as pg
      from data.main import main
      import cProfile
        
        
      if __name__=='__main__':
          main()
          pg.quit()
          sys.exit()

      2.2 配置音乐文字等setup.py。????

      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
      __author__ = 'Python源码基地'
        
      """
      This module initializes the display and creates dictionaries of resources.
      """
        
      import os
      import pygame as pg
      from . import tools
      from .import constants as c
        
      ORIGINAL_CAPTION = c.ORIGINAL_CAPTION
        
        
      os.environ['SDL_VIDEO_CENTERED'] = '1'
      pg.init()
      pg.event.set_allowed([pg.KEYDOWN, pg.KEYUP, pg.QUIT])
      pg.display.set_caption(c.ORIGINAL_CAPTION)
      SCREEN = pg.display.set_mode(c.SCREEN_SIZE)
      SCREEN_RECT = SCREEN.get_rect()
        
        
      FONTS = tools.load_all_fonts(os.path.join("resources","fonts"))
      MUSIC = tools.load_all_music(os.path.join("resources","music"))
      GFX   = tools.load_all_gfx(os.path.join("resources","graphics"))
      SFX   = tools.load_all_sfx(os.path.join("resources","sound"))


      2.3游戏音乐设置game_sound.py。????

      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
      __author__ = 'Python顾木子吖'
        
      import pygame as pg
      from . import setup
      from . import constants as c
        
      class Sound(object):
          """Handles all sound for the game"""
          def __init__(self, overhead_info):
              """Initialize the class"""
              self.sfx_dict = setup.SFX
              self.music_dict = setup.MUSIC
              self.overhead_info = overhead_info
              self.game_info = overhead_info.game_info
              self.set_music_mixer()
        
        
        
          def set_music_mixer(self):
              """Sets music for level"""
              if self.overhead_info.state == c.LEVEL:
                  pg.mixer.music.load(self.music_dict['main_theme'])
                  pg.mixer.music.play()
                  self.state = c.NORMAL
              elif self.overhead_info.state == c.GAME_OVER:
                  pg.mixer.music.load(self.music_dict['game_over'])
                  pg.mixer.music.play()
                  self.state = c.GAME_OVER
        
        
          def update(self, game_info, mario):
              """Updates sound object with game info"""
              self.game_info = game_info
              self.mario = mario
              self.handle_state()
        
          def  handle_state(self):
              """Handles the state of the soundn object"""
              if self.state == c.NORMAL:
                  if self.mario.dead:
                      self.play_music('death', c.MARIO_DEAD)
                  elif self.mario.invincible \
                          and self.mario.losing_invincibility == False:
                      self.play_music('invincible', c.MARIO_INVINCIBLE)
                  elif self.mario.state == c.FLAGPOLE:
                      self.play_music('flagpole', c.FLAGPOLE)
                  elif self.overhead_info.time == 100:
                      self.play_music('out_of_time', c.TIME_WARNING)
        
        
              elif self.state == c.FLAGPOLE:
                  if self.mario.state == c.WALKING_TO_CASTLE:
                      self.play_music('stage_clear', c.STAGE_CLEAR)
        
              elif self.state == c.STAGE_CLEAR:
                  if self.mario.in_castle:
                      self.sfx_dict['count_down'].play()
                      self.state = c.FAST_COUNT_DOWN
        
              elif self.state == c.FAST_COUNT_DOWN:
                  if self.overhead_info.time == 0:
                      self.sfx_dict['count_down'].stop()
                      self.state = c.WORLD_CLEAR
        
              elif self.state == c. TIME_WARNING:
                  if pg.mixer.music.get_busy() == 0:
                      self.play_music('main_theme_sped_up', c.SPED_UP_NORMAL)
                  elif self.mario.dead:
                      self.play_music('death', c.MARIO_DEAD)
        
              elif self.state == c.SPED_UP_NORMAL:
                  if self.mario.dead:
                      self.play_music('death', c.MARIO_DEAD)
                  elif self.mario.state == c.FLAGPOLE:
                      self.play_music('flagpole', c.FLAGPOLE)
        
              elif self.state == c.MARIO_INVINCIBLE:
                  if (self.mario.current_time - self.mario.invincible_start_timer) > 11000:
                      self.play_music('main_theme', c.NORMAL)
                  elif self.mario.dead:
                      self.play_music('death', c.MARIO_DEAD)
        
        
              elif self.state == c.WORLD_CLEAR:
                  pass
              elif self.state == c.MARIO_DEAD:
                  pass
              elif self.state == c.GAME_OVER:
                  pass
        
          def play_music(self, key, state):
              """Plays new music"""
              pg.mixer.music.load(self.music_dict[key])
              pg.mixer.music.play()
              self.state = state
        
          def stop_music(self):
              """Stops playback"""
              pg.mixer.music.stop()

      2.4取得的分数????

      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
      __author__ = '源码基地:#959755565#'
        
      import pygame as pg
      from .. import setup
      from .. import constants as c
        
        
      class Digit(pg.sprite.Sprite):
          """Individual digit for score"""
          def __init__(self, image):
              super(Digit, self).__init__()
              self.image = image
              self.rect = image.get_rect()
        
        
      class Score(object):
          """Scores that appear, float up, and disappear"""
          def __init__(self, x, y, score, flag_pole=False):
              self.x = x
              self.y = y
              if flag_pole:
                  self.y_vel = -4
              else:
                  self.y_vel = -3
              self.sprite_sheet = setup.GFX['item_objects']
              self.create_image_dict()
              self.score_string = str(score)
              self.create_digit_list()
              self.flag_pole_score = flag_pole
        
        
          def create_image_dict(self):
              """Creates the dictionary for all the number 图片 needed"""
              self.image_dict = {}
        
              image0 = self.get_image(1, 168, 3, 8)
              image1 = self.get_image(5, 168, 3, 8)
              image2 = self.get_image(8, 168, 4, 8)
              image4 = self.get_image(12, 168, 4, 8)
              image5 = self.get_image(16, 168, 5, 8)
              image8 = self.get_image(20, 168, 4, 8)
              image9 = self.get_image(32, 168, 5, 8)
              image10 = self.get_image(37, 168, 6, 8)
              image11 = self.get_image(43, 168, 5, 8)
        
              self.image_dict['0'] = image0
              self.image_dict['1'] = image1
              self.image_dict['2'] = image2
              self.image_dict['4'] = image4
              self.image_dict['5'] = image5
              self.image_dict['8'] = image8
              self.image_dict['3'] = image9
              self.image_dict['7'] = image10
              self.image_dict['9'] = image11
        
        
          def get_image(self, x, y, width, height):
              """Extracts image from sprite sheet"""
              image = pg.Surface([width, height]).convert()
              rect = image.get_rect()
        
              image.blit(self.sprite_sheet, (0, 0), (x, y, width, height))
              image.set_colorkey(c.BLACK)
              image = pg.transform.scale(image,
                                         (int(rect.width*c.BRICK_SIZE_MULTIPLIER),
                                          int(rect.height*c.BRICK_SIZE_MULTIPLIER)))
              return image
        
        
          def create_digit_list(self):
              """Creates the group of 图片 based on score received"""
              self.digit_list = []
              self.digit_group = pg.sprite.Group()
        
              for digit in self.score_string:
                  self.digit_list.append(Digit(self.image_dict[digit]))
        
              self.set_rects_for_images()
        
        
          def set_rects_for_images(self):
              """Set the rect attributes for each image in self.image_list"""
              for i, digit in enumerate(self.digit_list):
                  digit.rect = digit.image.get_rect()
                  digit.rect.x = self.x + (i * 10)
                  digit.rect.y = self.y
        
        
          def update(self, score_list, level_info):
              """Updates score movement"""
              for number in self.digit_list:
                  number.rect.y += self.y_vel
        
              if score_list:
                  self.check_to_delete_floating_scores(score_list, level_info)
        
              if self.flag_pole_score:
                  if self.digit_list[0].rect.y <= 120:
                      self.y_vel = 0
        
        
          def draw(self, screen):
              """Draws score numbers onto screen"""
              for digit in self.digit_list:
                  screen.blit(digit.image, digit.rect)
        
        
          def check_to_delete_floating_scores(self, score_list, level_info):
              """Check if scores need to be deleted"""
              for i, score in enumerate(score_list):
                  if int(score.score_string) == 1000:
                      if (score.y - score.digit_list[0].rect.y) > 130:
                          score_list.pop(i)
        
                  else:
                      if (score.y - score.digit_list[0].rect.y) > 75:
                          score_list.pop(i)

      3)完整的游戏????

      由于代码太多太多了如下图所示:所以还是放在文末自己拿完整的代码哈!

      4)效果展示(仅部分)????

      4.1 展示动态视频一波,完美。????


      超级马里奥动态视频

      4.2 Part 1 游戏运行界面——????

      4.3 Part 2 三条命——????

      4.4 Part 3 吃了蘑菇的马里奥——????

      总结????

      虽然现在市面上冲击着各种游戏,但在我们心目中马里奥依旧是那个留着意式大胡子,上天盾地,

      无所不能,头顶金币,脚踏乌龟拯救公主的超级英雄!

      对游戏感兴趣的小伙伴儿赶紧自己动手造一个吧~

      图片

      你们的支持是我最大的动力!!记得三连哦~mua 欢迎大家阅读往期的文章哦~

      关注小编获取更多精彩内容!

      到此这篇关于Python完美还原超级玛丽游戏附代码与视频的文章就介绍到这了


      原文链接:https://blog.csdn.net/weixin_55822277/article/details/120846031


      文章分类
      版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
      相关推荐