python实现超级玛丽游戏


Posted in Python onMarch 18, 2020

python制作超级玛丽游戏,供大家参考,具体内容如下

这篇文章,我们优先介绍超级玛丽游戏中的多状态跳跃,和行走地图拖动的原理,然后实现。并实现倒计时和金币动态效果

python实现超级玛丽游戏

python实现超级玛丽游戏

python实现超级玛丽游戏

接下来用下面这四张图,就可以完全懂得游戏中背景是怎么会移动的。

图1

python实现超级玛丽游戏

图2

python实现超级玛丽游戏

图3

python实现超级玛丽游戏

图4

python实现超级玛丽游戏

由于代码是我前几年学习python的时候做的,代码写的很挤都整到一个源文件中,大家看的时候仔细。

然后上源代码:

#!/usr/bin/env python 
# -*- coding:utf-8 -*- 
import pygame,os,wx
from random import randint
from sys import exit
from pygame.locals import *
pygame.init()

def main():
 #获取屏幕大小
 app=wx.App()
 WHFRAMES=wx.DisplaySize()
 WIDTH=int(WHFRAMES[0]*0.7)
 HEIGHT=int(WHFRAMES[1]*0.8)
 Timers = 0 #游戏定时器
 TimersSec = 0 #秒
 tim_psd = 0
 #获取屏幕大小
 screen=pygame.display.set_mode((WIDTH,HEIGHT),0,32)
 caption=pygame.display.set_caption("超级马里奥")
 screen.fill([255,255,255])
 mariofont = pygame.font.Font('fonts/poster.ttf',22)
 mario_name = mariofont.render("MARIO",True,(84,65,190),None)
 #Game_world = mariofont.render("WORLD",True,(84,65,190),None)
 Game_moneyX = mariofont.render("X",True,(255,255,128),None)
 Game_time = mariofont.render("TIME",True,(84,65,190),None)

 money_ic5 = pygame.image.load('images/PTModelSprite_ID21675.png')
 money_ic5 = pygame.transform.scale(money_ic5, (25, 25))
 money_ic6 = pygame.image.load('images/PTModelSprite_ID21676.png')
 money_ic6 = pygame.transform.scale(money_ic6, (10, 25))
 money_ic7 = pygame.image.load('images/PTModelSprite_ID21677.png')
 money_ic7 = pygame.transform.scale(money_ic7, (25, 25))
 money_ic8 = pygame.image.load('images/PTModelSprite_ID21678.png')
 money_ic8 = pygame.transform.scale(money_ic8, (25, 25))
 money_timers = 0 #图片轮播定时器
 
 Game_world = pygame.image.load('images/PTModelSprite_ID2478.png')

 background = pygame.image.load('images/PTModelSprite_ID35342.png').convert_alpha()
 background = pygame.transform.scale(background, (WIDTH, HEIGHT))

 Roads = pygame.image.load('images/PTModelSprite_ID3790.png').convert_alpha()
 Roads2 = pygame.image.load('images/PTModelSprite_ID4224.png').convert_alpha()
 
 hero = pygame.image.load('images/PTModelSprite_ID34297.png').convert_alpha()
 x,y = 15,HEIGHT-200
 inp_flag = -2 #(stop:-1 left drection ,-2 right drection) ,(walk:1 right drection ,2 left drection)
 times,times2 = 0,0 #人物动作定时器
 move_values,jump_values,jump_values2,jump_values3 = 12,0,0,0 #一步移动的距离 和 跳跃的值1,2
 jump_adder,jump_max_point = 0,50 #跳跃累加器 用来累加按键的长短 然后判断跳跃的高度,跳跃的初始值最高点 
 jump_flag = 0
 bg_w_1,bg_w_2 = 0,WIDTH-2 #两张壁纸 一前一后循环拖动的变量

 #播放背景
 
 #播放背景



 #游戏信息数据定义
 score = 0
 money = 0
 world = 11
 time = 400
 Gdata = [score,money,world,time]
 #游戏信息数据定义

 #初始化函数
 def game_initializaion(score,money,world,time,Gdata,TimersSec,Timers,x,y,inp_flag,times,times2,move_values,jump_values,jump_values2,jump_values3,jump_adder,jump_max_point,jump_flag,bg_w_1,bg_w_2,tim_psd):#数据初始化
 #游戏初始化数据
 inp_flag = -2 #(stop:-1 left drection ,-2 right drection) ,(walk:1 right drection ,2 left drection)
 x,y = 15,HEIGHT-200 #马里奥坐标
 times,times2 = 0,0 #人物动作定时器
 move_values,jump_values,jump_values2,jump_values3 = 12,0,0,0 #一步移动的距离 和 跳跃的值1,2
 jump_adder,jump_max_point = 0,50 #跳跃累加器 用来累加按键的长短 然后判断跳跃的高度,跳跃的初始值最高点
 jump_flag = 0
 tim_psd = 0
 bg_w_1,bg_w_2 = 0,WIDTH-2 #两张壁纸 一前一后循环拖动的变量
 Timers = 0 #游戏定时器
 score = 0 #开始分数
 money = 0 #开始金钱
 world = 11 #世界关卡第一关1-1 = 11
 time = 400 #游戏总时间
 TimersSec = 0 #游戏里的秒
 Gdata = [score,money,world,time]
 #游戏初始化数据
 return score,money,world,time,Gdata,TimersSec,Timers,x,y,inp_flag,times,times2,move_values,jump_values,jump_values2,jump_values3,jump_adder,jump_max_point,jump_flag,bg_w_1,bg_w_2,tim_psd
 #初始化函数

 score,money,world,time,Gdata,TimersSec,Timers,x,y,inp_flag,times,times2,move_values,jump_values,jump_values2,jump_values3,jump_adder,jump_max_point,jump_flag,bg_w_1,bg_w_2,tim_psd = \
 game_initializaion(score,money,world,time,Gdata,TimersSec,Timers,x,y,inp_flag,times,times2,move_values,jump_values,jump_values2,jump_values3,jump_adder,jump_max_point,jump_flag,bg_w_1,bg_w_2,tim_psd)#数据初始化主调函数

 clock = pygame.time.Clock()
 pygame.key.set_repeat(55)
 pygame.display.flip()

 def WalkAction(times,times2,inp_flag,hero):
 #walk action
 if y < HEIGHT -200: #如果在空中 为跳跃图片
 if inp_flag == 1: #right
 hero = pygame.image.load('images/PTModelSprite_ID34259.png').convert_alpha()
 if inp_flag == 2: #left
 hero = pygame.image.load('images/PTModelSprite_ID34259.png').convert_alpha()
 hero = pygame.transform.flip(hero, True, False)
 else:
 if inp_flag == 1: #right
 times += 2
 if times < 20:
  hero = pygame.image.load('images/PTModelSprite_ID34256.png').convert_alpha()
 elif times < 20:
  hero = pygame.image.load('images/PTModelSprite_ID34257..png').convert_alpha()
 elif times < 40:
  hero = pygame.image.load('images/PTModelSprite_ID34258.png').convert_alpha() 
 elif times < 60:
  hero = pygame.image.load('images/PTModelSprite_ID34259.png').convert_alpha()
 elif times < 80:
  hero = pygame.image.load('images/PTModelSprite_ID34260.png').convert_alpha()
 elif times < 100:
  hero = pygame.image.load('images/PTModelSprite_ID34261.png').convert_alpha() 
 elif times < 120:
  hero = pygame.image.load('images/PTModelSprite_ID34297.png').convert_alpha()
 elif times < 140:
  times = 0
 if inp_flag == 2: #left 
 times2 += 2
 if times2 < 20:
  hero = pygame.image.load('images/PTModelSprite_ID34256.png').convert_alpha()
  hero = pygame.transform.flip(hero, True, False)
 elif times2 < 20:
  hero = pygame.image.load('images/PTModelSprite_ID34257..png').convert_alpha()
  hero = pygame.transform.flip(hero, True, False)
 elif times2 < 40:
  hero = pygame.image.load('images/PTModelSprite_ID34258.png').convert_alpha() 
  hero = pygame.transform.flip(hero, True, False)
 elif times2 < 60:
  hero = pygame.image.load('images/PTModelSprite_ID34259.png').convert_alpha()
  hero = pygame.transform.flip(hero, True, False)
 elif times2 < 80:
  hero = pygame.image.load('images/PTModelSprite_ID34260.png').convert_alpha()
  hero = pygame.transform.flip(hero, True, False)
 elif times2 < 100:
  hero = pygame.image.load('images/PTModelSprite_ID34261.png').convert_alpha() 
  hero = pygame.transform.flip(hero, True, False)
 elif times2 < 120:
  hero = pygame.image.load('images/PTModelSprite_ID34297.png').convert_alpha()
  hero = pygame.transform.flip(hero, True, False)
 elif times2 < 140:
  times2 = 0
 elif inp_flag == -1:
 hero = pygame.image.load('images/PTModelSprite_ID34297.png').convert_alpha()
 hero = pygame.transform.flip(hero, True, False) 
 times2 = 0
 elif inp_flag == -2:
 hero = pygame.image.load('images/PTModelSprite_ID34297.png').convert_alpha()
 times2 = 0

 return times,times2,inp_flag,hero


 def HeroHeightIs(): #判断角色是否为地面y轴
 if y >= HEIGHT-200:
 return False
 else: #这是在控制的状况
 return True 


 def Reset_max_point(jump_max_point): #在地面重设默认跳跃的最高点(还原)
 if y >= (HEIGHT-200):
 jump_max_point = 50 #默认最高点是 50 
 return jump_max_point



 def jump_leftScreenBgnotMove(x): 
 if x<(WIDTH/4):
 if jump_max_point == 50 :
  if inp_flag == 1:
  x+=(2.7)
  if inp_flag == 2:
  x-=(2.7)
 elif jump_max_point == 100 :
  if inp_flag == 1:
  x+=(0.27)
  if inp_flag == 2:
  x-=(0.27)
 return x

 def Screen_MoneyIc(screen,money_ic5,money_ic6,money_ic7,money_ic8,money_timers) : #绘制第二项 金钱图标

 money_timers += 1
 if money_timers < 15 :
 screen.blit(money_ic5,(WIDTH*0.24,25)) #绘制第二项 金钱图标1
 elif money_timers < 40 :
 screen.blit(money_ic6,(WIDTH*0.24+7.5,25)) #绘制第二项 金钱图标2
 elif money_timers < 55 :
 screen.blit(money_ic7,(WIDTH*0.24,25)) #绘制第二项 金钱图标3
 elif money_timers < 80 :
 screen.blit(money_ic8,(WIDTH*0.24,25)) #绘制第二项 金钱图标4
 else:
 money_timers = 0
 return screen,money_ic5,money_ic6,money_ic7,money_ic8,money_timers


 def Game_Timers(TimersSec,Gdata,time_passed,tim_psd) : #游戏定时器

 tim_psd += time_passed
 if tim_psd >= 1000 : #为1秒的时候
 TimersSec += 1 
 tim_psd = 0
 Gdata[3] = 400 - TimersSec #游戏所剩时间
 
 return TimersSec,Gdata,time_passed,tim_psd


 while True: 
 
 #事件检测 
 for event in pygame.event.get(): 
 if event.type == pygame.QUIT: 
 exit()

 if event.type == KEYDOWN:
 keys=pygame.key.get_pressed()
 if keys[pygame.K_a]:
  if event.key == K_w and inp_flag == 0:
  if y <= HEIGHT-200: #看y坐标 必须在起点
  jump_flag = 3 #按了上 和 向前
  if y >= HEIGHT-200:#如果角色在平地才走动 后退 左
  #if bg_w_1==0:
  #x-=5
  x-=(move_values+3.5)
  inp_flag = 2
  
 if keys[pygame.K_d]:
  if event.key == K_w and inp_flag == 0:
  if y <= HEIGHT-200: #看y坐标 必须在起点
  jump_flag = 2 #按了上 和 向前
  if y >= HEIGHT-200:#如果角色在平地才走动 前景 右
  if x<(WIDTH/4): #角色还在屏幕左边 可移动
  x+=(move_values+3.5)
  inp_flag = 1
  
 if keys[pygame.K_w]: #jump
  jump_flag = 1 #仅仅是按了跳跃
  jump_adder += 1 #跳跃累加器
  if event.key == pygame.K_d and (jump_flag == 1):
  if y == HEIGHT-200: #看y坐标 必须在起点
  jump_flag = 2 #按了上 和 向前
  if event.key == pygame.K_a and (jump_flag == 1):
  if y == HEIGHT-200: #看y坐标 必须在起点
  jump_flag = 3 #按了上 和 向后

 if keys[pygame.K_p]: #重启
  score,money,world,time,Gdata,TimersSec,Timers,x,y,inp_flag,times,times2,move_values,\
  jump_values,jump_values2,jump_values3,jump_adder,jump_max_point,jump_flag,bg_w_1,bg_w_2,tim_psd = \
  game_initializaion(score,money,world,time,Gdata,TimersSec,Timers,x,y,inp_flag,times,times2,\
  move_values,jump_values,jump_values2,jump_values3,jump_adder,jump_max_point,jump_flag,bg_w_1,\
  bg_w_2,tim_psd)
  

 if event.type == KEYUP:
 if keys[pygame.K_a]:
  inp_flag = -1
 if keys[pygame.K_d]:
  inp_flag = -2
 if keys[pygame.K_w]:
  if jump_adder < 4 : #如果松开按键没有达到jump_adder跳跃累加器的值 (那么就他们置零)
  jump_adder = 0

 ##在地面时 重设默认跳跃的最高点(还原)
 jump_max_point = Reset_max_point(jump_max_point)

 #jump action 1
 if jump_flag == 1: #只有跳跃
 #让其他方式跳跃值为 0
 jump_values2 = 0
 jump_values3 = 0
 #------
 #持续按键跳跃的结构
 if jump_adder >=4 :
 jump_max_point = 100 #第二次跳跃最大值
 jump_adder = 0
 #------
 jump_values+=1.25
 if jump_values <= jump_max_point:
 y -= 5

 x = jump_leftScreenBgnotMove(x)

 if jump_max_point == 100:#跳跃的高度不同 y坐标的速度也要慢点
  y += 1.5
  x = jump_leftScreenBgnotMove(x)

 elif jump_values <= jump_max_point+8:
 pass
 elif jump_values <=jump_max_point*2+8:
 if HeroHeightIs(): #如果角色在控制 就继续加y轴的值 1
  y += 5
  
  x = jump_leftScreenBgnotMove(x)

  if jump_max_point == 100:#跳跃的高度不同 y坐标的速度也要慢点
  y -= 1.5
  x = jump_leftScreenBgnotMove(x)

 else:
 y = HEIGHT-200
 jump_flag = 0
 jump_values = 0

 
 #wall detection
 if x<=0:
 x=0
 if x+hero.get_width()>WIDTH:
 x=WIDTH-hero.get_width()
 

 #角色的动作 函数 
 times,times2,inp_flag,hero = WalkAction(times,times2,inp_flag,hero)

 #1 .bg move---blit
 screen.blit(background,(bg_w_2,0))
 screen.blit(background,(bg_w_1,0))

 #绘制信息
 
 screen.blit(mario_name,(WIDTH*0.03,3))#绘制第一项 名字

 screen,money_ic5,money_ic6,money_ic7,money_ic8,money_timers = \
 Screen_MoneyIc(screen,money_ic5,money_ic6,money_ic7,money_ic8,money_timers) #绘制第二项 金钱图标

 screen.blit(Game_moneyX,(WIDTH*0.28,24))#绘制第二项 x
 screen.blit(Game_world,(WIDTH*0.5-Game_world.get_width()/2,3))#绘制第三项 世界地图
 screen.blit(Game_time,(WIDTH*0.84,3))#绘制第四项 游戏时间

 for DATAi in range(4):
 Game_data = mariofont.render("%s"% Gdata[DATAi],True,(255,255,128),None) #综合绘制: 分数 金币 关卡 游戏时间
 if DATAi != 2:
 screen.blit(Game_data,(WIDTH*(0.03+DATAi*0.27),24))
 elif DATAi == 2:
 Game_data = mariofont.render("%s-%s"% (Gdata[DATAi]/10,Gdata[DATAi]%10),True,(255,255,128),None) #综合绘制: 分数 金币 关卡 游戏时间
 screen.blit(Game_data,(WIDTH*0.5-Game_data.get_width()/2,15))
 
 #绘制信息

 #2 .bg move--panel
 #if inp_flag == 2: #往左走 壁纸向右拖动
 # bg_w_1+=move_values/4
 # bg_w_2+=move_values/4
 if inp_flag == 1 and x>=(WIDTH/4):#往右走 壁纸向左拖动
 bg_w_1-=(move_values/4-0.5)
 bg_w_2-=(move_values/4-0.5)

 if bg_w_1>=0:
 bg_w_1,bg_w_2 = 0,WIDTH-2
 if bg_w_1<-WIDTH:
 bg_w_1,bg_w_2 = 0,WIDTH-2

 screen.blit(hero,(x,y))
 pygame.time.delay(2) #毫秒

 time_passed = clock.tick()
 TimersSec,Gdata,time_passed,tim_psd = Game_Timers(TimersSec,Gdata,time_passed,tim_psd) #游戏定时
 
 pygame.display.update()
 
