分享创作 RPG 背包基础及各种进阶

不宕 · 2020年09月24日 · 最后由 cathalia 回复于 2020年12月15日 · 296 次阅读
本帖已被设为精华帖!

这里被迫放假的宕,终于把上周的坑埋完了。又是我们的RPG系列啦,这次带来的是背包的各种玩法,绝不水贴,干货满满,教程绝对对新手友好! 诚意满满

主要内容:1列举新手的一些简易背包操作(糊里糊涂就把你们都会可能。。的几种方法给列了)
2:是本贴核心,出现在我几个教程里的分页大法(思路来自魔凤啸天)
3:就是简单结合表格的做法()
4:本来想自动生成表格,可惜失败了,事实证明,不能懒,所以改成进去5,按获得顺序

注:虽然内容如上,但是我使用的储存数据方式是渐进的,从变量到数组,再到对象。
另外需要你知道一个概念影子替身,听起来很nb,其实就是我顺便取得,下面会慢慢讲解


=:var 苹果=1;var 苹果简介="这是苹果";var 大苹果=1

=:var 梨=1;var 梨简介="这是梨"

=:var 西瓜=1;

=:var 大西瓜=1;var 大西瓜简介="这是大西瓜"

=:var 菠萝=5;var 大菠萝=5

=://萌新代码
[0]
这一页是首页,我们先省略

上面是萌新部分的代码,其他帖子应该有就是MD.是可以储存到蝶梦的,var是不能储存的(js自己的),都是声明并赋值变量

[1]
[|]
苹果:(b)1(/b)
(j)苹果简介(/j)
这是无跳转的苹果
(j)苹果(/j)个<hr>
(b)2(/b)(b)3(/b)这是横放<hr>
(b)4(/b)(b)5(/b)这是跳转<hr>
(b)6(/b)
(b)7(/b)
这是竖放
选:吃
<:if(苹果==0){curBtn=null}
>:苹果--
选:大苹果
<:if(大苹果==0){curBtn=null}
>:大苹果--
选:梨
<:if(梨==0){curBtn=null}
选:西瓜
<:if(西瓜==0){curBtn=null}
>:game_jumpto("1a");var id=1
选:大西瓜
<:if(大西瓜==0){curBtn=null}
>:game_jumpto("1a");var id=2
选:菠萝[(j)菠萝(/j)]
<:if(菠萝==0){curBtn=null}
>:菠萝--
选:大菠萝[(j)大菠萝(/j)]
<:if(大菠萝==0){curBtn=null}
>:大菠萝--
选:全+1
>:菠萝++;大菠萝++;西瓜++;苹果++;大苹果++;梨++;大西瓜++
选:0
跳:1

苹果是直接显示所有且无跳转
梨和大苹果是横放,但是大苹果是直接减,梨是跳转到另一段(这里是横放所以可以自动补齐)
西瓜和大西瓜是跳同一段(上面的梨是跳以自己名字命名的段落)
菠萝和大菠萝是竖放(竖放不会自动补齐) curBtn=null在啸天进阶贴有(新手推荐了解,熟悉蝶梦;管理员的几个贴以及其他基础精贴推荐想做一些比较重程序的游戏)

[梨]
(b)1(/b)
(j)梨简介(/j)
这是梨
(j)梨(/j)个
选:吃
<:if(梨==0){curBtn=null}
>:if(梨!=0){梨--}
选:1

跳:梨

[1a]
=:if(id==1){var 显示名字="西瓜";var 显示数量=西瓜;var 显示简介="这是西瓜"};if(id==2){var 显示名字="大西瓜";var 显示数量=大西瓜;var 显示简介=大西瓜简介};

[|]
<center>(j)显示名字(/j)
(j)显示数量(/j)
(j)显示简介(/j)
选:吃
<:if(显示数量==0){curBtn=null}
>:switch(id){case 1:西瓜--;break;case 2:大西瓜--;break;}
选:1

跳:1a

这是从背包跳的不同俩段;只能对应一个,而下面1a这一段可以多个,只需加以区分

解读:在前面点击西瓜,会顺便设一个id,这是记忆用的工具变量,而id不同,在1a这段的显示也不同。
多个if判断id,来设显示用的工具变量,这个是可以变的,只是给人看。而最后使用(或者各种操作),通过switch(可以百度了解,等于if,但更简便),再次判断id来减(或者各种操作)

