简单用 python 整一个 超级玛丽 小游戏 | 内附源码

简介

在你的童年记忆里,是否有一个蹦跳、顶蘑菇的小人已经被遗忘?
如果你回忆起了它,你定然会觉得现在它幼稚、无聊,画面不漂亮,游戏不精彩……但请你记住:这才是真正的游戏,它给了你无限的欢乐!许多人只玩过红白机或者网上玩家自己制作的几个破Flash小游戏就还以为任天堂所骄傲的“马里奥”系列就这样子的,你们真的以为超级马里奥就是1985年的“踩蘑菇/采蘑菇”么?

相关文件

小伙伴们可以关注小编的Python源码、问题解答&学习交流群:733089476
有很多的资源可以白嫖的哈,需要源码的小伙伴可以在+君羊领取

游戏规则

控制马里奥大叔消灭敌人,收集金币,突破障碍在有限的时间内快速到达目的地

开发环境

Python版本:3.7.8
相关模块:
pygame模块;
tools模块;
setup模块;
constants模块;
以及一些python自带的模块。

环境搭建

安装Python并添加到环境变量,pip安装需要的相关模块即可。

效果展示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码实现

main_menu

#python编程小知识教学,入门到精通视频+源码+课件+学习解答加群:733089476

__author__ = 'marble_xu'

import pygame as pg
from .. import tools
from .. import setup
from .. import constants as c
from .. components import info

class Menu(tools.State):
    def __init__(self):
        tools.State.__init__(self)
        persist = {
   c.COIN_TOTAL: 0,
                   c.SCORE: 0,
                   c.LIVES: 3,
                   c.TOP_SCORE: 0,
                   c.CURRENT_TIME: 0.0,
                   c.LEVEL_NUM: 1,
                   c.PLAYER_NAME: c.PLAYER_MARIO}
        self.startup(0.0, persist)
    
    def startup(self, current_time, persist):
        self.next = c.LOAD_SCREEN
        self.persist = persist
        self.game_info = persist
        self.overhead_info = info.Info(self.game_info, c.MAIN_MENU)

        self.setup_background()
        self.setup_player()
        self.setup_cursor()
        
    def setup_background(self):
        self.background = setup.GFX['level_1']
        self.background_rect = self.background.get_rect()
        self.background = pg.transform.scale(self.background,
                                    (int(self.background_rect.width*c.BACKGROUND_MULTIPLER),
                                    int(self.background_rect.height*c.BACKGROUND_MULTIPLER)))

        self.viewport = setup.SCREEN.get_rect(bottom=setup.SCREEN_RECT.bottom)
        self.image_dict = {
   }
        image = tools.get_image(setup.GFX['title_screen'], 1, 60, 176, 88,
                            (255, 0, 220), c.SIZE_MULTIPLIER)
        rect = image.get_rect()
        rect.x, rect.y = (170, 100)
        self.image_dict['GAME_NAME_BOX'] = (image, rect)

    def setup_player(self):
        self.player_list = []
        player_rect_info = [(178, 32, 12, 16), (178, 128, 12, 16)]
        for rect in player_rect_info:
            image = tools.get_image(setup.GFX['mario_bros'],
                                *rect, c.BLACK, 2.9)
            rect = image.get_rect()
            rect.x, rect.bottom = 110, c.GROUND_HEIGHT
            self.player_list.append((image, rect))
        self.player_index = 0

    def setup_cursor(self):
        self.cursor = pg.sprite.Sprite()
        self.cursor.image = tools.get_image(setup.GFX[c.ITEM_SHEET], 24, 160, 8, 8, c.BLACK, 3)
        rect = self.cursor.image.get_rect()
        rect.x, rect.y = (220, 358)
        self.cursor.rect = rect
        self.cursor.state = c.PLAYER1

    def update(self, surface, keys, current_time):
        self.current_time = current_time
        self.game_info[c.CURRENT_TIME] = self.current_time
        self.player_image = self.player_list[self.player_index][0]
        self.player_rect = self.player_list[self.player_index][1]
        self.update_cursor(keys)
        self.overhead_info.update(self.game_info)

        surface.blit(self.background, self.viewport, self.viewport)
        surface.blit(self.image_dict['GAME_NAME_BOX'][0],
                     self.image_dict['GAME_NAME_BOX'][1])
        surface.blit(self.player_image, self.player_rect)
        surface.blit(self.cursor.image, self.cursor.rect)
        self.overhead_info.draw(surface)

    def update_cursor(self, keys):
        if self.cursor.state == c.PLAYER1:
            self.cursor.rect.y = 358
            if keys[pg.K_DOWN]:
                self.cursor.state = c.PLAYER2
                self.player_index = 1
                self.game_info[c.PLAYER_NAME] = c.PLAYER_LUIGI
        elif self.cursor.state == c.PLAYER2:
            self.cursor.rect.y = 403
            if keys[pg.K_UP]:
                self.cursor.state = c.PLAYER1
                self.player_index = 0
                self.game_info[c.PLAYER_NAME] = c.PLAYER_MARIO
        if keys[pg.K_RETURN]:
            self.reset_game_info()
            self.done = True
    
    def reset_game_info(self):
        self.game_info[c.COIN_TOTAL] = 0
        self.game_info[c.SCORE] = 0
        self.game_info[c.LIVES] = 3
        self.game_info[c.CURRENT_TIME] = 0.0
        self.game_info[c.LEVEL_NUM] = 1
        
        self.persist = self.game_info

