分享创作 [实战教程] 手把手教你做桌游

能宕就宕 · 2020年04月22日 · 最后由 能宕就宕 回复于 2020年05月08日 · 247 次阅读

大富翁实操

前言

游戏链接

好像链接有问题,得刷新一次

鉴于前面俩帖子都没怎么详细讲,这个帖子比较综合,就一起讲了。

注意 :我用Js比较多,推荐有一定基础再来看,小白建议去看看精贴,或者直走百度,左转W3school,右转菜鸟教程,我没把握能完全把你教会,我也是萌新。

下面是我前面俩分享帖子的链接,那个背包可以不看,自动补齐好像蝶梦已经有了。 mud地图

自动补齐背包

正文

接下来我们开始实战!

=:function timer(){MD.time2--;if(MD.time2<0){MD.time2=59;MD.time1--}}

=:MD.time2=0

=:MD.map1=function(name,lv,buy,sell,pass,people,ms){this.name=name,this.lv=lv,this.buy=buy,this.sell=sell,this.pass=pass,this.people=people,this.ms=ms}

=:MD.map=[];

=:MD.map[0]=new MD.map1("富翁银行",0,[0,0,0],[0,0,0],[0],"无","神秘镇长留下的遗产");MD.map[1]=new MD.map1("天堂旅馆",0,[2000,1500,2000],[1200,2100,3300],[1000,2000,3200],"无","小镇数一数二的旅馆");MD.map[2]=new MD.map1("郝豪酒店",0,[3000,2000,2000],[1800,3000,4200],[2000,3000,4000],"无","装修精良的豪气酒店");MD.map[4]=new MD.map1("续命奶茶",0,[1000,800,1000],[1000,2080,3000],[200,300,400],"无","一天我能喝八杯");

=:MD.map[3]=new MD.map1("大明咖啡",0,[1400,1000,2000],[1200,2100,3300],[400,500,600],"无","外出办公绝佳地点");MD.map[5]=new MD.map1("南方地铁",0,[2000,0,0],[1200,0,0],[1000,0,0],"无","不知道为啥叫这个名字");MD.map[6]=new MD.map1("中心商场",0,[4000,2500,2500],[3200,5800,5400],[3000,4000,5500],"无","一个让人进退不能的地方");

=:MD.map[7]=new MD.map1("快餐爷爷",0,[2200,1600,2200],[1400,2300,3500],[1200,2200,3600],"无","进口餐饮很吸引人");MD.map[8]=new MD.map1("静图书馆",0,[3000,0,0],[1800,0,0],[1000,0,0],"无","非宁静无以致远");MD.map[9]=new MD.map1("豪华小区",0,[8000,8000,8000],[4800,9600,14400],[1000,2000,3000],"无","致胜就靠它哈哈");MD.map[10]=new MD.map1("巨幕影院",0,[2600,2300,2300],[1600,2800,4000],[2000,2800,3500],"无","让人感动流泪");

=:MD.map[11]=new MD.map1("高山公园",0,[4000,2000,0],[2000,2100],[500,1000,0],"无","会当凌绝顶,一览众山小");MD.map[12]=new MD.map1("嘉木地铁",0,[2000,0,0],[1200,0,0],[1000,0,0],"无","南方的cp");MD.map[13]=new MD.map1("大游乐园",0,[3000,2000,3000],[1800,3000,3000],[1000,2000,3500],"无","满足你的刺激");

=:function 刷新(){document.getElementById("a").innerHTML="当前时间"+MD.time1+":"+MD.time2}

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

=:function 轮换(){var j;for(var i=9;i>=0;i--){j=i+1;lis[j]=lis[i]}}

=:function 机会(a){var x=random_int(1,6);switch(x){case 1:a.gold-=1000;{game_createmsg("股票大跌,失去1000","5","left",5)};break;case 2:a.stop+=1;{game_createmsg("摆摊,拘留一天","5","left",5)};break;case 3:a.gold+=1000;{game_createmsg("买彩票中奖,获得1000","3","left",5)};break;case 4:a.gold-=500;{game_createmsg("被人骗钱,失去500","5","left",5)};break;case 5:a.gold+=500;{game_createmsg("过生日,获得500","3","left",5)};break;case 6:a.gold+=1500;{game_createmsg("投资成功,获得1500","3","left",5)};break;}}

