【Python游戏】Python基于第三方库pygame实现一个魂斗罗小游戏,毕业设计必备 | 附源码
创始人
2024-04-19 16:00:33
0

前言

halo,包子们下午好
今天给打击整一个魂斗罗小游戏
很多小伙伴接触魂斗罗应该是在小时候的一个手柄游戏上面吧
我记得作为90后的我,玩这一款游戏是在小学的时候
废话不多说,直接上才艺
今天给大家直接安排

相关文件

关注小编,私信小编领取哟!
当然别忘了一件三连哟~~
公众号:Python日志

源码点击蓝色字体领取
Python零基础入门到精通视频合集

【整整800集】Python爬虫项目零基础入门合集,细狗都学会了,你还不会?

开发工具

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

环境搭建

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

效果展示

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

游戏玩法

玩法

WASD 是控制人物的移动,J是发射子弹 boss 是不知火舞 ,哈哈
做了一点小改变,不过问题不大很大

运行文件

点击文件Contra.py 运行游戏
在这里插入图片描述

代码实现

导入模块

import pygame
import sys
from pygame.locals import *
from settings import Settings
from game_player import Game_Player 
import game_functions as gf
from pygame.sprite import Group
from game_stats import GameStats
from game_boss import Game_Boss
from button import Button

主函数

def run_game():bg = pygame.image.load("images/map01.jpeg")game_settings = Settings()pos_x = 0#地图移动pygame.init()screen = pygame.display.set_mode((game_settings.screen_width,game_settings.screen_height))pygame.display.set_caption("魂斗罗 公众号:Python日志 游戏源码领取QQ群 :494958217")stats = GameStats(game_settings)player = Game_Player(game_settings,screen)bullets = Group()boss = Group()enemys = Group()win_button = Button(game_settings,screen,"YOU WIN")gf.create_legion(game_settings,screen,enemys)gf.create_boss(game_settings,screen,player,boss)while True:pygame.mouse.set_visible(False)gf.check_events(game_settings,screen,player,bullets)gf.update_player(game_settings,stats,player,enemys)gf.update_bullet(game_settings,bullets,screen,enemys,boss)	gf.update_enemys(game_settings,enemys)	gf.update_boss(game_settings,boss)gf.update_screen(game_settings,bg,pos_x,screen,player,bullets,enemys,boss,win_button)if player.moving_right and player.center > player.screen_rect.centerx and game_settings.boss_appear == False:game_settings.screen_rolling = Truepos_x -= 5#屏幕滚动速度else:game_settings.screen_rolling = False
run_game()

人物模块

