相关文件

想学Python的小伙伴可以关注小编的公众号【Python日志】
有很多的资源可以白嫖的哈,不定时会更新一下Python的小知识的哈!!

需要源码的小伙伴可以在公众号回复超级玛丽
Python源码、问题解答学习交流群:773162165

开发环境

Python版本:3.7.8
相关模块:
requests模块;
tqdm模块;
pyfreeproxy模块;
pyecharts模块;
以及一些python自带的模块。

环境搭建

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

效果展示

开始界面
是可以用按 ↑ ↓ 控制我们需要选择游戏玩家个数,按回车键可以开始游戏


开始游戏
按← →控制人物的前进后退,按a进行跳跃,是发射子弹

代码实现

因为代码过长,所以只展示一部分代码,源码的获取可以看相关文件

main_menu

__author__ = 'marble_xu'import pygame as pg
from .. import tools
from .. import setup
from .. import constants as c
from .. components import infoclass 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_SCREENself.persist = persistself.game_info = persistself.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_HEIGHTself.player_list.append((image, rect))self.player_index = 0def 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 = rectself.cursor.state = c.PLAYER1def update(self, surface, keys, current_time):self.current_time = current_timeself.game_info[c.CURRENT_TIME] = self.current_timeself.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 = 358if keys[pg.K_DOWN]:self.cursor.state = c.PLAYER2self.player_index = 1self.game_info[c.PLAYER_NAME] = c.PLAYER_LUIGIelif self.cursor.state == c.PLAYER2:self.cursor.rect.y = 403if keys[pg.K_UP]:self.cursor.state = c.PLAYER1self.player_index = 0self.game_info[c.PLAYER_NAME] = c.PLAYER_MARIOif keys[pg.K_RETURN]:self.reset_game_info()self.done = Truedef reset_game_info(self):self.game_info[c.COIN_TOTAL] = 0self.game_info[c.SCORE] = 0self.game_info[c.LIVES] = 3self.game_info[c.CURRENT_TIME] = 0.0self.game_info[c.LEVEL_NUM] = 1self.persist = self.game_info

load_screen

#公众号:Python日志
#python编程小知识教学,入门到精通视频+源码+课件+学习解答加群:773162165__author__ = 'marble_xu'from .. import setup, tools
from .. import constants as c
from ..components import infoclass 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_timeself.persist = persistself.game_info = self.persistself.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.LEVELdef set_info_state(self):return c.LOAD_SCREENdef 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 = Trueclass GameOver(LoadScreen):def __init__(self):LoadScreen.__init__(self)self.time_list = [3000, 3200, 3235]def set_next_state(self):return c.MAIN_MENUdef set_info_state(self):return c.GAME_OVERclass TimeOut(LoadScreen):def __init__(self):LoadScreen.__init__(self)self.time_list = [2400, 2600, 2635]def set_next_state(self):if self.persist[c.LIVES] == 0:return c.GAME_OVERelse:return c.LOAD_SCREENdef set_info_state(self):return c.TIME_OUT

level