类比:给西瓜身份证(记忆变量),编号(id)为1,进入房间,查身份(id)后,把他的衣服(信息)发给模特(显示变量),模特穿id为1(对应为西瓜)的衣服出来展示,而有人要买他的衣服,就通过id(查是谁的衣服),然后从西瓜(信息本主)上修改

[2]
=:var 武器名=["南天剑","北冥刀","西门拳","东日轮"]

=:var 武器数量=[2,2,2,3]

=:var 武器有无=[1,1,1,1]

=:var 武器简介=["南天门下门天南","北冥有鱼有冥北","西门吹雪雪门西","东日轮回轮日东"]

=:var 页数=0

这里是数组,可以百度

解读:数组就是一个一维箱子,编号是0到无穷大,可以往里放东西,于是可以看成是带id的变量,这个id的力量超乎你的想象

[22]
=:for(var a=0;a<武器名.length;a++){if(武器数量[a]==0){武器名.splice(a,1);武器数量.splice(a,1);武器有无.splice(a,1);武器简介.splice(a,1);}}
[|]
当前页数(j)页数/2+1(/j)
点击详情版
(j)武器名[页数+1](/j)
(b)1(/b)
直接显示版
(j)武器名[页数+1](/j)((j)武器数量[页数+1](/j))(b)2(/b)
选:(j)武器名[页数](/j)
<:if(武器有无[页数]==undefined){curBtn=null}
>:game_jumpto("2a");var 传页=页数/2
选:出售
<:if(武器有无[页数+1]==undefined){curBtn=null}
>:武器数量[页数+1]--
选:上
>:if(页数!=0){页数-=2}
选:下
>:页数+=2
选:0

跳:22

分页大法详解:首先设一个分页变量为0,因为数组起手是0。要搞懂它,得明白它逻辑。页数对应的就是数组的id,上面的第一页,放的是0(数组id,如武器名[0],我们设页数为0,那么这就等于武器名[页数])和1,但是第二层就是2和3,物品自身的id变化了,页数对应不上了,如何让页数又是0又是2呢?在翻页的时候加(减)2,那么一开始的页数+1就可以又是1又是3了。
页数显示问题:页数变量/一页的个数+1(就是个找规律,你可以自己创其他公式)

而下面有个!=undefined是防止到了没有东西的一页报错(你也可以设最大页数)

上面的for,是为了吧没有(数量为0)的物品给splice掉(数组方法,百度),因为这一段没有用影子替身,所以要在原来的数组上进行修改

而这个多数组的存物品原理是:几个箱子叠罗汉,id一一对应,都有0,1,2......,所以如果是0,几个数组里的东西就都是关于南门剑的,其他也是如此(像我们地图一样,约等于二维)

[2a]
[|]
名字:(j)武器名[传页](/j)
个数:(j)武器数量[传页](/j)
简介:(j)武器简介[传页](/j)
选:卖
>:if(武器数量[传页]!=0){武器数量[传页]--}
选:22
跳:2a

这里的传页是记录数组id用,因为它是变的所以物品名[传页]也是变的,怎么样是不是比萌新那个简单多了?当然也可以不到另一段。

[3]
=:var 物品=[]

=:物品[0]={名字:"小红书",数量:1,类别:"其他",有无:1}

=:物品[1]={名字:"小米加步枪",数量:1,类别:"力量",有无:1}

=:物品[2]={名字:"镰刀",数量:1,类别:"工具",有无:1}

=:物品[3]={名字:"红高粱",数量:1,类别:"粮食",有无:1}

=:var 页数=0;var 背包=[];

这是数组+对象,和上面有本质区别。上面的还是数组(顶多是二维数组,且添加或删去比较麻烦),这个却已经是对象(但是保留了数组的id)。

类比:如果说上面是几个箱子叠在一起,一横为一类东西,一竖为一个东西的不同属性。这个就这是一个箱子,而每个格子里划分不同的带名字的区域,放同一个东西的不同属性