class Game_Player():def __init__(self,game_settings,screen):self.screen = screenself.game_settings = game_settingsself.image = pygame.image.load('images/PR/player.png')self.rect = self.image.get_rect()self.screen_rect = self.screen.get_rect()self.screen_center_pos = self.screen_rect.centerxself.rect.centerx = self.screen_rect.centerxself.rect.bottom = 380self.center = float(self.rect.centerx)self.moving_right = Falseself.moving_left = Falseself.player_moving = Falseself.pos_i = 0.0#跑步画面改变速度self.pos_j = 0.0#跳跃的改变初始速度self.pos_n = 0.0#射击self.pos_d = 0.0self.player_direction = 1#1为右,-1为左self.player_down = Falseself.player_up = Falseself.player_jump = Falseself.player_start_Y = 380#开始人物的高度self.player_Y = self.player_start_Yself.player_shooting = Falsedef update(self):if self.game_settings.player_is_alive:if self.moving_right and self.rect.right < self.screen_rect.right:if self.game_settings.boss_appear:self.center += self.game_settings.player_speedelif self.center > self.screen_center_pos:self.center += 0else:self.center += self.game_settings.player_speedif self.moving_left and self.rect.left > 0:self.center -= self.game_settings.player_speedself.rect.centerx = self.centerself.update_image_moving()else:self.update_die()def update_die(self):self.names = locals()self.players = []for self.i in range(1,3):self.names['player_image%s' %self.i] = pygame.image.load('images/PR/death%s.png' %self.i)self.players.append(self.names['player_image%s' %self.i])self.image = self.players[int(self.pos_d)]self.pos_d += 0.1if self.pos_d > 2.0:self.pos_d = 0.0self.game_settings.player_die_end = Truedef update_image_moving_direction(self,direction):#循环图片if self.player_shooting == True:self.names = locals()self.players = []for self.i in range(1,4):self.names['player_image%s' %self.i] = pygame.image.load('images/'+direction+'/shooting%s.png' %self.i)self.players.append(self.names['player_image%s' %self.i])self.image = self.players[int(self.pos_n)]self.pos_n += 0.1#射击时跑步速率if self.pos_n > 3.0:#射击时跑步有3个动作self.pos_n = 0.0else:self.names = locals()self.players = []for self.i in range(1,6):self.names['player_image%s' %self.i] = pygame.image.load('images/'+direction+'/player%s.png' %self.i)self.players.append(self.names['player_image%s' %self.i])self.image = self.players[int(self.pos_i)]self.pos_i += 0.1#跑步速率if self.pos_i > 5.0:#跑步有5个动作self.pos_i = 0.0def update_image_jump(self,direction):#循环图片if self.game_settings.player_is_alive:if self.player_jump == True:self.names1 = locals()self.players1 = []for self.j in range(1,5):self.names1['player_image%s' %self.j] = pygame.image.load('images/'+direction+'/jump%s.png' %self.j)self.players1.append(self.names1['player_image%s' %self.j])self.image = self.players1[int(self.pos_j)]self.pos_j += 0.3#跳跃旋转速率if self.pos_j > 4.0:#跳跃有4个动作self.pos_j = 0.0else:self.update_die()def update_image_moving(self):if self.player_moving:if self.moving_right:self.update_image_moving_direction('PR')#PR是向右的图片elif self.moving_left:self.update_image_moving_direction('PL')def get_player_state(self,player_state):#检测player的状态是否为趴下,向上,跳跃等if self.player_direction == 1:self.image = pygame.image.load('images/PR/'+player_state+'.png')if self.player_direction == -1:self.image = pygame.image.load('images/PL/'+player_state+'.png')self.rect = self.image.get_rect()self.rect.centerx = self.centerdef get_player_down(self):self.get_player_state('down')self.rect.bottom = self.player_start_Yself.screen.blit(self.image,self.rect)def get_player_up(self):self.get_player_state('up')self.rect.bottom = self.player_start_Yself.screen.blit(self.image,self.rect)def get_player_jump(self):self.get_player_state('jump1')self.rect.bottom = self.player_Yif self.game_settings.jump_vel < 0:self.game_settings.jump_vel += 0.6#跳跃上升的增加的速率elif self.game_settings.jump_vel > 0:self.game_settings.jump_vel += 0.8#跳跃下降增加的速率self.player_Y += self.game_settings.jump_velif self.player_Y > self.player_start_Y:self.player_jump = Falseself.player_Y = self.player_start_Yself.game_settings.jump_vel = -14.0#恢复跳跃开始的速度if self.player_direction == 1:self.image = pygame.image.load('images/PR/player.png')self.reset_player()if self.player_direction == -1:self.image = pygame.image.load('images/PL/player.png')self.reset_player()if self.player_jump == True:#判断是否处于跳跃状态来决定是否旋转跳跃的图像if self.player_direction == 1:self.update_image_jump('PR')if self.player_direction == -1:self.update_image_jump('PL')self.screen.blit(self.image,self.rect)def reset_player(self):self.rect = self.image.get_rect()self.rect.centerx = self.centerself.rect.bottom = self.player_start_Yself.screen.blit(self.image,self.rect)def blitme(self):if self.player_jump:self.get_player_jump()elif self.player_down:self.get_player_down()elif self.player_up:self.get_player_up()else:self.reset_player()def revive_player(self):self.center = self.screen_rect.centerxself.game_settings.player_is_alive = True

游戏统计信息模块

class GameStats():def __init__(self,game_settings):self.game_settings = game_settingsself.reset_stats()def reset_stats(self):self.players_left = self.game_settings.players_limit

boss模块