load_screen

#python编程小知识教学,入门到精通视频+源码+课件+学习解答加群:733089476

__author__ = 'marble_xu'

from .. import setup, tools
from .. import constants as c
from ..components import info

class LoadScreen(tools.State):
    def __init__(self):
        tools.State.__init__(self)
        self.time_list = [2400, 2600, 2635]
        
    def startup(self, current_time, persist):
        self.start_time = current_time
        self.persist = persist
        self.game_info = self.persist
        self.next = self.set_next_state()
        
        info_state = self.set_info_state()
        self.overhead_info = info.Info(self.game_info, info_state)
    
    def set_next_state(self):
        return c.LEVEL
    
    def set_info_state(self):
        return c.LOAD_SCREEN

    def update(self, surface, keys, current_time):
        if (current_time - self.start_time) < self.time_list[0]:
            surface.fill(c.BLACK)
            self.overhead_info.update(self.game_info)
            self.overhead_info.draw(surface)
        elif (current_time - self.start_time) < self.time_list[1]:
            surface.fill(c.BLACK)
        elif (current_time - self.start_time) < self.time_list[2]:
            surface.fill((106, 150, 252))
        else:
            self.done = True
            
class GameOver(LoadScreen):
    def __init__(self):
        LoadScreen.__init__(self)
        self.time_list = [3000, 3200, 3235]

    def set_next_state(self):
        return c.MAIN_MENU
    
    def set_info_state(self):
        return c.GAME_OVER

class TimeOut(LoadScreen):
    def __init__
  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 22
    评论
为了用 Python 写一个超级玛丽小游戏,我们需要使用 pygame 库来创建游戏窗口并加载图片。以下是实现这个小游戏的一些步骤: 1. 导入 pygame 库并初始化 ```python import pygame pygame.init() ``` 2. 设置游戏窗口大小和标题 ```python screen = pygame.display.set_mode((640, 480)) pygame.display.set_caption("超级玛丽") ``` 3. 加载背景图片和角色图片 ```python background_image = pygame.image.load("background.png").convert() player_image = pygame.image.load("player.png").convert_alpha() ``` 4. 在游戏窗口中显示背景图片和角色图片 ```python screen.blit(background_image, (0, 0)) screen.blit(player_image, (x, y)) pygame.display.update() ``` 5. 处理用户输入事件 ```python for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() ``` 6. 让角色移动 ```python keys = pygame.key.get_pressed() if keys[pygame.K_LEFT]: x -= speed if keys[pygame.K_RIGHT]: x += speed if keys[pygame.K_UP]: y -= speed if keys[pygame.K_DOWN]: y += speed ``` 7. 添加碰撞检测 ```python player_rect = player_image.get_rect() player_rect.x = x player_rect.y = y if player_rect.colliderect(enemy_rect): print("Game Over") ``` 完整代码如下所示: ```python import pygame import sys pygame.init() screen = pygame.display.set_mode((640, 480)) pygame.display.set_caption("超级玛丽") background_image = pygame.image.load("background.png").convert() player_image = pygame.image.load("player.png").convert_alpha() x = 0 y = 0 speed = 5 while True: screen.blit(background_image, (0, 0)) screen.blit(player_image, (x, y)) pygame.display.update() for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() keys = pygame.key.get_pressed() if keys[pygame.K_LEFT]: x -= speed if keys[pygame.K_RIGHT]: x += speed if keys[pygame.K_UP]: y -= speed if keys[pygame.K_DOWN]: y += speed player_rect = player_image.get_rect() player_rect.x = x player_rect.y = y enemy_rect = enemy_image.get_rect() enemy_rect.x = enemy_x enemy_rect.y = enemy_y if player_rect.colliderect(enemy_rect): print("Game Over") ```
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值