[33]
>:背包=[];for(var i=j=0;i<物品.length;i++){if(物品[i].数量==0){物品[i].有无=0};if(物品[i].有无==1){背包[j]=物品[i];j++}}
[|]
<style>td{width:10}</style>
<center><table border="2"><tr><td>(b)1(/b)</td><td>当前页数(j)页数/2+1(/j)</td><td>(b)2(/b)</td><td></td></tr><tr><td>名字</td><td>个数</td><td>类别</td><td></td></tr><tr><td>(j)if(背包[页数]!=undefined){背包[页数].名字}else{"无"}(/j)</td><td>(j)if(背包[页数]!=undefined){背包[页数].数量}(/j)</td><td>(j)if(背包[页数]!=undefined){背包[页数].类别}(/j)</td><td>(b)3(/b)</td></tr><tr><td>(j)if(背包[页数+1]!=undefined){背包[页数+1].名字}else{"无"}(/j)</td><td>(j)if(背包[页数+1]!=undefined){背包[页数+1].数量}(/j)</td><td>(j)if(背包[页数+1]!=undefined){背包[页数+1].类别}(/j)</td><td>(b)4(/b)</td></tr></table>
选:上
>:if(页数!=0){页数-=2}
选:下
>:页数+=2
选:出售
<:if(背包[页数]==undefined){curBtn=null}
>:背包[页数].数量--
选:出售
<:if(背包[页数]==undefined){curBtn=null}
>:背包[页数+1].数量--
选:0

跳:33

前面的物品可以看做是一个数据库,也就是可以不动的(可能你们的很多都是临时添加的),只是根据这个里东西的有无来把有的按数组id排序成另一个临时数组(也就是我老说的影子替身),而你在临时数组加减是可以加减到原始数组(也就是我们的库),因为我在上面说的,他属于object(对象),对象有个继承的特性(我也不会,自行百度)

:少了一部分,因为我这里没有的操作,如果采用这种方法,自行在判断里添加个如果数量大于0,有无等于1,这样子就可以不用在获得的时候改太多数据,只要物品++,当然如果你物品没有简介什么的其他属性,只有一个数量那么这个反而麻烦。

而且采用分页减少打表格的字了,但是有一点就是如果不是undefined才可以显示(这种操作很少见,如果耐心翻旧的蝶梦帖子,是可以看到的,蝶梦自己的显示方法,里面应该是可以放代码的,其他的我没试)不过有的人可能不会用表格,这样子可能会方便。

[4]
=:MD.物品=[]

=:function 物品(名字,数量,简介,有无,a){this.名字=名字,this.数量=数量,this.简介=简介,this.有无=有无}

=:MD.物品[0]=new 物品("语文书",1,"腹有诗书气自华",1);

=:MD.物品[1]=new 物品("数学书",1,"r=a(1-sinθ)",1);

=:function 物品2(a,b,c,d,e){this.名字=a,this.数量=b,this.简介=c,this.有无=d}

=:MD.物品[2]=new 物品2("历史书",1,"以史为鉴",1);

=:MD.物品[3]=new 物品2("英语书",1,"里面单词一个也看不懂",1);

=:var div;var 页数=0

又升级啦,这是构造函数(看不懂百度),唉之前都没怎么用中文,这次全中,又搞了个用MD.的来给大家看看耗不耗字数(自己作死因为压根没人看)

[44]

>:MD.背包=[];for(var i=j=0;i<MD.物品.length;i++){if(MD.物品[i].数量==0){MD.物品[i].有无=0};if(MD.物品[i].有无==1){MD.背包[j]=MD.物品[i];j++}}

=:var 真页数=页数/3+1;div="<table border='2'><tr><td></td><td>当前页数"+真页数+"</td><td></td></tr><tr><td>名字</td><td>个数</td><td>简介</td></tr>"

=:var 位数=页数;var 按钮=3;for(var i=0;i<3;i++){if(MD.背包[位数]!=undefined){var div1="<tr><td>"+MD.背包[位数].名字+"</td><td>"+MD.背包[位数].数量+"</td><td>"+MD.背包[位数].简介+"</td></tr>";位数++;按钮++;div+=div1}}

=:div+="</table>"

=:function 刷新(){document.getElementById("a").innerHTML=div}

=:var int=setInterval("刷新()",100)

=:function 减顺序(x){for(var i=0;i<排序.length;i++){if(x==排序[i]){排序.splice(i,1)}}}

=:var 排序=[2,4,1,3,5,0]

这个排序是5用的。然后上面那个自动生成在地图里出现过,是在蝶梦贪吃蛇帖子搬的,看得懂就看,顶多算是个思想,然后setInterval这个代码的用处十分之大,我几个帖子都用了(百度或论坛,建议看看)


