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代码调试的几种方法总结
Apr 15 Python
Python os模块学习笔记
Jun 21 Python
windows及linux环境下永久修改pip镜像源的方法
Nov 28 Python
用Python实现KNN分类算法
Dec 22 Python
python web基础之加载静态文件实例
Mar 20 Python
python 执行shell命令并将结果保存的实例
May 11 Python
Python实现的合并两个有序数组算法示例
Mar 04 Python
Python字符串内置函数功能与用法总结
Apr 16 Python
通过cmd进入python的实例操作
Jun 26 Python
Python对称的二叉树多种思路实现方法
Feb 28 Python
matplotlib.pyplot.plot()参数使用详解
Jul 28 Python
python中filter,map,reduce的作用
Jun 10 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在线生成二维码代码(google api)
2013/06/03 PHP
浅析php插件 Simple HTML DOM 用DOM方式处理HTML
2013/07/01 PHP
php实现执行某一操作时弹出确认、取消对话框
2013/12/30 PHP
Aster vs Newbee BO3 第二场2.18
2021/03/10 DOTA
ie下动态加态js文件的方法
2011/09/13 Javascript
FireFox下XML对象转化成字符串的解决方法
2011/12/09 Javascript
javascript实现的DES加密示例
2013/10/30 Javascript
Javscript删除数组中指定元素并返回新数组
2014/03/06 Javascript
JS 获取浏览器和屏幕宽高等信息代码
2014/03/31 Javascript
jQuery表格排序组件-tablesorter使用示例
2014/05/26 Javascript
javascript实现在某个元素上阻止鼠标右键事件的方法和实例
2014/08/12 Javascript
jQuery晃动层特效实现方法
2015/03/09 Javascript
JS实现从表格中动态删除指定行的方法
2015/03/31 Javascript
javascript的BOM汇总
2015/07/16 Javascript
jQuery+css实现的蓝色水平二级导航菜单效果代码
2015/09/11 Javascript
解决微信二次分享不显示摘要和图片的问题
2017/08/18 Javascript
微信小程序调用微信支付接口的实现方法
2019/04/29 Javascript
vue router总结 $router和$route及router与 router与route区别
2019/07/05 Javascript
Openlayers绘制地图标注
2020/09/28 Javascript
[04:03]辉夜杯主赛事 12月25日RECAP精彩回顾
2015/12/26 DOTA
[02:17]快乐加倍!DOTA2食人魔魔法师至宝+迎霜节活动上线
2019/12/22 DOTA
windows 下python+numpy安装实用教程
2017/12/23 Python
在python plt图表中文字大小调节的方法
2019/07/08 Python
keras获得某一层或者某层权重的输出实例
2020/01/24 Python
django列表筛选功能的实现代码
2020/03/27 Python
Python装饰器的应用场景代码总结
2020/04/10 Python
零基础学Python之前需要学c语言吗
2020/07/21 Python
python实现图像高斯金字塔的示例代码
2020/12/11 Python
初三物理教学反思
2014/01/21 职场文书
期中考试后的反思
2014/02/08 职场文书
优秀部门获奖感言
2014/02/14 职场文书
教堂婚礼主持词
2014/03/14 职场文书
运动会观后感
2015/06/09 职场文书
话题作文之生命的旋律
2019/12/17 职场文书
java中重写父类方法加不加@Override详解
2021/06/21 Java/Android
Win11 Build 25179预览版发布(附更新内容+ISO官方镜像下载)
2022/08/14 数码科技