=:function 命运(a){var x=random_int(1,6);switch(x){case 1:a.stop+=1;{game_createmsg("生病住院一天","5","left",5)};break;case 2:a.stop+=1;{game_createmsg("酒驾,拘留一天","5","left",5)};break;case 3:a.gold-=1500;{game_createmsg("房子着火,失去1500","5","left",5)};break;case 4:a.gold-=1500;{game_createmsg("经济危机,失去1500","5","left",5)};break;case 5:a.gold-=500;{game_createmsg("小偷拆家,失去500","5","left",5)};break;case 6:a.gold-=1250;{game_createmsg("买劣质物品中毒,失去1250","5","left",5)};break;}}

=:function 房价(){var x=random_choice(1,2);{x=random_int(1,200)}if(x==1){mon-=x}else{mon+=x}}

这是我开始的数据库。
function是函数,这里用函数先准备好接下要用的 自动减时间(蜉蝣精贴),然后用构造函数来构造我们的地图,我做的不是很大,而且里面数据没有细究,建议大家有时间一定要推敲自己的作品!

然后我们把命运,机会弄了,我一开始忘记弄了,后面不好插入地图,只能改成骰到5,6分别是机会和命运。大家可以也设成map,对象里可以有方法(函数)。这里我用了switch循环,这个循环主要针对数字吧。

房价是武松帮我测试的时候的,我就弄个个上下浮动200,除了升级(会bug),都有随机。

那个轮换,是我根据星季工作室开源的帖子里的轮换系统精简的,可能他也改了,只是那个帖子还是简单的轮换。这里用for循环,对数组比较友好。

好的,我们进入下一步,主页面。

[首页]
[|]

<center>(2)<h3>欢迎来到富翁小镇</h3>(/2)(3)<h4>请选择游戏时长</h4>(/3)
选:2(安全版)
>:MD.time1=2
选:4
>:MD.time1=4
选:6
>:MD.time1=6
选:8
>:MD.time1=8

=:setInterval("timer()",1000)

=:var me={gold:12000,di:"富翁银行",id:0,stop:0,dipi:0};var you={gold:12000,di:"富翁银行",id:0,stop:0,dipi:0};var zt=1

>:var lis=["","","","","","","","","","","",""]

这里选时间和准备阶段,lis是轮换,me和you是我和敌人得对象,这就是对象的常规用法,var是方便操作,而且我们是即时游戏,不管存档。我测试基本是4分钟,2分钟基本上不会破产。6和8,到不了那么久了哈哈。

[1]
=:zt=1

=:if(me.gold<0){game_jumpto("lose")}

=:if(you.gold<0){game_jumpto("对5")}

=:if(MD.time1<0){game_jumpto("对5"),zt=5}
[|]
(2)<p id="a"></p>(/2)<table border="1" cellspacing="0"  align="center" width="350" height="200" valign="top"><tr><th>(b)1(/b)</th><th>(b)2(/b)</th><th>(b)3(/b)</th><th>(b)4(/b)</th></tr><tr><th>(b)14(/b)</th><th>我</th><th>敌人</th><th>(b)5(/b)</th></tr><tr><th>(b)13(/b)</th><th>(j)me.gold(/j)</th><th>(j)you.gold(/j)</th><th>(b)6(/b)</th></tr><tr><th>(b)12(/b)</th><th>(j)me.di(/j)</th><th>(j)you.di(/j)</th><th>(b)7(/b)</th><tr><th>(b)11(/b)</th><th>(b)10(/b)</th><th>(b)9(/b)</th><th>(b)8(/b)</th>
<center>(b)15(/b)(b)16(/b)
<hr><br>(4)(j)lis[1](/j)<br>(j)lis[2](/j)(/4)<br>(j)lis[3](/j)<br>(j)lis[4](/j)<br>(j)lis[5](/j)<br>(j)lis[6](/j)<br>(j)lis[7](/j)<br>(j)lis[8](/j)<br>(j)lis[9](/j)<br>(j)lis[10](/j)
选:(j)MD.map[0].name(/j)
>:var id=0
选:(j)MD.map[1].name(/j)
>:var id=1
选:(j)MD.map[2].name(/j)
>:var id=2
选:(j)MD.map[3].name(/j)
>:var id=3
选:(j)MD.map[4].name(/j)
>:var id=4
选:(j)MD.map[5].name(/j)
>:var id=5
选:(j)MD.map[6].name(/j)
>:var id=6
选:(j)MD.map[7].name(/j)
>:var id=7
选:(j)MD.map[8].name(/j)
>:var id=8
选:(j)MD.map[9].name(/j)
>:var id=9
选:(j)MD.map[10].name(/j)
>:var id=10
选:(j)MD.map[11].name(/j)
>:var id=11
选:(j)MD.map[12].name(/j)
>:var id=12
选:(j)MD.map[13].name(/j)
>:var id=13
选:行动
选:出售

