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实现系统状态监测和故障转移实例方法
Nov 18 Python
Python中给List添加元素的4种方法分享
Nov 28 Python
python 链接和操作 memcache方法
Mar 04 Python
Python安装官方whl包和tar.gz包的方法(推荐)
Jun 04 Python
基于Python os模块常用命令介绍
Nov 03 Python
python3.6的venv模块使用详解
Aug 01 Python
对Python3 序列解包详解
Feb 16 Python
python Tkinter版学生管理系统
Feb 20 Python
十行代码使用Python写一个USB病毒
Jun 21 Python
浅谈Python中函数的定义及其调用方法
Jul 19 Python
python爬虫 urllib模块反爬虫机制UA详解
Aug 20 Python
基于Python实现签到脚本过程解析
Oct 25 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
实现“上一页”和“下一页按钮
2006/10/09 PHP
PHP新手上路(八)
2006/10/09 PHP
php基础知识:类与对象(4) 范围解析操作符(::)
2006/12/13 PHP
PHP页面实现定时跳转的方法
2014/10/31 PHP
Yii学习总结之安装配置
2015/02/22 PHP
php实现cookie加密的方法
2015/03/10 PHP
PHP实现websocket通信的方法示例
2018/08/28 PHP
Thinkphp5框架ajax接口实现方法分析
2019/08/28 PHP
读取input:file的路径并显示本地图片的方法
2013/09/23 Javascript
form.submit()不能提交表单的原因分析
2014/10/23 Javascript
node.js中的path.dirname方法使用说明
2014/12/09 Javascript
jQuery在页面加载时动态修改图片尺寸的方法
2015/03/20 Javascript
JavaScript html5 canvas绘制时钟效果(二)
2016/03/27 Javascript
移动端js图片查看器
2016/11/17 Javascript
Angular学习教程之RouterLink花式跳转
2018/05/03 Javascript
VueX模块的具体使用(小白教程)
2020/06/05 Javascript
javascript实现页面的实时时钟显示示例
2020/08/06 Javascript
Vue实现购物小球抛物线的方法实例
2020/11/22 Vue.js
[36:37]2014 DOTA2华西杯精英邀请赛5 24 VG VS iG
2014/05/25 DOTA
新手常见6种的python报错及解决方法
2018/03/09 Python
DataFrame 将某列数据转为数组的方法
2018/04/13 Python
tensorflow 打印内存中的变量方法
2018/07/30 Python
对django中render()与render_to_response()的区别详解
2018/10/16 Python
Django的用户模块与权限系统的示例代码
2019/07/24 Python
Django Rest framework三种分页方式详解
2019/07/26 Python
Python DataFrame一列拆成多列以及一行拆成多行
2019/08/06 Python
联想韩国官网:Lenovo Korea
2018/05/10 全球购物
小学教师岗位职责
2013/11/25 职场文书
学校文明单位申报材料
2014/05/06 职场文书
政府信息公开实施方案
2014/05/09 职场文书
施工安全承诺书
2014/05/22 职场文书
模具设计与制造专业求职信
2014/07/19 职场文书
2014年创卫工作总结
2014/11/24 职场文书
大学生党员个人总结
2015/02/13 职场文书
SpringBoot SpringEL表达式的使用
2021/07/25 Java/Android
python之基数排序的实现
2021/07/26 Python