猫史档案馆


【Python作品分享】忍者与飞镖【作品秀】

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


【作品展示】

center_image

 

【作品介绍】

这是一个有关飞镖的小游戏,忍者,射手,胜利究竟花落谁家~

 

【作品源代码】

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


回复

上一页1 页 / 共 1下一页
黄氏工业园部长hjc黄氏工业园部长hjc

我也比你早做出

center_image

点赞0


评论