分享
 
 
 

历史飞行棋》游戏设计

王朝other·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

游戏界面:

游戏规则:

1、玩家通过掷筛子掷出的点数大小来控制主角在地图中前进的步数,当玩家到达终点则游戏结束。

2、你将与两家聪明的电脑玩家同场竞技。(ai设定)

3、玩家点击右下角两个筛子掷筛,停止后可选择任意一个筛子的大小值作为角色前进的步数。

4、电脑和玩家轮流掷筛,轮到任意一方时将会有闪烁提示。并能够体现电脑的操作过程。

5、地图内设各种事件格,如:前进,后退,暂停等,将对棋子前进造成2次变化。(不会存在2次以上的变化)

6、如果两个棋子走到同1格停止,则后来的将会把原来的弹回出发点。

7、地图中设定练习格,当玩家的棋子走到该格子时将要完成练习题方能继续,该格的练习同时也消失,做对给10分,错误扣10分。(玩家的基础分为100分,同一次格内的练习只能做1次)

游戏分数:

玩家试题得分=(100+正确试题个数*10-错误试题个数*10)

玩家时间得分=int(100/到达终点分钟数)

最终分数=(玩家试题得分+玩家时间得分)*名次系数

第1名名次系数:1.5

第2名名次系数:1.2

第3名名次系数:1.0

游戏开发模块:

1、角色与筛子控制模块程序

2、电脑AI模块

3、地图生成模块

4、试题练习模块

5、评价模块

游戏主要代码:

这里我固定了c1表示玩家,c2,c3表示电脑

1.建立地图格子,为避免出现死循环,按照一定的顺序和规则进行.

functioncreatemap(){

//初始化格子信息

for(vari=1;i<=titleMaxnum;i++){

eval("t"+i).types=1;

}

//生成前进和后退格,从第4格开始,每隔4格随机产生一个

for(vari=4;i<=titleMaxnum;i+=4){

vartrnd=int(Math.random()*5)+1;

eval("t"+i).gotoAndStop(trnd);

eval("t"+i).types=trnd;

}

//生成暂停格

trace(getEmptyTitle().length);

varpausenum=8;

vart_array=getEmptyTitle();

varpause_d=int(t_array.length/pausenum);

for(vari=pause_d-1;i<=t_array.length-1;i+=pause_d){

t_array[i].gotoAndStop(6);

t_array[i].types=6;

}

//生成返回起点格

trace(getEmptyTitle().length);

varbacknum=3;

vart_array=getEmptyTitle();

varpause_d=int(t_array.length/backnum);

for(vari=pause_d-1;i<=t_array.length-1;i+=pause_d){

t_array[i].gotoAndStop(8);

t_array[i].types=8;

}

//生成时空隧道格

trace(getEmptyTitle().length);

varspacenum=6;

vart_array=getEmptyTitle();

varpause_d=int(t_array.length/spacenum);

for(vari=pause_d-1;i<=t_array.length-1;i+=pause_d){

t_array[i].gotoAndStop(7);

t_array[i].types=7;

}

//生成练习格

vartestnum=10;

vart_array=getEmptyTitle();

varpause_d=int(t_array.length/testnum);

for(vari=pause_d-1;i<=t_array.length-1;i+=pause_d){

t_array[i].gotoAndStop(9);

t_array[i].types=9;

}

}

2.获取空格信息,并返回数组

functiongetEmptyTitle(){

vart_array=[];

for(vari=1;i<=titleMaxnum;i++){

if(eval("t"+i).types==1){

t_array.push(eval("t"+i));

}

}

returnt_array;

}

3.控制筛子,随机扔,b1和b2为两个mc,里面共6帧

functionthrowPoint(){

trace("事件:玩家"+curplayer+"出筛子");

curflag=false;

b1.play();

b2.play();

throwid=setInterval(function(){

varb1_num=int(Math.random()*6)+1;

varb2_num=int(Math.random()*6)+1;

b1.gotoAndStop(b1_num);

b2.gotoAndStop(b2_num);

b1.values=b1_num;

b2.values=b2_num;

trace("第1个筛子的大小为:"+b1.values);

trace("第2个筛子的大小为:"+b2.values);

//throw_btn._visible=1;

curflag=true;

//电脑执行移动

if(curplayer<>1){

comai();

}

clearInterval(throwid);

},2000);

}

4.玩家轮流制控制