#公众号:Python日志
#python编程小知识教学,入门到精通视频+源码+课件+学习解答加群:773162165__author__ = 'marble_xu'import os
import json
import pygame as pg
from .. import setup, tools
from .. import constants as c
from ..components import info, stuff, player, brick, box, enemy, powerup, coinclass Level(tools.State):def __init__(self):tools.State.__init__(self)self.player = Nonedef startup(self, current_time, persist):self.game_info = persistself.persist = self.game_infoself.game_info[c.CURRENT_TIME] = current_timeself.death_timer = 0self.castle_timer = 0self.moving_score_list = []self.overhead_info = info.Info(self.game_info, c.LEVEL)self.load_map()self.setup_background()self.setup_maps()self.ground_group = self.setup_collide(c.MAP_GROUND)self.step_group = self.setup_collide(c.MAP_STEP)self.setup_pipe()self.setup_slider()self.setup_static_coin()self.setup_brick_and_box()self.setup_player()self.setup_enemies()self.setup_checkpoints()self.setup_flagpole()self.setup_sprite_groups()def load_map(self):map_file = 'level_' + str(self.game_info[c.LEVEL_NUM]) + '.json'file_path = os.path.join('source', 'data', 'maps', map_file)f = open(file_path)self.map_data = json.load(f)f.close()def setup_background(self):img_name = self.map_data[c.MAP_IMAGE]self.background = setup.GFX[img_name]self.bg_rect = self.background.get_rect()self.background = pg.transform.scale(self.background, (int(self.bg_rect.width*c.BACKGROUND_MULTIPLER),int(self.bg_rect.height*c.BACKGROUND_MULTIPLER)))self.bg_rect = self.background.get_rect()self.level = pg.Surface((self.bg_rect.w, self.bg_rect.h)).convert()self.viewport = setup.SCREEN.get_rect(bottom=self.bg_rect.bottom)def setup_maps(self):self.map_list = []if c.MAP_MAPS in self.map_data:for data in self.map_data[c.MAP_MAPS]:self.map_list.append((data['start_x'], data['end_x'], data['player_x'], data['player_y']))self.start_x, self.end_x, self.player_x, self.player_y = self.map_list[0]else:self.start_x = 0self.end_x = self.bg_rect.wself.player_x = 110self.player_y = c.GROUND_HEIGHTdef change_map(self, index, type):self.start_x, self.end_x, self.player_x, self.player_y = self.map_list[index]self.viewport.x = self.start_xif type == c.CHECKPOINT_TYPE_MAP:self.player.rect.x = self.viewport.x + self.player_xself.player.rect.bottom = self.player_yself.player.state = c.STANDelif type == c.CHECKPOINT_TYPE_PIPE_UP:self.player.rect.x = self.viewport.x + self.player_xself.player.rect.bottom = c.GROUND_HEIGHTself.player.state = c.UP_OUT_PIPEself.player.up_pipe_y = self.player_ydef setup_collide(self, name):group = pg.sprite.Group()if name in self.map_data:for data in self.map_data[name]:group.add(stuff.Collider(data['x'], data['y'], data['width'], data['height'], name))return groupdef setup_pipe(self):self.pipe_group = pg.sprite.Group()if c.MAP_PIPE in self.map_data:for data in self.map_data[c.MAP_PIPE]:self.pipe_group.add(stuff.Pipe(data['x'], data['y'],data['width'], data['height'], data['type']))def setup_slider(self):self.slider_group = pg.sprite.Group()if c.MAP_SLIDER in self.map_data:for data in self.map_data[c.MAP_SLIDER]:if c.VELOCITY in data:vel = data[c.VELOCITY]else:vel = 1self.slider_group.add(stuff.Slider(data['x'], data['y'], data['num'],data['direction'], data['range_start'], data['range_end'], vel))def setup_static_coin(self):self.static_coin_group = pg.sprite.Group()if c.MAP_COIN in self.map_data:for data in self.map_data[c.MAP_COIN]:self.static_coin_group.add(coin.StaticCoin(data['x'], data['y']))def setup_brick_and_box(self):self.coin_group = pg.sprite.Group()self.powerup_group = pg.sprite.Group()self.brick_group = pg.sprite.Group()self.brickpiece_group = pg.sprite.Group()if c.MAP_BRICK in self.map_data:for data in self.map_data[c.MAP_BRICK]:brick.create_brick(self.brick_group, data, self)self.box_group = pg.sprite.Group()if c.MAP_BOX in self.map_data:for data in self.map_data[c.MAP_BOX]:if data['type'] == c.TYPE_COIN:self.box_group.add(box.Box(data['x'], data['y'], data['type'], self.coin_group))else:self.box_group.add(box.Box(data['x'], data['y'], data['type'], self.powerup_group))def setup_player(self):if self.player is None:self.player = player.Player(self.game_info[c.PLAYER_NAME])else:self.player.restart()self.player.rect.x = self.viewport.x + self.player_xself.player.rect.bottom = self.player_yif c.DEBUG:self.player.rect.x = self.viewport.x + c.DEBUG_START_Xself.player.rect.bottom = c.DEBUG_START_yself.viewport.x = self.player.rect.x - 110def setup_enemies(self):self.enemy_group_list = []index = 0for data in self.map_data[c.MAP_ENEMY]:group = pg.sprite.Group()for item in data[str(index)]:group.add(enemy.create_enemy(item, self))self.enemy_group_list.append(group)index += 1def setup_checkpoints(self):self.checkpoint_group = pg.sprite.Group()for data in self.map_data[c.MAP_CHECKPOINT]:if c.ENEMY_GROUPID in data:enemy_groupid = data[c.ENEMY_GROUPID]else:enemy_groupid = 0if c.MAP_INDEX in data:map_index = data[c.MAP_INDEX]else:map_index = 0self.checkpoint_group.add(stuff.Checkpoint(data['x'], data['y'], data['width'], data['height'], data['type'], enemy_groupid, map_index))def setup_flagpole(self):self.flagpole_group = pg.sprite.Group()if c.MAP_FLAGPOLE in self.map_data:for data in self.map_data[c.MAP_FLAGPOLE]:if data['type'] == c.FLAGPOLE_TYPE_FLAG:sprite = stuff.Flag(data['x'], data['y'])self.flag = spriteelif data['type'] == c.FLAGPOLE_TYPE_POLE:sprite = stuff.Pole(data['x'], data['y'])else:sprite = stuff.PoleTop(data['x'], data['y'])self.flagpole_group.add(sprite)def setup_sprite_groups(self):self.dying_group = pg.sprite.Group()self.enemy_group = pg.sprite.Group()self.shell_group = pg.sprite.Group()self.ground_step_pipe_group = pg.sprite.Group(self.ground_group,self.pipe_group, self.step_group, self.slider_group)self.player_group = pg.sprite.Group(self.player)def update(self, surface, keys, current_time):self.game_info[c.CURRENT_TIME] = self.current_time = current_timeself.handle_states(keys)self.draw(surface)def handle_states(self, keys):self.update_all_sprites(keys)def update_all_sprites(self, keys):if self.player.dead:self.player.update(keys, self.game_info, self.powerup_group)if self.current_time - self.death_timer > 3000:self.update_game_info()self.done = Trueelif self.player.state == c.IN_CASTLE:self.player.update(keys, self.game_info, None)self.flagpole_group.update()if self.current_time - self.castle_timer > 2000:self.update_game_info()self.done = Trueelif self.in_frozen_state():self.player.update(keys, self.game_info, None)self.check_checkpoints()self.update_viewport()self.overhead_info.update(self.game_info, self.player)for score in self.moving_score_list:score.update(self.moving_score_list)else:self.player.update(keys, self.game_info, self.powerup_group)self.flagpole_group.update()self.check_checkpoints()self.slider_group.update()self.static_coin_group.update(self.game_info)self.enemy_group.update(self.game_info, self)self.shell_group.update(self.game_info, self)self.brick_group.update()self.box_group.update(self.game_info)self.powerup_group.update(self.game_info, self)self.coin_group.update(self.game_info)self.brickpiece_group.update()self.dying_group.update(self.game_info, self)self.update_player_position()self.check_for_player_death()self.update_viewport()self.overhead_info.update(self.game_info, self.player)for score in self.moving_score_list:score.update(self.moving_score_list)def check_checkpoints(self):checkpoint = pg.sprite.spritecollideany(self.player, self.checkpoint_group)if checkpoint:if checkpoint.type == c.CHECKPOINT_TYPE_ENEMY:group = self.enemy_group_list[checkpoint.enemy_groupid]self.enemy_group.add(group)elif checkpoint.type == c.CHECKPOINT_TYPE_FLAG:self.player.state = c.FLAGPOLEif self.player.rect.bottom < self.flag.rect.y:self.player.rect.bottom = self.flag.rect.yself.flag.state = c.SLIDE_DOWNself.update_flag_score()elif checkpoint.type == c.CHECKPOINT_TYPE_CASTLE:self.player.state = c.IN_CASTLEself.player.x_vel = 0self.castle_timer = self.current_timeself.flagpole_group.add(stuff.CastleFlag(8745, 322))elif (checkpoint.type == c.CHECKPOINT_TYPE_MUSHROOM andself.player.y_vel < 0):mushroom_box = box.Box(checkpoint.rect.x, checkpoint.rect.bottom - 40,c.TYPE_LIFEMUSHROOM, self.powerup_group)mushroom_box.start_bump(self.moving_score_list)self.box_group.add(mushroom_box)self.player.y_vel = 7self.player.rect.y = mushroom_box.rect.bottomself.player.state = c.FALLelif checkpoint.type == c.CHECKPOINT_TYPE_PIPE:self.player.state = c.WALK_AUTOelif checkpoint.type == c.CHECKPOINT_TYPE_PIPE_UP:self.change_map(checkpoint.map_index, checkpoint.type)elif checkpoint.type == c.CHECKPOINT_TYPE_MAP:self.change_map(checkpoint.map_index, checkpoint.type)elif checkpoint.type == c.CHECKPOINT_TYPE_BOSS:self.player.state = c.WALK_AUTOcheckpoint.kill()def update_flag_score(self):base_y = c.GROUND_HEIGHT - 80y_score_list = [(base_y, 100), (base_y-120, 400),(base_y-200, 800), (base_y-320, 2000),(0, 5000)]for y, score in y_score_list:if self.player.rect.y > y:self.update_score(score, self.flag)breakdef update_player_position(self):if self.player.state == c.UP_OUT_PIPE:returnself.player.rect.x += round(self.player.x_vel)if self.player.rect.x < self.start_x:self.player.rect.x = self.start_xelif self.player.rect.right > self.end_x:self.player.rect.right = self.end_xself.check_player_x_collisions()if not self.player.dead:self.player.rect.y += round(self.player.y_vel)self.check_player_y_collisions()def check_player_x_collisions(self):ground_step_pipe = pg.sprite.spritecollideany(self.player, self.ground_step_pipe_group)brick = pg.sprite.spritecollideany(self.player, self.brick_group)box = pg.sprite.spritecollideany(self.player, self.box_group)enemy = pg.sprite.spritecollideany(self.player, self.enemy_group)shell = pg.sprite.spritecollideany(self.player, self.shell_group)powerup = pg.sprite.spritecollideany(self.player, self.powerup_group)coin = pg.sprite.spritecollideany(self.player, self.static_coin_group)if box:self.adjust_player_for_x_collisions(box)elif brick:self.adjust_player_for_x_collisions(brick)elif ground_step_pipe:if (ground_step_pipe.name == c.MAP_PIPE andground_step_pipe.type == c.PIPE_TYPE_HORIZONTAL):returnself.adjust_player_for_x_collisions(ground_step_pipe)elif powerup:if powerup.type == c.TYPE_MUSHROOM:self.update_score(1000, powerup, 0)if not self.player.big:self.player.y_vel = -1self.player.state = c.SMALL_TO_BIGelif powerup.type == c.TYPE_FIREFLOWER:self.update_score(1000, powerup, 0)if not self.player.big:self.player.state = c.SMALL_TO_BIGelif self.player.big and not self.player.fire:self.player.state = c.BIG_TO_FIREelif powerup.type == c.TYPE_STAR:self.update_score(1000, powerup, 0)self.player.invincible = Trueelif powerup.type == c.TYPE_LIFEMUSHROOM:self.update_score(500, powerup, 0)self.game_info[c.LIVES] += 1if powerup.type != c.TYPE_FIREBALL:powerup.kill()elif enemy:if self.player.invincible:self.update_score(100, enemy, 0)self.move_to_dying_group(self.enemy_group, enemy)direction = c.RIGHT if self.player.facing_right else c.LEFTenemy.start_death_jump(direction)elif self.player.hurt_invincible:passelif self.player.big:self.player.y_vel = -1self.player.state = c.BIG_TO_SMALLelse:self.player.start_death_jump(self.game_info)self.death_timer = self.current_timeelif shell:if shell.state == c.SHELL_SLIDE:if self.player.invincible:self.update_score(200, shell, 0)self.move_to_dying_group(self.shell_group, shell)direction = c.RIGHT if self.player.facing_right else c.LEFTshell.start_death_jump(direction)elif self.player.hurt_invincible:passelif self.player.big:self.player.y_vel = -1self.player.state = c.BIG_TO_SMALLelse:self.player.start_death_jump(self.game_info)self.death_timer = self.current_timeelse:self.update_score(400, shell, 0)if self.player.rect.x < shell.rect.x:self.player.rect.left = shell.rect.x shell.direction = c.RIGHTshell.x_vel = 10else:self.player.rect.x = shell.rect.leftshell.direction = c.LEFTshell.x_vel = -10shell.rect.x += shell.x_vel * 4shell.state = c.SHELL_SLIDEelif coin:self.update_score(100, coin, 1)coin.kill()def adjust_player_for_x_collisions(self, collider):if collider.name == c.MAP_SLIDER:returnif self.player.rect.x < collider.rect.x:self.player.rect.right = collider.rect.leftelse:self.player.rect.left = collider.rect.rightself.player.x_vel = 0def check_player_y_collisions(self):ground_step_pipe = pg.sprite.spritecollideany(self.player, self.ground_step_pipe_group)enemy = pg.sprite.spritecollideany(self.player, self.enemy_group)shell = pg.sprite.spritecollideany(self.player, self.shell_group)# decrease runtime delay: when player is on the ground, don't check brick and boxif self.player.rect.bottom < c.GROUND_HEIGHT:brick = pg.sprite.spritecollideany(self.player, self.brick_group)box = pg.sprite.spritecollideany(self.player, self.box_group)brick, box = self.prevent_collision_conflict(brick, box)else:brick, box = False, Falseif box:self.adjust_player_for_y_collisions(box)elif brick:self.adjust_player_for_y_collisions(brick)elif ground_step_pipe:self.adjust_player_for_y_collisions(ground_step_pipe)elif enemy:if self.player.invincible:self.update_score(100, enemy, 0)self.move_to_dying_group(self.enemy_group, enemy)direction = c.RIGHT if self.player.facing_right else c.LEFTenemy.start_death_jump(direction)elif (enemy.name == c.PIRANHA orenemy.name == c.FIRESTICK orenemy.name == c.FIRE_KOOPA orenemy.name == c.FIRE):passelif self.player.y_vel > 0:self.update_score(100, enemy, 0)enemy.state = c.JUMPED_ONif enemy.name == c.GOOMBA:self.move_to_dying_group(self.enemy_group, enemy)elif enemy.name == c.KOOPA or enemy.name == c.FLY_KOOPA:self.enemy_group.remove(enemy)self.shell_group.add(enemy)self.player.rect.bottom = enemy.rect.topself.player.state = c.JUMPself.player.y_vel = -7elif shell:if self.player.y_vel > 0:if shell.state != c.SHELL_SLIDE:shell.state = c.SHELL_SLIDEif self.player.rect.centerx < shell.rect.centerx:shell.direction = c.RIGHTshell.rect.left = self.player.rect.right + 5else:shell.direction = c.LEFTshell.rect.right = self.player.rect.left - 5self.check_is_falling(self.player)self.check_if_player_on_IN_pipe()def prevent_collision_conflict(self, sprite1, sprite2):if sprite1 and sprite2:distance1 = abs(self.player.rect.centerx - sprite1.rect.centerx)distance2 = abs(self.player.rect.centerx - sprite2.rect.centerx)if distance1 < distance2:sprite2 = Falseelse:sprite1 = Falsereturn sprite1, sprite2def adjust_player_for_y_collisions(self, sprite):if self.player.rect.top > sprite.rect.top:if sprite.name == c.MAP_BRICK:self.check_if_enemy_on_brick_box(sprite)if sprite.state == c.RESTING:if self.player.big and sprite.type == c.TYPE_NONE:sprite.change_to_piece(self.dying_group)else:if sprite.type == c.TYPE_COIN:self.update_score(200, sprite, 1)sprite.start_bump(self.moving_score_list)elif sprite.name == c.MAP_BOX:self.check_if_enemy_on_brick_box(sprite)if sprite.state == c.RESTING:if sprite.type == c.TYPE_COIN:self.update_score(200, sprite, 1)sprite.start_bump(self.moving_score_list)elif (sprite.name == c.MAP_PIPE andsprite.type == c.PIPE_TYPE_HORIZONTAL):returnself.player.y_vel = 7self.player.rect.top = sprite.rect.bottomself.player.state = c.FALLelse:self.player.y_vel = 0self.player.rect.bottom = sprite.rect.topif self.player.state == c.FLAGPOLE:self.player.state = c.WALK_AUTOelif self.player.state == c.END_OF_LEVEL_FALL:self.player.state = c.WALK_AUTOelse:self.player.state = c.WALKdef check_if_enemy_on_brick_box(self, brick):brick.rect.y -= 5enemy = pg.sprite.spritecollideany(brick, self.enemy_group)if enemy:self.update_score(100, enemy, 0)self.move_to_dying_group(self.enemy_group, enemy)if self.player.rect.centerx > brick.rect.centerx:direction = c.RIGHTelse:direction = c.LEFTenemy.start_death_jump(direction)brick.rect.y += 5def in_frozen_state(self):if (self.player.state == c.SMALL_TO_BIG orself.player.state == c.BIG_TO_SMALL orself.player.state == c.BIG_TO_FIRE orself.player.state == c.DEATH_JUMP orself.player.state == c.DOWN_TO_PIPE orself.player.state == c.UP_OUT_PIPE):return Trueelse:return Falsedef check_is_falling(self, sprite):sprite.rect.y += 1check_group = pg.sprite.Group(self.ground_step_pipe_group,self.brick_group, self.box_group)if pg.sprite.spritecollideany(sprite, check_group) is None:if (sprite.state == c.WALK_AUTO orsprite.state == c.END_OF_LEVEL_FALL):sprite.state = c.END_OF_LEVEL_FALLelif (sprite.state != c.JUMP and sprite.state != c.FLAGPOLE andnot self.in_frozen_state()):sprite.state = c.FALLsprite.rect.y -= 1def check_for_player_death(self):if (self.player.rect.y > c.SCREEN_HEIGHT orself.overhead_info.time <= 0):self.player.start_death_jump(self.game_info)self.death_timer = self.current_timedef check_if_player_on_IN_pipe(self):'''check if player is on the pipe which can go down in to it '''self.player.rect.y += 1pipe = pg.sprite.spritecollideany(self.player, self.pipe_group)if pipe and pipe.type == c.PIPE_TYPE_IN:if (self.player.crouching andself.player.rect.x < pipe.rect.centerx andself.player.rect.right > pipe.rect.centerx):self.player.state = c.DOWN_TO_PIPEself.player.rect.y -= 1def update_game_info(self):if self.player.dead:self.persist[c.LIVES] -= 1if self.persist[c.LIVES] == 0:self.next = c.GAME_OVERelif self.overhead_info.time == 0:self.next = c.TIME_OUTelif self.player.dead:self.next = c.LOAD_SCREENelse:self.game_info[c.LEVEL_NUM] += 1self.next = c.LOAD_SCREENdef update_viewport(self):third = self.viewport.x + self.viewport.w//3player_center = self.player.rect.centerxif (self.player.x_vel > 0 and player_center >= third andself.viewport.right < self.end_x):self.viewport.x += round(self.player.x_vel)elif self.player.x_vel < 0 and self.viewport.x > self.start_x:self.viewport.x += round(self.player.x_vel)def move_to_dying_group(self, group, sprite):group.remove(sprite)self.dying_group.add(sprite)def update_score(self, score, sprite, coin_num=0):self.game_info[c.SCORE] += scoreself.game_info[c.COIN_TOTAL] += coin_numx = sprite.rect.xy = sprite.rect.y - 10self.moving_score_list.append(stuff.Score(x, y, score))def draw(self, surface):self.level.blit(self.background, self.viewport, self.viewport)self.powerup_group.draw(self.level)self.brick_group.draw(self.level)self.box_group.draw(self.level)self.coin_group.draw(self.level)self.dying_group.draw(self.level)self.brickpiece_group.draw(self.level)self.flagpole_group.draw(self.level)self.shell_group.draw(self.level)self.enemy_group.draw(self.level)self.player_group.draw(self.level)self.static_coin_group.draw(self.level)self.slider_group.draw(self.level)self.pipe_group.draw(self.level)for score in self.moving_score_list:score.draw(self.level)if c.DEBUG:self.ground_step_pipe_group.draw(self.level)self.checkpoint_group.draw(self.level)surface.blit(self.level, (0,0), self.viewport)self.overhead_info.draw(surface)

