程序员自制游戏:超级玛丽100%真实版,能把你玩哭了!「附源码」(自创一个超级英雄)

导语

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

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

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


​​

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


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

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

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

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


正文

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

1)准备中1.1环境安装

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

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

pip install -i https://pypi.douban.com/simple/ +模块名。
1.2图片素材+背景音乐+字体(可修改)

2)开始敲代码2.1 运行程序:mario_level_1.py。
#!/usr/bin/env python__author__ = '超级玛丽-源码基地:#959755565#'"""This is an attempt to recreate the first level ofSuper Mario Bros for the NES."""import sysimport pygame as pgfrom data.main import mainimport cProfileif __name__=='__main__':    main()    pg.quit()    sys.exit()
2.2 配置音乐文字等setup.py。
__author__ = 'Python源码基地:#959755565#人'"""This module initializes the display and creates dictionaries of resources."""import osimport pygame as pgfrom . import toolsfrom .import constants as cORIGINAL_CAPTION = c.ORIGINAL_CAPTIONos.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。
__author__ = 'Python源码基地:#959755565#'import pygame as pgfrom . import setupfrom . import constants as cclass 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取得的分数
__author__ = '源码基地:#959755565#'import pygame as pgfrom .. import setupfrom .. import constants as cclass 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.0 展示动态视频一波,完美。

超级马里奥动态视频

4.1 Part 1 游戏运行界面——

​4.2 Part 2 三条命——

4.3 Part 3 吃了蘑菇的马里奥——

总结

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

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

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


​​

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

关注小编获取更多精彩内容!私信小编06获取源码吖!

​​

做自己的超级英雄

新华社河北崇礼2月10日电题:做自己的英雄

新华社记者夏亮、朱青、陈地、李琳海

12年,四届冬奥会,时光在一次次腾空、翻转中流逝。31岁的徐梦桃、30岁的贾宗洋、31岁的齐广璞,在北京冬奥会上遗憾与金牌擦肩而过。

赛后,出现失误的贾宗洋红着双眼,哽咽着喃喃地说道:“我选择的是我最有把握的动作,这四年来我每一天都在练它,但落地那一刻,我不知道,为什么就控制不住了,我不知道……”

眼看着贾宗洋失误自责,徐梦桃冲上去抱住了他。她后来说:“因为我们知道,这一刻他一定比我们更难过。我们是队友,我们在一起为梦想奋斗了那么多年,不会因为一个(落地不稳的)前空翻就否认他的优秀。”

任何人都无法否认三位老将的优秀。四战奥运,他们已经是自己的英雄!

星光不问赶路人,这是一段有关传承的旅程。

空中技巧一直以来都是中国队在雪上项目中的强项。自徐囡囡1998年长野冬奥会摘得银牌以来,中国队在冬奥会上累计斩获1金6银4铜。2006年都灵冬奥会韩晓鹏一举问鼎,更实现了中国队在冬奥会雪上项目金牌“零”的突破。

此后,一代又一代空中技巧人不断向冬奥会最高领奖台发起冲击,但无论是李妮娜、徐梦桃、贾宗洋还是张鑫,都与金牌失之交臂。从初登冬奥赛场到第四次出征,徐梦桃、贾宗洋和齐广璞身边的队友换了又换。他们也曾有过放弃的念头,但最终还是握着前辈们手里接过来的火炬,继续前行。

即使遍体鳞伤,也不曾失去再战的勇气,这也是一段有关坚守的旅程。

在灯光中凌空飞跃,翻转腾挪,空中技巧比赛那些优美炫丽又惊心动魄的画面背后,伴随着运动员的汗水与泪水,老将的坚守尤为不易。平昌冬奥会结束后,徐梦桃两个膝关节都做了手术。一向脸上挂满笑容的徐梦桃,双腿早已伤痕累累。

贾宗洋也曾遭遇重大伤病,双腿植入22颗钢钉让他成了人们口中的“钢铁侠”。但他没有退缩,而是与伤病整整斗争了三年,如今能站上赛场已是奇迹。

三次冲击冬奥会领奖台未果的齐广璞,心灰意冷一度选择了退役,但终究敌不过内心的召唤,复出继续战斗。

千淘万漉虽辛苦,吹尽狂沙始到金,这依然是一段有关收获的旅程。

备战北京冬奥周期,受疫情影响,中国空中技巧队阔别国际赛场近22个月。在本赛季世界杯仅有的两站混合团体比赛中,徐梦桃领衔的中国队全部夺冠。徐梦桃还以27个分站赛冠军成为该项目的世界杯第一人。

不以成败论英雄。况且对于他们来说,北京冬奥会还没有结束。徐梦桃在赛后发布会上宣告:“后面我们都还有个人比赛,我们要争取突出重围,我们还有机会!”

无论结果如何,在为梦想奋斗的路上,每个人都是自己的英雄!(完)