functionnextplayer(){

if(c1.overflag){

trace("游戏结束");

return;

}

//下一个玩家执行

if(curplayer==3){

curplayer=1;

if(!this["c"+curplayer].overflag){

if(!this["c"+curplayer].stopflag){

flashcast(this["c"+curplayer],true);

throw_btn._visible=1;

}else{

this["c"+curplayer].stopflag=false;

nextplayer();

}

}else{

nextplayer();

}

}else{

curplayer++;

if(!this["c"+curplayer].overflag){

if(!this["c"+curplayer].stopflag){

flashcast(this["c"+curplayer],true);

throwPoint();

}else{

this["c"+curplayer].stopflag=false;

nextplayer();

}

}else{

nextplayer();

}

}

}

《历史飞行棋》移动控制上采用了纯AS运算移动,另外本游戏采用了双筛子和随机地图,所以需要进行电脑选择筛子的判断,这里选择最优化的筛子进行移动就是电脑AI的所在.

5.控制棋子移动 使用了setInterval来控制时间,这里将每个title按顺序命名:t1,t2......

参数_who表示要移动的mc,如:c1,c2,c3,_step表示要移动的步数,该函数支持步数为负,即退.

functionmovecast(_who,_step){

trace("事件:移动"+_step);

flashcast(_who,false);

vardpos=_who.pos+_step;

vardr=true;

if(_step<0){

dr=false;

}

clearInterval(moveid);

moveid=setInterval(function(){

if(dr){

if(_who.pos<dpos){

if(_who.pos<=titleMaxnum){

_who.pos+=1;

if(_who.pos==titleMaxnum+1){

_who._x=_who.x00;

_who._y=_who.y00;

//执行后退

if(_who.pos-dpos<>0){

movecast(_who,_who.pos-dpos);

}else{

_who.overflag=true;

trace("事件:"+_who+"胜利!");

}

}else{

_who._x=eval("t"+_who.pos)._x+18;

_who._y=eval("t"+_who.pos)._y+11;

}

}

}else{

exeevent(_who);

clearInterval(moveid);

}

}else{

if(_who.pos>dpos){

_who.pos-=1;

_who._x=eval("t"+_who.pos)._x+18;

_who._y=eval("t"+_who.pos)._y+11;

}else{

exeevent(_who);

clearInterval(moveid);

}

}

},500);

}

6、AI设定,电脑的AI是人思维的体现,一个完善的AI应该是一个系统,应该是很多人智慧的结晶!

这不仅仅需要良好的程序结构,更需要总结人的操作过程。这里仅总结一下个人对AI的理解。

我常把电脑的智能操作分成几个等级,这样才能提高游戏的娱乐性,电脑什么都想到了游戏的价值就没有了,

何况人也有操作和分析失误的时候。

本游戏我将AI分为三个等级:

AI-1:这是一种随机的操作,从两个数中任意选择一个数。

//简单随机

varrnd=int(Math.random()*2)+1;

curstep=this["b"+rnd].values;

movecast(this["c"+curplayer],curstep);

AI-2:只简单的做一次判断,是否目的地是友好的。

if(b1.values<>b2.values){

varmaxnum;

varminnum;

if(b1.values>b2.values){

maxnum=b1;

minnum=b2;

}else{

maxnum=b2;

minnum=b1;

}

trace("tt"+maxnum.values);

vargood_array=[1,4,5,7,9];

for(vari=0;i<good_array.length;i++){

if(this["t"+this["c"+curplayer].pos+maxnum.values].types==good_array[i]){

curstep=maxnum.values;

movecast(this["c"+curplayer],curstep);

return;

}

}

for(vari=0;i<good_array.length;i++){

if(this["t"+this["c"+curplayer].pos+minnum.values].types==good_array[i]){

curstep=minnum.values;

movecast(this["c"+curplayer],curstep);

return;

}

}

curstep=maxnum.values;

movecast(this["c"+curplayer],curstep);

}else{

curstep=b1.values;

movecast(this["c"+curplayer],curstep);

}

AI-3:比较完善的分析,分别计算出选择每一个筛子后走出的最终效果得分,最后选择效果分高执行。

//ai2对两个筛子的最后结果大小进行比较

/*2:-1,3:-3,4:+1,5:+3,6:-5,7:+n,8:-n,碰撞其他人得分*/

//基础分等于2个筛子的大小可以提炼成为一个函数,根据who,_step就可以得出最终效果分数

varscore1=b1.values;

varscore2=b2.values;

//对b1进行判断最终得分

varpos0=this["c"+curplayer].pos+b1.values;