跳:2

这是主页面,出售基本上用不到。不知道为什么表格只能在底下。 其实这就是个点点点的运气游戏,地图什么的都不管 id是索引,切记,索引很重要!数组+索引+for循环,黄金搭档,左右横跳都没关系~~ 妈妈再也不用担心我迷路了~ ~~

[2]
[|]
<center>(j)MD.map[id].name(/j)
所属:(j)MD.map[id].people(/j)
等级:(j)MD.map[id].lv(/j)
需要金币:(j)MD.map[id].buy[0](/j)/(j)MD.map[id].buy[1](/j)/(j)MD.map[id].buy[2](/j)
(j)MD.map[id].ms(/j)
选:出售
选:购买
<:if(zt!=2||MD.map[id].people=="你")curBtn = null
>:mon=MD.map[id].buy[0];if(me.gold<mon){game_createmsg("钱不够", "5", "left",  5)}else{房价();me.gold-=mon;MD.map[id].people="你";MD.map[id].lv=1;me.dipi+=1;game_createmsg("购买成功", "2", "left",  5);lis[0]="你成功购买"+me.di+",花费"+mon;轮换()}
选:升级
<:if(zt!=3)curBtn = null
>:switch(MD.map[id].lv){case 1:var mon=MD.map[id].buy[1];break;case 2:var mon=MD.map[id].buy[2];break;case 3:var mon=0;break;};if(mon==0){game_createmsg("已是最大等级", "5", "left",  5);if(me.gold<mon){game_createmsg("钱不够", "5", "left",  5)}else{MD.map[id].lv+=1;me.gold-=mon;game_createmsg("升级成功", "2", "left",  5);lis[0]="你成功升级"+me.di+",花费"+mon;game_jumpto("对方");轮换()}
选:返回
>:if(zt!=1){game_jumpto("对方")}else if(zt==5){game_jumpto("end")}else{game_jumpto("1")}

跳:2

行动都在一起,通过zt(状态,后面有介绍)区分,这样子省段省字 整个游戏300行不到,950字 这里我们的id就派上用场了!mon(ey)是多一个数据来和上面的浮动房价使用。

说起来我还没讲这些拼音的意思,me you就不说了,id就是当前地的id,di就是地名,dipi就是地皮数,gold就是钱 为什么不是money,大家可以直接设,可能有人会问为啥我不弄注释?因为小游戏而已,不需要。好,我们继续,有干货噢!

[出售]
=:var i=MD.map.length

=:var bag=[];var yes=0

=:for(var x=j=0;i>0;i--){if(MD.map[x].people=="你"){bag[j]=MD.map[x];j++};x++}
[出售2]
[|]
<center>第(j)yes/4+1(/j)页<br>你持有地皮数:(j)me.dipi(/j)<br>拥有金币:(j)me.gold(/j)<br>(b)1(/b)<br>(b)2(/b)<br>(b)3(/b)<br>(b)4(/b)
选:(j)bag[yes].name(/j)
<:if(bag[yes]==undefined){curBtn=null}
>:var iid=yes
选:(j)bag[yes+1].name(/j)
<:if(bag[yes+1]==undefined){curBtn=null}
>:var iid=yes+1
选:(j)bag[yes+2].name(/j)
<:if(bag[yes+2]==undefined){curBtn=null}
>:var iid=yes+2
选:(j)bag[yes+3].name(/j)
<:if(bag[yes+3]==undefined){curBtn=null}
>:var iid=yes+3
选:上一页
<:if(yes==0){curBtn=null}
>:yes=yes-4;game_jumpto("出售2")
选:下一页
>:yes=yes+4;game_jumpto("出售2")
选:返回
>:if(zt==3||zt==2){game_jumpto("2")}else if(zt==5){game_jumpto("end")}else{game_jumpto("1")}

跳:出售3
[出售3]
[|]
<center>(j)bag[iid].name(/j)
所属:(j)bag[iid].people(/j)
等级:(j)bag[iid].lv(/j)
出售可得金币(j)bag[iid].sell[0](/j)/(j)bag[iid].sell[1](/j)/(j)bag[iid].sell[2](/j)
(j)bag[iid].ms(/j)
选:出售
>:switch(bag[iid].lv){case 1:mon=bag[iid].sell[0];break;case 2:mon=bag[iid].sell[1];break;case 3:mon=bag[iid].sell[2];break;};房价();bag[iid].people="无";bag[iid].lv=0;me.gold+=mon;game_createmsg("出售成功", "2", "left",  5);lis[0]="你成功出售"+bag[iid].name+",得到"+mon;轮换();me.dipi-=1;
选:返回
>:game_jumpto("出售")

跳:出售3

开头那段熟悉不,看过完帖子的都认识啦 我知道你没看 没错,自动补齐背包搬过来的,神奇吧,虽然自动背包做不成,当筛子还是妥妥的 自动筛子(误) 所以说程序都是互通有无的。

这里重点说一下分层背包,思路源于魔凤啸天,虽然不知道我这样就开源会不会被打,我相信他不会的啦,反正他也不上蝶梦?(小声bb)原理是通过页数索引iid,为什么不是id?前面不是有了么,区分呀!哈哈。

这可以算是自动补齐分层背包?咱们继续!

[3]
[|]
<center>(j)MD.map[id].name(/j)
所属:(j)MD.map[id].people(/j)
等级:(j)MD.map[id].lv(/j)
通过所需金币(j)MD.map[id].pass[0](/j)/(j)MD.map[id].pass[1](/j)/(j)MD.map[id].pass[2](/j)
(j)MD.map[id].ms(/j)
选:缴费
>:switch(MD.map[id].lv){case 1:var mon=MD.map[id].pass[0];break;case 2:var mon=MD.map[id].pass[1];break;case 3:var mon=MD.map[id].pass[2];break;};房价();me.gold-=mon;you.gold+=mon;if(me.gold<0){game_jumpto("lose")}else{game_createmsg("缴费成功", "2", "left",  5);lis[0]="你经过"+me.di+",缴费"+mon;轮换();}

跳:对方
[行动]
=:if (me.stop!=0){me.stop-=1;game_jumpto("对方")}

=:shai=0

=:shai=random_int_adv([[1,4],0.8],[[5,6],0.2])

=:switch(shai){case 1:game_createmsg("骰到1", "3", "left",  5);break;case 2:game_createmsg("骰到2", "3", "left",  5);break;case 3:game_createmsg("骰到3", "3", "left",  5);break;case 4:game_createmsg("骰到4", "3", "left",  5);break;case 5:game_createmsg("你骰到5,机会", "3", "left",  5);break;case 6:game_createmsg("你骰到6,命运", "3", "left",  5);break;}

=:if(shai==5){机会(me);game_jumpto("对方")};if(shai==6){命运(me);game_jumpto("对方")}

等:1

=:me.id=shai+me.id;if(me.id>13){me.id=me.id-13,me.gold+=2000,game_createmsg("获得额外收入2000", "2", "left",  5)};me.di=MD.map[me.id].name;

<center>你来到(j)me.di(/j)

=:var id=me.id;if(MD.map[me.id].people=="无"){zt=2;game_jumpto("2")}else if(MD.map[me.id].people=="你"){zt=3;game_jumpto("2")}else{game_jumpto("3")}

缴费和行动。缴费分开一段,因为他显示的是对方的。然后行动就是中枢啦,所以必须得有等,不然太快会卡死?前面就是冰山一角,咱们后端波涛汹涌着呢。

骰子判断步数来增加id,判断di来调整zt。发现没,switch就是个宝藏代码呀!哪都有他。

[对方]
=:if (you.stop!=0){you.stop-=1;game_jumpto("1")}

=:shai=0

=:shai=random_int_adv([[1,4],0.8],[[5,6],0.2])

=:switch(shai){case 1:game_createmsg("对方骰到1", "3", "left",  5);break;case 2:game_createmsg("对方骰到2", "3", "left",  5);break;case 3:game_createmsg("对方骰到3", "3", "left",  5);break;case 4:game_createmsg("对方骰到4", "3", "left",  5);break;case 5:game_createmsg("对方骰到5,机会", "3", "left",  5);break;case 6:game_createmsg("对方骰到6,命运", "3", "left",  5);break;}

=:if(shai==5){机会(you);game_jumpto("1")};if(shai==6){命运(you);game_jumpto("1")};

等:1

=:you.id=shai+you.id;if(you.id>13){you.id=you.id-13,you.gold+=2000,game_createmsg("对方获得额外收入2000", "2", "left",  5)};you.di=MD.map[you.id].name;

<center>对方来到(j)you.di(/j)

=:var id=you.id;if(MD.map[you.id].people=="无"){game_jumpto("对2")}else if(MD.map[you.id].people=="对方"){game_jumpto("对3")}else{game_jumpto("对4")}


[对2]
>:mon=MD.map[id].buy[0];if(you.gold>mon){房价();you.gold-=mon;MD.map[id].people="对方";MD.map[id].lv=1;you.dipi+=1;game_createmsg("对方购买成功", "2", "left",  50);lis[0]="对方成功购买"+you.di+",花费"+mon;轮换()}

等:1

跳:1
[对3]
>:switch(MD.map[id].lv){case 1:var mon=MD.map[id].buy[1];break;case 2:var mon=MD.map[id].buy[2];break;case 3:var mon=0;break;}if(you.gold<mon){game_jumpto("1")}else if(mon==0){game_jumpto("1")}else{MD.map[id].lv+=1;房价();you.gold-=mon;game_createmsg("对方升级成功", "2", "left",  50);lis[0]="对方成功升级"+you.di+",花费"+mon;轮换()}

等:1

跳:1
[对4]
>:switch(MD.map[id].lv){case 1:var mon=MD.map[id].pass[0];break;case 2:var mon=MD.map[id].pass[1];break;case 3:var mon=MD.map[id].pass[2];break;};房价();you.gold-=mon;me.gold+=mon;if(you.gold<0){game_jumpto("对5")}else{game_createmsg("对方缴费成功", "2", "left",  50);lis[0]="对方经过"+you.di+",缴费"+mon;轮换()}

等:1

跳:1

这就是我们敌人的后台了,你品,是不是很前面我们的那个很像,简直一模一样,没错,搬过来的,哈哈。

咱们小游戏,不需要太nb的ai(也做不出),像江湖,幻想,高自由度的,都得有个个合理的ai来平衡游戏,不然就是你一个小拳拳,我一个大招了。

接下来,硬核循环走一波!

[对5]
=:var i=MD.map.length;var bag=[];var i;var bagid=[]

=:for(var x=j=0;i>0;i--){if(MD.map[x].people=="对方"){bag[j]=MD.map[x];bagid[j]=x;j++};x++}

=:if(you.gold<0)game_createmsg("对方已负债,开始变卖资产", "5", "left",  50);

=:for(var x=y=z=0;x<bag.length;x++){switch(bag[x].lv){case 1:y=bag[x].sell[0];break;case 2:y=bag[x].sell[1];break;case 3:y=bag[x].sell[2];break;};if(i!=0){if(y<i){i=y;z=bagid[x]}}else{i=y;z=bagid[x]}}

[对6]

=:if(i!=0){mon=i;房价();you.gold+=mon;MD.map[z].people="无";MD.map[z].lv=0;you.dipi-=1;lis[0]="对方成功出售"+MD.map[z].name+",得到"+mon;轮换();}

=:if(you.gold>0&&zt!=5){game_jumpto("1")}

=:if(zt==5&&you.dipi!=0){game_jumpto("对5")};if(zt==5&&you.dipi==0){game_jumpto("end")}

=:if(you.gold<0&&you.dipi==0){game_jumpto("win")}else{game_jumpto("对5")}

跳:1
[end]
[|]
<center>时间过得真快,小镇已经度过了一年。
请把你所有资产卖了再来
你的资产:(j)me.gold(/j)
对方资产:(j)you.gold(/j)
选:出售
选:确定
>:if(me.gold>=you.gold){game_jumpto("win2")}else{game_jumpto("lose2")}

[win]
成功:对方已破产,你成为小富翁了

[lose]
你已负债,是否变卖资产?
选:是
>:game_jumpto("出售")
选:否
>:if(me.gold>=0){game_jumpto("对方")}

[lose1]
失败:你已破产,商战艰难,下次加油

你出售,人家也得出售呀,上面对234分别是购买升级缴费,这里可不一样,卖房。负资产了得赶紧出手房子呀,通过筛子过一遍,然后再筛一遍,第一遍你知道,第二遍呢?当然是选最便宜的卖啦,一个不行再来一个,影响不大。或者你们可以选最大的,反正就这样,俩个for,精准!

后记

花了3天,俩天码程序,今天清bug。比较粗糙了,但是挺快乐的,被敌人吊打好几回(没暗箱操作)。可能还有bug,就这样了,也开学了。

说说花絮吧,开始弄机会命运,6选1几率大的我,绝望,虽然现在也有可能,一盘敌人死命抽6,一直被封,笑死我了。有一次测试,我1万元,给我锁住了,说我负债,我给气的。

大家都不容易,这不是件好玩的事,还很耗时间,但是我们都是用爱发电。

木叶飞舞之处,火亦生生不息!

愿蝶梦不倒,我们不散!

共收到 1 条回复

https://www.iwzyx.com/chapters/12429 新跑酷小游戏,暂不做实战教程 没注释,自己都看不懂

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册