公众号:Python日志
需要源码的小伙伴可以在公众号回复超级玛丽
Python源码、问题解答学习交流群:773162165

今天咱们用Python整一个超级玛丽游戏 | 附带源码相关推荐

  1. 用Python写一个超级玛丽游戏

    好的,我们来分步写一个超级玛丽游戏. 首先,我们需要准备一些图片作为游戏中的背景和角色.你可以在网上找一些超级玛丽的图片,然后把它们保存在本地电脑上. 其次,我们需要使用 Python 的 pygam ...

  2. python面试题及答案bt_公布上期Python笔试题答案,附带源码与运行结果

    今天发布的内容没有废话,就是上一期的笔试题答案,由于内容较多,我们今天就公布前五道题的答案,附带源码哦!请感兴趣的读者细细研究! 笔试 笔试题一答案:利用Python创建如图所示的二叉树,并给出前序. ...

  3. 今天咱们用Python整一个植物大战僵尸游戏 | 附带源码

    <植物大战僵尸>是一款极富策略性的小游戏,可怕的僵尸即将入侵,唯一的防御方式就是栽种植物.此游戏集成了即时战略.塔防御战和卡片收集等要素.游戏的内容就是:玩家控制植物,抵御僵尸的进攻,保护 ...

  4. 【Python游戏】Python实现一个Q版泡泡堂小游戏 | 附带源码

    相关文件 想学Python的小伙伴可以关注小编的公众号[Python日志] 有很多的资源可以白嫖的哈,不定时会更新一下Python的小知识的哈!! 需要源码的小伙伴可以在公众号回复泡泡堂 Python ...

  5. 用python来做一个五子棋游戏,源码分享~

    五子棋的规则大家肯定都了解,也是大家在百忙之中娱乐的一部分,也都在网上玩过五子棋的游戏,那么大家有没有想过自己编写一个五子棋游戏呢.很多人都感觉做"游戏"这个词汇听着就很难,不知道 ...

  6. 【Python游戏】Python实现一个星球大战的小游戏 | 附带源码

    相关文件 想学Python的小伙伴可以关注小编的公众号[Python日志] 有很多的资源可以白嫖的哈,不定时会更新一下Python的小知识的哈!! 需要源码的小伙伴可以在公众号回复星球大战 Pytho ...

  7. 【Python游戏】Python实现一个可以切换单人或双人对战乒乓球小游戏 | 附带源码

    相关文件 想学Python的小伙伴可以关注小编的公众号[Python日志] 有很多的资源可以白嫖的哈,不定时会更新一下Python的小知识的哈!! 需要源码的小伙伴可以在公众号回复 乒乓球 Pytho ...

  8. 用python做五子棋游戏_用python来做一个五子棋游戏,源码分享~

    五子棋的规则大家肯定都了解,也是大家在百忙之中娱乐的一部分,也都在网上玩过五子棋的游戏,那么大家有没有想过自己编写一个五子棋游戏呢.很多人都感觉做"游戏"这个词汇听着就很难,不知道 ...

  9. Python游戏开发,Python实现开心消消乐小游戏 附带源码

    开发工具 Python版本: 3.6.4 相关模块: pygame模块: 以及一些Python自带的模块. 环境搭建 安装Python并添加到环境变量,pip安装需要的相关模块即可. 效果展示 原理简 ...

