- 注册时间
- 2006-8-4
- 最后登录
- 2010-1-2
⑥精研
- 积分
- 2084
|
这些天每天做一点,终于圆满了。虽然N次没有通过学校C语言考试,但幸运的是NS比C语言简单。
因为没有事前研究学习,不断修改程序中用错指令而出现的BUG实在是让我非常Orz
在此感谢热心教导我使用文字加法以及安排桌面按钮的CountD大人……
这是一个非常简陋的脚本,在此基础上可以慢慢丰富。
机器目前有中毒嫌疑,就不打包图片了,这些图片很简单,随手画一套放到pic文件夹即可
背景图800X600的一张:battle.jpg
纸牌图100X150的十五张:
heal10.jpg~heal50.jpg
ma10.jpg~ma50.jpg
phys10.jpg~phys50.jpg
(每套图片按钮的文件名数字部分都是10、20、30、40、50)
纸牌战斗的关键课题是:随机生成牌面、按钮的设置 以及 伤害循环计算
随机生成牌面的重点是:利用rnd对类型、面值各自随机分配,参见*setcard
将类型和面值直接对应到图片地址使用了文字变数加法。
按钮的重点是:输出当前属性-生成新牌面-记录新属性,参见*sendcard1~7
伤害循环计算部分没什么难点,因为敌人的纸牌用户不可见,所以就使用了临时抽出一张用一张的方式。
注:此程序中添加了浮动变量%451,但是为了测试双方数值输出是否正常而关闭
程序中添加的文字显示部分是为了测试时监视战斗状况,留有半角rp的安全隐患。
程序代码:
;mode800
*define
defsub setcard
defsub sendcard1
defsub sendcard2
defsub sendcard3
defsub sendcard4
defsub sendcard5
defsub sendcard6
defsub sendcard7
game
;==============================================
;###此程序中使用的变量注解-可能不全###
;%0 按钮专用变量
;%100 类型抽签用(%101备用)
;%102记载抽到的类型
;%103面值抽签用
;%104记载抽到的面值
;$100图片地址前缀
;$101牌的面值转为文字
;$102生成的图片地址
;%111-417桌面上七张纸牌的面值
;$111-417桌面上七张纸牌的类型
;%141我方当前出牌面值
;$141我方当前出牌类型
;$142我方上一次出牌类型
;$144敌方上一次出牌类型
;%126我方连锁数目
;%136敌方连锁数目
;%121,%131记录我方和敌方的初始HP值
;%151增加的纸牌随机浮动值(0~9)
;需要事先给定的:
;%122我方HP
;%123我方物理防御
;%124我方魔法防御
;%132敌方HP
;%133敌方物理防御
;%134敌方魔法防御
;==============================================
*setcard
rnd %100,10 ;在11个数中生成随机数。
if %100<1 mov %102,3 ;1/11的概率是类型3,回复类型
if %100<=5 && %100>0 mov %102,2 ;5/11的概率是魔法
if %100>5 mov %102,1 ;5/11的概率是物理
if %102=1 rnd %103,4:mov $100,"phys" ;物理类型下随机生成面值5种并且指定纸牌文字类型为phys
if %102=2 rnd %103,4:mov $100,"ma" ;参考上一条,文字类型为ma
if %102=3 rnd %103,4:mov $100,"heal" ;文字类型为heal
if %103=0 mov %104,10:mov $101,"10" ;纸牌的面值为10,在图片文件名中对应的数字部分为10
if %103=1 mov %104,20:mov $101,"20"
if %103=2 mov %104,30:mov $101,"30"
if %103=3 mov %104,40:mov $101,"40"
if %103=4 mov %104,50:mov $101,"50"
mov $102,":c;pic\"
add $102,$100
add $102,$101
add $102,".jpg" ;文字变量加法,计算图片的最终路径
return
*sendcard1 ;使用此按钮
mov $141,$111 ;输出类型到战斗当前牌$141
mov %141,%111 ;输出面值到战斗当前牌%141
setcard ;重置卡片
lsp 1,$102,35,415
mov $111,$100
mov %111,%104 ;重新记录此位置的卡片参数
return
*sendcard2
mov $141,$112
mov %141,%112
setcard
lsp 2,$102,140,415
mov $112,$100
mov %112,%104
return
*sendcard3
mov $141,$113
mov %141,%113
setcard
lsp 3,$102,245,415
mov $113,$100
mov %113,%104
return
*sendcard4
mov $141,$114
mov %141,%114
setcard
lsp 4,$102,350,415
mov $114,$100
mov %114,%104
return
*sendcard5
mov $141,$115
mov %141,%115
setcard
lsp 5,$102,455,415
mov $115,$100
mov %115,%104
return
*sendcard6
mov $141,$116
mov %141,%116
setcard
lsp 6,$102,560,415
mov $116,$100
mov %116,%104
return
*sendcard7
mov $141,$117
mov %141,%117
setcard
lsp 7,$102,665,415
mov $117,$100
mov %117,%104
return
;============================
*start
;下面是战斗开始前给定的数值
mov %122,200 ;我方HP
mov %132,200 ;敌方HP
mov %123,0 ;我方物理防御
mov %124,0 ;我方魔法防御
mov %133,0 ;敌方物理防御
mov %134,0 ;敌方魔法防御
*battle
bg ":c;pic\battle.jpg",10,500
setcard
lsp 1,$102,35,415
mov $111,$100
mov %111,%104
setcard
lsp 2,$102,140,415
mov $112,$100
mov %112,%104
setcard
lsp 3,$102,245,415
mov $113,$100
mov %113,%104
setcard
lsp 4,$102,350,415
mov $114,$100
mov%114,%104
setcard
lsp 5,$102,455,415
mov $115,$100
mov%115,%104
setcard
lsp 6,$102,560,415
mov $116,$100
mov%116,%104
setcard
lsp 7,$102,665,415
mov $117,$100
mov%117,%104
;发牌
btndef""
spbtn 1,1
spbtn 2,2
spbtn 3,3
spbtn 4,4
spbtn 5,5
spbtn 6,6
spbtn 7,7 ;转化对象1~7为按钮1~7
mov %121,%122 ;将初始HP记录到%121作参考,%122用来做战斗加减计算
mov %131,%132 ;%131为敌方HP初始值参考,%132用来计算
mov $142,"none" ;我方使用的前一张纸牌类型
mov $144,"none" ;敌方使用的前一张纸牌类型
mov %126,0 ;我方连锁数目
mov %136,0 ;敌方连锁数目
*myturn ;我方的行动
if %122<=0 goto *fail ;如果此时我方HP没有了,跳出到战斗失败,否则向下继续
btnwait2 %0
if %0<=0 goto *myturn
if %0=1 sendcard1
if %0=2 sendcard2
if %0=3 sendcard3
if %0=4 sendcard4
if %0=5 sendcard5
if %0=6 sendcard6
if %0=7 sendcard7
;我方已经从按钮的对应指令获得了当前卡片类型$141和面值%141
类型是$141面值是%141@
;rnd %151,9 ;计算附加浮动值(OFF)
if $141="phys" goto *physattack1 ;进入各自属性标签
if $141="ma" goto *maattack1
if $141="heal" goto *healbody1
*physattack1 ;我方的物理攻击
if $141=$142 inc %126 ;如果和上次类型相同,连续次数+1
if $141!=$142 mov $142,$141:mov %126,1 ;如果和上次类型不同,则读入新的类型,连续次数归0
mov %125,%141 ;读取面值
if %126=5 mul %125,3 ;连锁时攻击加倍
if %126=10 mul %125,6
add %125,%151 ;增加浮动值到伤害量
sub %125,%133 ;伤害量中扣去敌物理防御
if %125<0 mov %125,0 ;伤害低于防御值,则伤害等于0
sub %132,%125 ;计算敌血量
给敌人造成了%125物理伤害@
goto *enemyturn
*maattack1 ;我方的魔法攻击
if $141=$142 inc %126
if $141!=$142 mov $142,$141:mov %126,1
mov %125,%141
if %126=5 mul %125,3
if %126=10 mul %125,6
add %125,%151
sub %125,%134 ;伤害量中扣去敌魔法防御
if %125<0 mov %125,0
sub %132,%125
给敌人造成了%125魔法伤害@
goto *enemyturn
*healbody1
if $141=$142 inc %126
if $141!=$142 mov $142,$141:mov %126,1
mov %125,%141
if %126=5 mul %125,3
if %126=10 mul %125,6
add %125,%151 ;增加浮动值
add %122,%125 ;计算我方血量
if %122>%121 mov %122,%121 ;血量控制在初始值以下
自我治疗了%125点@
goto *enemyturn
*enemyturn ;敌人的行动回合
if %132>0 setcard ;如果敌的HP高于0,则敌方运行setcard获得卡片
if %132<=0 goto *win ;如果敌人HP小于等于0,则跳到我方胜利
;敌人HP高于0,攻击开始,敌人抽出要使用的卡片,当前类型为$100,卡片面值为%104
;rnd %151,9 ;计算浮动量(已关闭)
mov $143,$100 ;抽到的牌的属性给当前牌
敌的卡片类型是$143面值是%104@
if $143="phys" goto *physattack2 ;进入属性战斗标签
if $143="ma" goto *maattack2
if $143="heal" goto *healbody2
*physattack2
if $143=$144 inc %136 ;如果和上次类型相同,连续次数+1
if $143!=$144 mov $144,$143:mov %136,1 ;如果和上次类型不同,连续次数归原点
mov %135,%104 ;读取面值
if %136=5 mul %135,3 ;连锁到5次时攻击力3倍
if %136=10 mul %135,6 ;连锁到10次时攻击力6倍
add %135,%151 ;增加附加值
sub %135,%123 ;伤害量中扣去物理防御
if %135<0 mov %135,0 ;伤害达不到我方防御时,伤害为0
sub %122,%135 ;计算我方剩余HP
受到敌人%135物理伤害\
goto *myturn
*maattack2
if $143=$144 inc %136
if $143!=$144 mov $144,$143:mov %136,1
mov %135,%104
if %136=5 mul %135,3
if %136=10 mul %135,6
add %135,%151
sub %135,%124
if %135<0 mov %135,0
sub %122,%135
受到敌人%135魔法伤害\
goto *myturn
*healbody2
if $143=$144 inc %136
if $143!=$144 mov $144,$143:mov %136,1
mov %135,%104
if %136=5 mov mul %135,3
if %136=10 mul %135,6
add %135,%151
add %132,%135
if %132>%131 mov %132,%131 ;血量上限控制在初始值
敌人治疗了自己%135点\
goto *myturn
*fail
战斗失败@
goto *end
*win
战斗胜利@
*end
end |
|