import pygame
import random
from pygame.sprite import Sprite
import datetimeclass Game_Boss(Sprite):def __init__(self,game_settings,screen,player):super().__init__()self.pos_i = 0.0self.pos_j = 0.0self.pos_k = 0.0self.game_settings = game_settingsself.screen = screenself.image = pygame.image.load('images/boss/left/move/bz1.png')self.rect = self.image.get_rect()self.rect.x = self.game_settings.screen_width-self.rect.widthself.rect.bottom = 370self.x = float(self.rect.x)#敌人的位置self.speed_factor = self.game_settings.enemy_speed_factorself.boss_start_Y = 370#开始boss人物的高度self.boss_Y = self.boss_start_Yself.attack1_order = 0self.player = playerself.mx = self.xdef blitme(self):self.screen.blit(self.image,self.rect)def update(self):if self.game_settings.boss_alive:self.direction()self.rand_att()if  self.game_settings.attack_1:if self.game_settings.boss_direction == 1:self.attack_1('left')else:self.attack_1('right')elif self.game_settings.attack_2:if self.game_settings.boss_direction == 1:self.attack_2('left')else:self.attack_2('right')elif self.game_settings.boss_jump:self.jump()elif self.game_settings.boss_run:if self.game_settings.boss_direction == 1:self.run('left')else:self.run('right')elif self.player.rect.centerx > self.rect.x:self.x += self.speed_factorself.rect.x = self.xself.move('right')elif self.player.rect.centerx < self.rect.x:self.x -= self.speed_factorself.rect.x = self.xself.move('left')else:self.boom()self.game_settings.game_win = Truedef rand_att(self):random.seed(datetime.datetime.now())if self.game_settings.attack_1 == False and self.game_settings.attack_2 == False and self.game_settings.boss_jump == False and self.game_settings.boss_run == False:self.rand_num = random.randint(1,70)if self.rand_num == 1:self.game_settings.attack_1 = Trueelif self.rand_num == 2:self.game_settings.attack_2 = Trueelif self.rand_num == 3:self.game_settings.boss_jump =Trueelif self.rand_num == 4:self.game_settings.boss_run = Truedef attack_1(self,direction):self.rect.bottom = 410#做此动作时人物的位置self.names1 = locals()self.players1 = []for self.j in range(0,34):self.names1['player_image%s' %self.j] = pygame.image.load('images/boss/'+direction+'/attack_1/%s.png' %self.j)self.players1.append(self.names1['player_image%s' %self.j])self.image = self.players1[int(self.pos_i)]self.pos_i += 0.5if self.pos_i >= 34.0 :#循环完成后:self.pos_i = 0.0self.game_settings.attack_1 = Falsedef attack_2(self,direction):self.rect.bottom = 355self.names1 = locals()self.players1 = []for self.j in range(0,30):self.names1['player_image%s' %self.j] = pygame.image.load('images/boss/'+direction+'/attack_2/%s.png' %self.j)self.players1.append(self.names1['player_image%s' %self.j])self.image = self.players1[int(self.pos_i)]self.pos_i += 0.5if self.pos_i >= 30:self.pos_i = 0.0self.game_settings.attack_2 = Falsedef move(self,direction):#循环图片self.rect.bottom = 370self.names1 = locals()self.players1 = []for self.j in range(1,7):self.names1['player_image%s' %self.j] = pygame.image.load('images/boss/'+direction+'/move/bz%s.png' %self.j)self.players1.append(self.names1['player_image%s' %self.j])self.image = self.players1[int(self.pos_i)]self.pos_i += 0.1#图片变化速率if self.pos_i > 6.0:#敌人bag有4个动作self.pos_i = 0.0def run(self,direction):self.rect.bottom = 400self.names1 = locals()self.players1 = []for self.j in range(0,6):self.names1['player_image%s' %self.j] = pygame.image.load('images/boss/'+direction+'/run/%s.png' %self.j)self.players1.append(self.names1['player_image%s' %self.j])self.image = self.players1[int(self.pos_i)]self.pos_i += 0.3if self.pos_i >= 6:self.pos_i = 0.0self.game_settings.boss_run = Falseif self.player.rect.centerx > self.rect.x :#or self.x < self.mx:self.x += 6self.rect.x = self.xelif self.player.rect.centerx < self.rect.x :#or self.x > self.mx:self.x -= 6self.rect.x = self.xdef jump(self):			self.rect.bottom = self.boss_Yif self.game_settings.boss_jump_vel < 0:self.game_settings.boss_jump_vel += 0.6#跳跃上升的增加的速率elif self.game_settings.boss_jump_vel > 0:self.game_settings.boss_jump_vel += 0.8#跳跃下降增加的速率self.boss_Y += self.game_settings.boss_jump_velif self.boss_Y > self.boss_start_Y:self.game_settings.boss_jump = False#结束跳跃self.boss_Y = self.boss_start_Yself.game_settings.boss_jump_vel = -12.0#恢复跳跃开始的速度if self.player.rect.centerx > self.rect.x :#or self.x < self.mx:self.x += self.speed_factorself.rect.x = self.xelif self.player.rect.centerx < self.rect.x :#or self.x > self.mx:self.x -= self.speed_factorself.rect.x = self.xself.names1 = locals()self.players1 = []for self.j in range(3,10):self.names1['player_image%s' %self.j] = pygame.image.load('images/boss/left/jump/%s.png' %self.j)self.players1.append(self.names1['player_image%s' %self.j])self.image = self.players1[int(self.pos_j)]self.pos_j += 0.4#跳跃旋转速率if self.pos_j >= 7:#跳跃有7个动作self.pos_j = 0.0def direction(self):if self.player.rect.centerx > self.rect.x:self.game_settings.boss_direction = -1else:self.game_settings.boss_direction = 1def boom(self):self.names1 = locals()self.players1 = []for self.j in range(1,4):self.names1['player_image%s' %self.j] = pygame.image.load('images/boss/boom%s.png' %self.j)self.players1.append(self.names1['player_image%s' %self.j])self.image = self.players1[int(self.pos_k)]self.pos_k += 0.05if self.pos_k >= 3.0:#self.game_settings.boom_end = Trueself.game_settings.boss_boom_end = True