[|]
<div id="a"></div>
(b)1(/b)(b)2(/b)
(j)if(MD.背包[页数]!=undefined){MD.背包[页数].名字+":"}(/j)(b)3(/b)
(j)if(MD.背包[页数+1]!=undefined){MD.背包[页数+1].名字+":"}(/j)(b)4(/b)
(j)if(MD.背包[页数+2]!=undefined){MD.背包[页数+2].名字+":"}(/j)(b)5(/b)
选:上
>:if(页数!=0){页数-=3}
选:下
>:页数+=3
选:出售
<:if(MD.背包[页数]==undefined){curBtn=null}
>:MD.背包[页数].数量--;减顺序(页数)
选:出售
<:if(MD.背包[页数+1]==undefined){curBtn=null}
>:MD.背包[页数+1].数量--;减顺序(页数+1)
选:出售
<:if(MD.背包[页数+2]==undefined){curBtn=null}
>:MD.背包[页数+2].数量--;减顺序(页数+2)
选:5
选:0

跳:44

这个失败了没啥好说的,不能懒,就完了。

[5]
=:var 页数=0;

=:MD.物品[4]=new 物品("数学练习册答案",1,"稍微看一眼,就一眼",1);

=:MD.物品[5]=new 物品("数学练习册",1,"共10000页",1);

[55]
>:MD.背包=[];for(var i=0;i<排序.length;i++){var a=排序[i];MD.背包[i]=MD.物品[a];MD.背包[i].原位置=a}
[|]
<center>当前页数(j)页数/3+1(/j)
(b)1(/b)<br>(j)if(MD.背包[页数]!=undefined){MD.背包[页数].简介}(/j)
(b)2(/b)<br>(j)if(MD.背包[页数+1]!=undefined){MD.背包[页数+1].简介}(/j)
(b)3(/b)<br>(j)if(MD.背包[页数+2]!=undefined){MD.背包[页数+2].简介}(/j)
选:(j)MD.背包[页数].名字(/j)((j)MD.背包[页数].数量(/j))
<:if(MD.背包[页数]==undefined){curBtn=null}
>:game_jumpto("555");MD.记录=页数
选:(j)MD.背包[页数+1].名字(/j)((j)MD.背包[页数+1].数量(/j))
<:if(MD.背包[页数+1]==undefined){curBtn=null}
>:game_jumpto("555");MD.记录=页数+1
选:(j)MD.背包[页数+2].名字(/j)((j)MD.背包[页数+2].数量(/j))
<:if(MD.背包[页数+2]==undefined){curBtn=null}
>:game_jumpto("555");MD.记录=页数+2
选:上
>:if(页数!=0){页数-=3}
选:下
>:页数+=3
选:0

跳:55

[555]
(j)MD.背包[MD.记录].名字(/j):(j)MD.背包[MD.记录].简介(/j)
选:出售
>:MD.背包[MD.记录].数量--;减顺序(MD.背包[MD.记录].原位置)
选:55

跳:55

上面那个排序还没说,就是就是放物品原始id的存储工具数组,如果你得到东西就push(数组用法)进去它的id,当然,搞快了少了东西,就是要先判断有没有,没有才能放最后

而生成影子替身,就直接用排序了,只要它没错,就不用管数量什么的了

:减数量的时候不应该这么快推,还得判断有没有,如果没在推。而在生成这个影子替身,需要记住它原位置,因为到另一个数组,它的id也变了(尽管他们是同一个),虽然你直接减(原对象也更改),但是它还会出现,因为我们的显示是通过排序的。所以在这种模式,排序这个工具数组才是爸爸。

而减顺序那里也少了,如果数量为0再splice(数组方法,百度)掉


差不多就这些了,又得鸽一阵子了。希望这个教程能对你有帮助有帮助的话点个赞,让我知道你会了

用全中文+一些MD.有点吃不消,接下来研究的多人战斗可能还是拼音为主,然后尽量用英文吧,不然拼音缩写是真让人看不懂(cf,你猜是什么?吃饭恰饭) ,然后自己的游戏可能会放寒假再出,这里打个广告,大家到时候记得来支持

共收到 2 条回复
adminer 将本帖设为了精华贴 10月10日 11:09
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册