最新文章

  1. 洛谷1216 数字三角形
  2. 如何拼通网络ip地址_如何解决IP地址冲突
  3. Alphabet wars - nuclear strike--5 kyu--Python解法
  4. c语言产生cl.exe错误,vc++6.0执行cl.exe时出错
  5. JVM内存占用情况深入分析,分分钟解开你的疑惑
  6. VTK:PolyData之PointInsideObject
  7. GridView实战二:使用ObjectDataSource数据源控件(自定义缓存机制实现Sort)
  8. mysql varchar java_关于MySQL varchar类型最大值,原来一直都理解错了
  9. 致初级开发的一封信:坚持写代码!
  10. transaction缩写为什么是tx_TX Transaction locks常见的4种情况
  11. [转载] 七龙珠第一部——第114话 悟空的愿望 卡林大人好为难
  12. 我的世界javamod怎么装_我的世界MOD安装方法图文教程_我的世界MOD怎么安装_牛游戏网...
  13. Android软键盘的删除键和activity返回冲突
  14. 北大计算机直博生,直博生培养方案-北京大学.doc
  15. BGA集成电路脚位识别
  16. Spring Boot 五种热部署方式
  17. Web自动化测试模式page object的小利器:gizmo
  18. 信息论与编码课件,希望传播给更多的人
  19. Faiss(16):编译时添加对AVX512指令的支持
  20. html对象下边框呈三角形,html5 - CSS-三角形边框无法正确呈现IE8 - 堆栈内存溢出...

热门文章

  1. vue动态路由加载组件,找不到module问题
  2. s8 android z,重磅!三星S8要吃上安卓8.0了:安卓第一机皇体验彻底逆袭!
  3. 补间动画详解一 基类Animation
  4. 搜索引擎的核心原理-倒排索引
  5. linux查看ogg客户端版本,OGG学习笔记05-OGG的版本
  6. Photoshop学习(三十七):光滑金色字
  7. 提高托福阅读速度的两大技巧
  8. 域名ns查询接口php,域名NS查询网址
  9. java三国快打_有哪些好玩有趣的网页小游戏?
  10. 运动时候哪些蓝牙耳机不容易掉?运动蓝牙耳机推荐