按钮模块

import pygame.fontclass Button():def __init__(self,game_settings,screen,msg):self.screen = screenself.screen_rect = self.screen.get_rect()self.width,self.height = 300,150self.button_color=(0,255,0)self.text_color = (255,255,255)self.font = pygame.font.SysFont(None,48)self.rect = pygame.Rect(0,0,self.width,self.height)self.rect.center = self.screen_rect.centerself.prep_msg(msg)def	prep_msg(self,msg):self.msg_image = self.font.render(msg,True,self.text_color,self.button_color)self.msg_image_rect = self.msg_image.get_rect()self.msg_image_rect.center = self.rect.centerdef draw_button(self):self.screen.fill(self.button_color,self.rect)self.screen.blit(self.msg_image,self.msg_image_rect)

敌人模块

import pygame
from pygame.sprite import Spriteclass Enemy(Sprite):def __init__(self,game_settings,screen):super().__init__()self.pos_j = 0.0self.pos_i = 0.0self.game_settings = game_settingsself.screen = screenself.image = pygame.image.load('images/enemy/EL/bag1.png')#self.image = pygame.image.load('images/enemy/EL/bz1.png')self.rect = self.image.get_rect()self.rect.x = self.game_settings.screen_width+self.rect.width*2self.rect.bottom = 367self.x = float(self.rect.x)#敌人的位置self.speed_factor = self.game_settings.enemy_speed_factordef blitme(self):self.screen.blit(self.image,self.rect)def update(self):if self.game_settings.enemy_is_alive:if self.game_settings.screen_rolling:self.x -= self.speed_factor+1 #屏幕滚动速度减去敌人移动速度self.rect.x = self.xself.x -= self.speed_factorself.rect.x = self.xself.update_run_direction('EL')else:if self.game_settings.screen_rolling:self.x -= self.speed_factor+1 #屏幕滚动速度减去敌人移动速度self.rect.x = self.xself.boom()def boom(self):self.names1 = locals()self.players1 = []for self.j in range(1,3):self.names1['player_image%s' %self.j] = pygame.image.load('images/enemy/boom%s.png' %self.j)self.players1.append(self.names1['player_image%s' %self.j])self.image = self.players1[int(self.pos_i)]self.pos_i += 0.1if self.pos_i > 2.0:self.game_settings.boom_end = Truedef update_run_direction(self,direction):#循环图片self.names1 = locals()self.players1 = []for self.j in range(1,5):self.names1['player_image%s' %self.j] = pygame.image.load('images/enemy/'+direction+'/bag%s.png' %self.j)self.players1.append(self.names1['player_image%s' %self.j])self.image = self.players1[int(self.pos_j)]self.pos_j += 0.1#图片变化速率if self.pos_j > 4.0:#敌人bag有4个动作self.pos_j = 0.0

总结

代码量有点大,所以就不一一给大家展示了,上方是部分代码展示
在这里插入图片描述

如果有想要的小伙伴可以看看相关文件

相关内容

热门资讯

银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...