python:点击就能玩的超级玛丽小游戏(附有源码)

程序代码

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()

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
你可以使用 Python 编程语言创建超级玛丽小游戏。有几种方法可以实现这个目标,以下是一种可能的方法: 1. 导入必要的模块:你可以使用 Pygame 或 Arcade 等游戏开发库来创建游戏。你需要先安装所选库,并在代码中导入它们。 2. 创建游戏窗口:使用所选的游戏开发库创建一个游戏窗口,设置窗口的大小、标题等等。 3. 加载游戏资源:为了创建超级玛丽小游戏,你需要一些图像和声音资源。将这些资源加载到你的游戏中,以便后续使用。 4. 创建角色和地图:创建超级玛丽和其他游戏角色,并设计游戏地图。地图可以由平台、障碍物和敌人等元素组成。 5. 处理用户输入:通过监听键盘事件来处理用户的输入。例如,当用户按下箭头键时,超级玛丽可以跳跃或移动。 6. 更新游戏状态:根据用户的输入和游戏规则,更新游戏中各个角色的状态。例如,检测碰撞、计算分数等等。 7. 渲染游戏画面:在每个游戏循环中,将游戏角色和地图等元素绘制到屏幕上,以显示最新的游戏画面。 8. 游戏循环:使用一个无限循环来不断更新游戏状态和渲染画面,以实现游戏的运行。 请注意,这只是一个简单的概述,并不涵盖所有细节。根据你的需求和技能水平,你可能需要进一步研究和扩展这个基本框架。你可以在网上找到更详细的教程和示例代码来帮助你开始编写超级玛丽小游戏。祝你好运!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值