if __name__ == '__main__':
 main()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python解决js文件utf-8编码乱码问题(推荐)
May 02 Python
python实现ID3决策树算法
Aug 29 Python
scrapy-redis源码分析之发送POST请求详解
May 15 Python
深入了解Python iter() 方法的用法
Jul 11 Python
Django框架视图层URL映射与反向解析实例分析
Jul 29 Python
解析Python3中的Import
Oct 13 Python
python3图片文件批量重命名处理
Oct 31 Python
python标准库sys和OS的函数使用方法与实例详解
Feb 12 Python
Python 实现使用空值进行赋值 None
Mar 12 Python
Python实时监控网站浏览记录实现过程详解
Jul 14 Python
python基于openpyxl生成excel文件
Dec 23 Python
Python如何利用pandas读取csv数据并绘图
Jul 07 Python
python实现超级马里奥
Mar 18 #Python
Python开发企业微信机器人每天定时发消息实例
Mar 17 #Python
10个python3常用排序算法详细说明与实例(快速排序,冒泡排序,桶排序,基数排序,堆排序,希尔排序,归并排序,计数排序)
Mar 17 #Python
Python Selenium安装及环境配置的实现
Mar 17 #Python
详解python环境安装selenium和手动下载安装selenium的方法
Mar 17 #Python
使用Python+selenium实现第一个自动化测试脚本
Mar 17 #Python
python中的selenium安装的步骤(浏览器自动化测试框架)
Mar 17 #Python
You might like
PHP往XML中添加节点的方法
2015/03/12 PHP
php基于闭包实现函数的自调用(递归)实例分析
2016/11/11 PHP
thinkPHP多语言切换设置方法详解
2016/11/11 PHP
解决php用mysql方式连接数据库出现Deprecated报错问题
2019/12/25 PHP
JQuery 网站换肤功能实现代码
2009/11/02 Javascript
JavaScript 学习笔记(五)
2009/12/31 Javascript
jqTransform form表单美化插件使用方法
2012/07/05 Javascript
asm.js使用示例代码
2013/11/28 Javascript
jQuery地图map悬停显示省市代码分享
2015/08/20 Javascript
jQuery获取单击节点对象的方法
2016/06/02 Javascript
JavaScript制作简单分页插件
2016/09/11 Javascript
KnockoutJS 3.X API 第四章之数据控制流foreach绑定
2016/10/10 Javascript
React简单介绍
2017/05/24 Javascript
关于webpack代码拆分的解析
2017/07/20 Javascript
基于webpack-hot-middleware热加载相关错误的解决方法
2018/02/22 Javascript
element ui里dialog关闭后清除验证条件方法
2018/02/26 Javascript
vue使用一些外部插件及样式的配置代码
2019/11/18 Javascript
JS实现的定时器展示简单秒表、页面弹框及跳转操作完整示例
2020/01/26 Javascript
12 种使用Vue 的最佳做法
2020/03/30 Javascript
vue 添加和编辑用同一个表单,el-form表单提交后清空表单数据操作
2020/08/03 Javascript
python实现博客文章爬虫示例
2014/02/26 Python
解决Python中由于logging模块误用导致的内存泄露
2015/04/23 Python
Python实现的FTP通信客户端与服务器端功能示例
2018/03/28 Python
对python使用http、https代理的实例讲解
2018/05/07 Python
在Pandas中处理NaN值的方法
2019/06/25 Python
Python 计算任意两向量之间的夹角方法
2019/07/05 Python
css3实现针线缝合效果(图解步骤)
2013/02/04 HTML / CSS
新加坡第一的杂货零售商:NTUC FairPrice
2020/12/05 全球购物
C#基础面试题
2016/10/17 面试题
node中使用shell脚本的方法步骤
2021/03/23 Javascript
外企办公室竞聘演讲稿
2013/12/29 职场文书
半年思想汇报
2013/12/30 职场文书
《生命的药方》教学反思
2014/04/08 职场文书
弘扬雷锋精神演讲稿
2014/05/10 职场文书
应届生个人的求职(自荐信范文2篇)
2019/08/23 职场文书
Redis 中使用 list,streams,pub/sub 几种方式实现消息队列的问题
2022/03/16 Redis