if(pos0<>titleMaxnum+1){

if(pos0>titleMaxnum+1){

varp0=(titleMaxnum+1)-this["c"+curplayer].pos;

pos0=(titleMaxnum+1)-(b1.values-p0);

deletep0;

}

//是否存在对手

score1+=checkhit_pos(pos0);

//退1

if(this["t"+pos0].types==2){

score1-=1;

score1+=checkhit_pos(pos0-1);

if(this["t"+(pos0-1)].types==6){

score1-=5;

}elseif(this["t"+(pos0-1)].types==7){

score1+=checksd_pos(pos0-1);

}elseif(this["t"+(pos0-1)].types==8){

score1-=this["c"+curplayer].pos;

}

}elseif(this["t"+pos0].types==3){

score1-=3;

score1+=checkhit_pos(pos0-3);

if(this["t"+(pos0-3)].types==6){

score1-=5;

}elseif(this["t"+(pos0-3)].types==7){

score1+=checksd_pos(pos0-3);

}elseif(this["t"+(pos0-3)].types==8){

score1-=this["c"+curplayer].pos;

}

}elseif(this["t"+pos0].types==4){

score1+=1;

score1+=checkhit_pos(pos0+1);

if(this["t"+(pos0+1)].types==6){

score1-=5;

}elseif(this["t"+(pos0+1)].types==7){

score1+=checksd_pos(pos0+1);

}elseif(this["t"+(pos0+1)].types==8){

score1-=this["c"+curplayer].pos;

}

}elseif(this["t"+pos0].types==5){

score1+=3;

score1+=checkhit_pos(pos0+3);

if(this["t"+(pos0+3)].types==6){

score1-=5;

}elseif(this["t"+(pos0+3)].types==7){

score1+=checksd_pos(pos0+3);

}elseif(this["t"+(pos0+3)].types==8){

score1-=this["c"+curplayer].pos;

}

}elseif(this["t"+pos0].types==6){

score1-=5;

}elseif(this["t"+pos0].types==7){

score1+=checksd_pos(pos0);

}elseif(this["t"+pos0].types==8){

score1-=this["c"+curplayer].pos;

}

}else{

//表示达到终点

score1+=10000;

}

//对b2进行判断最终得分

varpos0=this["c"+curplayer].pos+b2.values;

if(pos0<>titleMaxnum+1){

if(pos0>titleMaxnum+1){

varp0=(titleMaxnum+1)-this["c"+curplayer].pos;

pos0=(titleMaxnum+1)-(b2.values-p0);

deletep0;

}

//是否存在对手

score2+=checkhit_pos(pos0);

//退1

if(this["t"+pos0].types==2){

score2-=1;

score2+=checkhit_pos(pos0-1);

if(this["t"+(pos0-1)].types==6){

score2-=5;

}elseif(this["t"+(pos0-1)].types==7){

score2+=checksd_pos(pos0-1);

}elseif(this["t"+(pos0-1)].types==8){

score2-=this["c"+curplayer].pos;

}

}elseif(this["t"+pos0].types==3){

score2-=3;

score2+=checkhit_pos(pos0-3);

if(this["t"+(pos0-3)].types==6){

score2-=5;

}elseif(this["t"+(pos0-3)].types==7){

score2+=checksd_pos(pos0-3);

}elseif(this["t"+(pos0-3)].types==8){

score2-=this["c"+curplayer].pos;

}

}elseif(this["t"+pos0].types==4){

score2+=1;

score2+=checkhit_pos(pos0+1);

if(this["t"+(pos0+1)].types==6){

score2-=5;

}elseif(this["t"+(pos0+1)].types==7){

score2+=checksd_pos(pos0+1);

}elseif(this["t"+(pos0+1)].types==8){

score2-=this["c"+curplayer].pos;

}

}elseif(this["t"+pos0].types==5){

score2+=3;

score2+=checkhit_pos(pos0+3);

if(this["t"+(pos0+3)].types==6){

score2-=5;

}elseif(this["t"+(pos0+3)].types==7){

score2+=checksd_pos(pos0+3);

}elseif(this["t"+(pos0+3)].types==8){

score2-=this["c"+curplayer].pos;

}

}elseif(this["t"+pos0].types==6){

score2-=5;

}elseif(this["t"+pos0].types==7){

score2+=checksd_pos(pos0);

}elseif(this["t"+pos0].types==8){

score2-=this["c"+curplayer].pos;

}

}else{

//表示达到终点

score2+=10000;

}

//判断分数大小,并决定采用那个筛子

trace("______________利用ai-2结果如下_______________");

trace("第1个筛子的效果分:"+score1);

trace("第2个筛子的效果分:"+score2);

if(score1>=score2){

trace("采用第1个筛子进行命令");

trace("______________利用ai-2结果如上_______________");

curstep=b1.values;

movecast(this["c"+curplayer],curstep);

}else{

trace("采用第2个筛子进行命令");

trace("______________利用ai-2结果如上_______________");

curstep=b2.values;

movecast(this["c"+curplayer],curstep);

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有