用户:
寂陌本陌查看:0 回复:1 评论:0 创建时间:2023-05-06T21:16:51
【作品展示】

【作品介绍】
这是一个有关飞镖的小游戏,忍者,射手,胜利究竟花落谁家~
【作品源代码】
import pgzrun
TITLE = "Ninja Dart"
WIDTH = 1280
HEIGHT = 720
bg1 = Actor('bground') #封面
bg2 = Actor('bground2') #竞技场
heart = Actor('heart', (WIDTH/2, 100))
ninja = [Actor('lucas', (200, 540)), Actor('roger', (1080, 540))]
dart = [Actor('dart', (-50, 100)), Actor('dart', (-50, 100))]
#导入忍者角色列表和两个方向的飞镖列表
#左为NINJA,右为FIGHTER
jumpsp = [10, 10] #角色跳跃速度
dartsp = [15, -15] #飞镖移动速度,自左向右和自右向左
jump = [False, False] #跳跃状态
shoot = [False, False] #射击状态
initpos = [(100, 100), (100, 100)] #飞镖发射时的角色位置
HP = [5, 5] #HP生命值
gamestate = 'start' #游戏状态
def draw():
global gamestate, HP, WIDTH, HEIGHT #声明
if gamestate == 'start': #状态为准备时执行
bg1.draw() #绘制封面
#按下空格时状态为开始
if keyboard.space:
gamestate = 'go'
if gamestate == 'go': #状态为开始时执行
bg2.draw() #绘制背景和红心
heart.draw()
HPpos = [(400, 100), (880, 100)] # 生命值显示位置
#通过遍历绘制NINJA和FIGHTER及各自的生命值
for i in range(2):
ninja[i].draw()
dart[i].draw()
screen.draw.text('HP:'+str(HP[i]), center = HPpos[i], fontsize = 120, color = "#6666cc")
# 这里要将生命值转为字符串
#0第一次循环,绘制左侧角色及飞镖,在400,100位置显示其生命值
#1第二次循环,绘制右侧角色及飞镖,在880,100位置显示其生命值
if gamestate == '0over': #状态为0号失败
bg2.draw() #1号胜利,重绘背景
screen.draw.text('Fighter WIN!', center = (WIDTH/2, HEIGHT/2), fontsize = 150, color = '#666600')
if gamestate == '1over': #状态为1号失败
bg2.draw() #0号胜利,重绘背景
screen.draw.text('Ninja WIN!', center = (WIDTH/2, HEIGHT/2), fontsize = 150, color = '#666600')
def attack(index): #为攻击函数传入忍者的下标
global initpos, ninja, dart, shoot #声明
initpos[index] = ninja[index].x, ninja[index].y - 15 #设置飞镖的初始位置
dart[index].pos = initpos[index] #将初始位置变量赋值给飞镖
shoot[index] = True #将发射转态转为真
def colldet(ninja, dart, index): #为碰撞检测函数传入忍者及飞镖角色及下标
global HP #声明
if ninja.collidepoint(dart.pos): #判断是否被击中
if HP[index] > -1: #判断生命值是否大于或等于零
HP[index] -= 1 #生命值减少1
sounds.hit.play()
dart.x = WIDTH + 75
dart.y = HEIGHT - 75 #将飞镖移出边界将隐藏
def update():
global gamestate, jump, jumpsp, shoot #声明
if gamestate == 'go': #状态为开始时执行
#AD键控制NINJA移动,方向键控制FIGHTER移动
if keyboard.a:
ninja[0].x += -5 #向左移动5个像素,坐标减少使用负数
if keyboard.left:
ninja[1].x += -5
if keyboard.d:
ninja[0].x += 5 #向右移动5个像素,坐标增加使用正数
if keyboard.right:
ninja[1].x += 5
#W键控制NINJA跳跃,方向上键控制FIGHTER跳跃
if keyboard.w:
jump[0] = True #跳跃状态为真
if keyboard.up:
jump[1] = True
#V键控制NINJA射击,M键控制FIGHTER射击
if keyboard.v:
attack(0) #为下标为0的角色调用射击函数
if keyboard.m:
attack(1) #为下标为1的角色调用射击函数
for i in range(2): #因为有左右两个角色,故遍历2次(0,1)
if jump[i]: #跳跃为真时开始执行
#忍者跳跃时速度逐渐减小
if ninja[i].y <= 540:
ninja[i].y -= jumpsp[i] #忍者Y坐标逐渐减少模拟降落
jumpsp[i] -= 0.3 #跳跃速度逐渐减少进行缓降物理模拟
else: #否则将执行
#忍者落到地面时Y坐标终止变化
ninja[i].y = 540 #角色原坐标
jump[i] = False #跳跃状态为假
jumpsp[i] = 10 #跳跃速度初始化
if shoot[i]: #攻击为真时开始执行
if dart[i].x < WIDTH + 25: #飞镖是否在右边界以内
if dart[i].x > 50: #飞镖是否在左边界以内
dart[i].x += dartsp[i] #让飞镖向左/右飞行
dart[i].angle += 10 #飞镖飞行时进行旋转
#防止角色移动突破边界
if ninja[i].x < 75:
ninja[i].x = 75
if ninja[i].x > 1205:
ninja[i].x = 1205
#如果突破X轴最小值75,则禁止向左移动
#如果突破X轴最大值1205,则禁止向右移动
#调用攻击函数
colldet(ninja[0], dart[1], 0)
#如果0号角色被1号飞镖击中,就减去0号角色生命值
colldet(ninja[1], dart[0], 1)
#如果1号角色被0号飞镖击中,就减去1号角色生命值
#如果血量小于0计为失败
if HP[0] < 0:
gamestate = '0over'
if HP[1] < 0:
gamestate = '1over'
pgzrun.go()
【提示】
部分含有Python第三方库相关内容的作品,在海龟编辑器网页端无法运行哦!如遇到这种情况,可以打开下面的链接,下载海龟编辑器客户端:
https://python.codemao.cn