python制作超级玛丽游戏

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




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

图1

图2

图3

图4

由于代码是我前几年学习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-200inp_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,2jump_adder,jump_max_point = 0,50 #跳跃累加器  用来累加按键的长短  然后判断跳跃的高度,跳跃的初始值最高点 jump_flag = 0bg_w_1,bg_w_2 = 0,WIDTH-2 #两张壁纸 一前一后循环拖动的变量#播放背景#播放背景#游戏信息数据定义score = 0money = 0world = 11time = 400Gdata = [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,2jump_adder,jump_max_point = 0,50 #跳跃累加器  用来累加按键的长短  然后判断跳跃的高度,跳跃的初始值最高点jump_flag = 0tim_psd = 0bg_w_1,bg_w_2 = 0,WIDTH-2 #两张壁纸 一前一后循环拖动的变量Timers = 0  #游戏定时器score = 0  #开始分数money = 0     #开始金钱world = 11    #世界关卡第一关1-1 = 11time = 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 actionif y < HEIGHT -200: #如果在空中 为跳跃图片if inp_flag == 1: #righthero = pygame.image.load('images/PTModelSprite_ID34259.png').convert_alpha()if inp_flag == 2: #lefthero = pygame.image.load('images/PTModelSprite_ID34259.png').convert_alpha()hero = pygame.transform.flip(hero, True, False)else:if inp_flag == 1: #righttimes += 2if 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 = 0if inp_flag == 2: #left times2 += 2if 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 = 0elif inp_flag == -1:hero = pygame.image.load('images/PTModelSprite_ID34297.png').convert_alpha()hero = pygame.transform.flip(hero, True, False)   times2 = 0elif inp_flag == -2:hero = pygame.image.load('images/PTModelSprite_ID34297.png').convert_alpha()times2 = 0return times,times2,inp_flag,herodef HeroHeightIs(): #判断角色是否为地面y轴if y >= HEIGHT-200:return Falseelse:    #这是在控制的状况return True def Reset_max_point(jump_max_point):   #在地面重设默认跳跃的最高点(还原)if y >= (HEIGHT-200):jump_max_point = 50 #默认最高点是 50 return jump_max_pointdef 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 xdef Screen_MoneyIc(screen,money_ic5,money_ic6,money_ic7,money_ic8,money_timers) : #绘制第二项 金钱图标money_timers += 1if money_timers < 15 :screen.blit(money_ic5,(WIDTH*0.24,25)) #绘制第二项 金钱图标1elif money_timers < 40 :screen.blit(money_ic6,(WIDTH*0.24+7.5,25)) #绘制第二项 金钱图标2elif money_timers < 55 :screen.blit(money_ic7,(WIDTH*0.24,25)) #绘制第二项 金钱图标3elif money_timers < 80 :screen.blit(money_ic8,(WIDTH*0.24,25)) #绘制第二项 金钱图标4else:money_timers = 0return screen,money_ic5,money_ic6,money_ic7,money_ic8,money_timersdef  Game_Timers(TimersSec,Gdata,time_passed,tim_psd) : #游戏定时器tim_psd += time_passedif tim_psd >= 1000 : #为1秒的时候TimersSec += 1 tim_psd = 0Gdata[3] = 400 - TimersSec #游戏所剩时间return TimersSec,Gdata,time_passed,tim_psdwhile 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-=5x-=(move_values+3.5)inp_flag = 2if 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 = 1if keys[pygame.K_w]: #jumpjump_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 = -1if keys[pygame.K_d]:inp_flag = -2if keys[pygame.K_w]:if jump_adder < 4 : #如果松开按键没有达到jump_adder跳跃累加器的值 (那么就他们置零)jump_adder = 0##在地面时 重设默认跳跃的最高点(还原)jump_max_point = Reset_max_point(jump_max_point)#jump action 1if jump_flag == 1: #只有跳跃#让其他方式跳跃值为 0jump_values2 = 0jump_values3 = 0#------#持续按键跳跃的结构if jump_adder >=4 :jump_max_point = 100  #第二次跳跃最大值jump_adder = 0#------jump_values+=1.25if jump_values <= jump_max_point:y -= 5x = jump_leftScreenBgnotMove(x)if jump_max_point == 100:#跳跃的高度不同 y坐标的速度也要慢点y += 1.5x = jump_leftScreenBgnotMove(x)elif jump_values <= jump_max_point+8:passelif jump_values <=jump_max_point*2+8:if HeroHeightIs(): #如果角色在控制 就继续加y轴的值  1y += 5x = jump_leftScreenBgnotMove(x)if jump_max_point == 100:#跳跃的高度不同 y坐标的速度也要慢点y -= 1.5x = jump_leftScreenBgnotMove(x)else:y = HEIGHT-200jump_flag = 0jump_values = 0#wall detectionif x<=0:x=0if x+hero.get_width()>WIDTH:x=WIDTH-hero.get_width()#角色的动作 函数    times,times2,inp_flag,hero = WalkAction(times,times2,inp_flag,hero)#1 .bg move---blitscreen.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))#绘制第二项 xscreen.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/4if 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-2if bg_w_1<-WIDTH:bg_w_1,bg_w_2 = 0,WIDTH-2screen.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()

超级马里奥demo项目链接:
https://download.csdn.net/download/qq_25755645/12232820?spm=1001.2014.3001.5503

然后作者在奉上自己最近做的小游戏哦,你们可以体验下!

[Python] 制作超级玛丽游戏相关推荐

  1. python能制作游戏吗_如何用Python制作小游戏

    要想用Python制作小游戏,必须要安装一个插件Pygame 什么是Pygame Pygame是跨平台Python模块,专为电子游戏设计,包含图像.声音.建立在SDL基础上,允许实时电子游戏研发而无需 ...

  2. 如何用python制作五子棋游戏_Python制作打地鼠小游戏

    原文链接 Python制作小游戏(二十一)​mp.weixin.qq.com 效果展示 打地鼠小游戏https://www.zhihu.com/video/1200492442610450432 简介 ...

  3. Python 制作迷宫游戏(二)——游戏窗口

    Python 制作迷宫游戏(二)--游戏窗口 上一节我们使用prime做了迷宫的底层数组,它的形式是一个二维数组. 这一节我们着手开始制作游戏窗口 使用模块 pygame 在这项迷宫游戏的制作当中需要 ...

  4. 【python】python制作 连连看 游戏脚本(一)

    [python]python制作 连连看 游戏脚本(一)_sunriver2000的博客-CSDN博客 [python]python制作 连连看 游戏脚本(二)_sunriver2000的博客-CSD ...

  5. Python 制作迷宫游戏(三)——地图精灵

    Python 制作迷宫游戏(三)--地图精灵 上一节我们已经成功的生成了一个游戏窗口 这一节我们将试着把地图的瓦片与地图数组绑定并绘制到窗口中 当然,作为一个迷宫,地图的作用不仅仅是背景板,它最为重要 ...

  6. 【python】python制作 连连看 游戏脚本(二)

    [python]python制作 连连看 游戏脚本(一)_sunriver2000的博客-CSDN博客 [python]python制作 连连看 游戏脚本(二)_sunriver2000的博客-CSD ...

  7. 【python】python制作 连连看 游戏脚本(三)

    [python]python制作 连连看 游戏脚本(一)_sunriver2000的博客-CSDN博客 [python]python制作 连连看 游戏脚本(二)_sunriver2000的博客-CSD ...

  8. Python——制作小型游戏贪吃蛇

    记得之前大二上过一门交叉学科,使用了python制作贪吃蛇小游戏(但是当时真的就是浪555大家大学的时候真的要好好学习呀),然后自己在b站学习网站跟着做了这个小游戏,整体还是很容易懂的,用pychar ...

  9. python制作的游戏要怎么运行_练习项目19:使用python制作游戏(上) 魔力Python

    你的位置:魔力Python > Python教程 > 练习项目19:使用python制作游戏(上) 练习项目19:使用python制作游戏(上) Python教程小楼一夜听春语 2年前 ( ...

最新文章

  1. 如何在高精度下求解亿级变量背包问题?
  2. JAVA .xml 配置和 .properties 配置
  3. sqlite-jdbc jar包下载过程笔记
  4. 当我们在谈深度学习时,到底在谈论什么(二)--转
  5. 企业建设什么样的网站才能符合用户?
  6. java switch char_Java7中Switch为什么只支持byte、short、char、int、String
  7. shell编程之随机数和嵌套循环
  8. SQL必知必会-过滤数据
  9. Faster R-CNN源码中ROI Pooling的解析
  10. php输出语句echo、print、print_r、printf、sprintf、var_dump比较
  11. Leetcode120.三角形的最小路径和 -- DP算法
  12. 微服务发展的历史_三位一体的中台、微服务和云原生,揭示了软件架构的最新发展趋势...
  13. 2021年材料员-岗位技能(材料员)新版试题及材料员-岗位技能(材料员)考试试卷
  14. HRD 必须了解的持续绩效的优势
  15. win10显示隐藏文件_u盘内隐藏文件怎么显示 u盘内隐藏文件显示方法【详细步骤】...
  16. 关于tb双十一成交量
  17. 计算机控制系统开环控制有什么特点,自动控制系统基本控制方式?各有什么特点?...
  18. 红楼梦人物关系图,一代大师成绝响,下回分解待何人,kindle读书摘要
  19. 当社群本身具备活跃性,我们应该做什么
  20. 2018推荐的android手机,2018年7月份Android手机性价比排行榜

热门文章

  1. 优化MATLAB中quiver函数绘制箭头图或矢量图(1)-MATLAB开发
  2. Next.js---一个轻量级的 React SSR应用框架
  3. linux常用命令英文全称及其中文注释【史上最全】
  4. Unity Profiler Gfx.WaitForPresentOnGfxThread占用过高
  5. 【TJOI 2015】弦论
  6. CWnd 对象怎么和 HWND 窗口句柄相互转化
  7. 移除集合效率高还是add高_HashMap存取效率高原因、ArrayList和LinkedList区别、JAVA实现链表的基本功能...
  8. 鸿蒙系统上市时间p20pro,华为P20/20 Pro今日正式发布:外观配置详细汇总
  9. 另一半人马座,孟庭苇
  10. matlab实现BP算法,预测上证指数涨跌