《历史飞行棋》游戏设计

设计

  游戏界面:

游戏规则:
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.建立地图格子,为避免出现死循环,按照一定的顺序和规则进行.
function createmap() {
 //初始化格子信息
 for (var i = 1; i<=titleMaxnum; i++) {
  eval("t"+i).types = 1;
 }
 //生成前进和后退格,从第4格开始,每隔4格随机产生一个
 for (var i = 4; i<=titleMaxnum; i += 4) {
  var trnd = int(Math.random()*5)+1;
  eval("t"+i).gotoAndStop(trnd);
  eval("t"+i).types = trnd;
 }
 //生成暂停格 
 trace(getEmptyTitle().length);
 var pausenum = 8;
 var t_array = getEmptyTitle();
 var pause_d = int(t_array.length/pausenum);
 for (var i = pause_d-1; i<=t_array.length-1; i += pause_d) {
  t_array[i].gotoAndStop(6);
  t_array[i].types = 6;
 }
 //生成返回起点格
 trace(getEmptyTitle().length);
 var backnum = 3;
 var t_array = getEmptyTitle();
 var pause_d = int(t_array.length/backnum);
 for (var i = pause_d-1; i<=t_array.length-1; i += pause_d) {
  t_array[i].gotoAndStop(8);
  t_array[i].types = 8;
 }
 //生成时空隧道格
 trace(getEmptyTitle().length);
 var spacenum = 6;
 var t_array = getEmptyTitle();
 var pause_d = int(t_array.length/spacenum);
 for (var i = pause_d-1; i<=t_array.length-1; i += pause_d) {
  t_array[i].gotoAndStop(7);
  t_array[i].types = 7;
 }
 //生成练习格
 var testnum = 10;
 var t_array = getEmptyTitle();
 var pause_d = int(t_array.length/testnum);
 for (var i = pause_d-1; i<=t_array.length-1; i += pause_d) {
  t_array[i].gotoAndStop(9);
  t_array[i].types = 9;
 }
}
2.获取空格信息,并返回数组
function getEmptyTitle() {
 var t_array = [];
 for (var i = 1; i<=titleMaxnum; i++) {
  if (eval("t"+i).types == 1) {
   t_array.push(eval("t"+i));
  }
 }
 return t_array;
}3.控制筛子,随机扔,b1和b2为两个mc,里面共6帧
function throwPoint() {
 trace("事件:玩家"+curplayer+"出筛子");
 curflag = false;
 b1.play();
 b2.play();
 throwid = setInterval(function () {
  var b1_num = int(Math.random()*6)+1;
  var b2_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.玩家轮流制控制
function nextplayer() {
 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();
  }
 }

  Flash动画:

  《历史飞行棋》移动控制上采用了纯AS运算移动,另外本游戏采用了双筛子和随机地图,所以需要进行电脑选择筛子的判断,这里选择最优化的筛子进行移动就是电脑AI的所在.
5.控制棋子移动 使用了setInterval来控制时间,这里将每个title按顺序命名:t1,t2......
参数_who表示要移动的mc,如:c1,c2,c3,_step表示要移动的步数,该函数支持步数为负,即退.

function movecast(_who, _step) {
 trace("事件:移动"+_step);
 flashcast(_who, false);
 var dpos = _who.pos+_step;
 var dr = 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:这是一种随机的操作,从两个数中任意选择一个数。

//简单随机
var rnd = int(Math.random()*2)+1;
curstep = this["b"+rnd].values;
movecast(this["c"+curplayer], curstep);
AI-2:只简单的做一次判断,是否目的地是友好的。

if (b1.values<>b2.values) {
 var maxnum;
 var minnum;
 if (b1.values>b2.values) {
 maxnum = b1;
 minnum = b2;
 } else {
 maxnum = b2;
 minnum = b1;
 }
 trace("tt"+maxnum.values);
 var good_array = [1, 4, 5, 7, 9];
 for (var i = 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 (var i = 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就可以得出最终效果分数
 var score1 = b1.values;
 var score2 = b2.values;
 //对b1进行判断最终得分
 var pos0 = this["c"+curplayer].pos+b1.values;
 if (pos0<>titleMaxnum+1) {
  if (pos0>titleMaxnum+1) {
   var p0 = (titleMaxnum+1)-this["c"+curplayer].pos;
   pos0 = (titleMaxnum+1)-(b1.values-p0);
   delete p0;
  }
  //是否存在对手 
  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;
   } else if (this["t"+(pos0-1)].types == 7) {
    score1 += checksd_pos(pos0-1);
   } else if (this["t"+(pos0-1)].types == 8) {
    score1 -= this["c"+curplayer].pos;
   }
  } else if (this["t"+pos0].types == 3) {
   score1 -= 3;
   score1 += checkhit_pos(pos0-3);
   if (this["t"+(pos0-3)].types == 6) {
    score1 -= 5;
   } else if (this["t"+(pos0-3)].types == 7) {
    score1 += checksd_pos(pos0-3);
   } else if (this["t"+(pos0-3)].types == 8) {
    score1 -= this["c"+curplayer].pos;
   }
  } else if (this["t"+pos0].types == 4) {
   score1 += 1;
   score1 += checkhit_pos(pos0+1);
   if (this["t"+(pos0+1)].types == 6) {
    score1 -= 5;
   } else if (this["t"+(pos0+1)].types == 7) {
    score1 += checksd_pos(pos0+1);
   } else if (this["t"+(pos0+1)].types == 8) {
    score1 -= this["c"+curplayer].pos;
   }
  } else if (this["t"+pos0].types == 5) {
   score1 += 3;
   score1 += checkhit_pos(pos0+3);
   if (this["t"+(pos0+3)].types == 6) {
    score1 -= 5;
   } else if (this["t"+(pos0+3)].types == 7) {
    score1 += checksd_pos(pos0+3);
   } else if (this["t"+(pos0+3)].types == 8) {
    score1 -= this["c"+curplayer].pos;
   }
  } else if (this["t"+pos0].types == 6) {
   score1 -= 5;
  } else if (this["t"+pos0].types == 7) {
   score1 += checksd_pos(pos0);
  } else if (this["t"+pos0].types == 8) {
   score1 -= this["c"+curplayer].pos;
  }
 } else {
  //表示达到终点
  score1 += 10000;
 }
 //对b2进行判断最终得分
 var pos0 = this["c"+curplayer].pos+b2.values;
 if (pos0<>titleMaxnum+1) {
  if (pos0>titleMaxnum+1) {
   var p0 = (titleMaxnum+1)-this["c"+curplayer].pos;
   pos0 = (titleMaxnum+1)-(b2.values-p0);
   delete p0;
  }
  //是否存在对手 
  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;
   } else if (this["t"+(pos0-1)].types == 7) {
    score2 += checksd_pos(pos0-1);
   } else if (this["t"+(pos0-1)].types == 8) {
    score2 -= this["c"+curplayer].pos;
   }
  } else if (this["t"+pos0].types == 3) {
   score2 -= 3;
   score2 += checkhit_pos(pos0-3);
   if (this["t"+(pos0-3)].types == 6) {
    score2 -= 5;
   } else if (this["t"+(pos0-3)].types == 7) {
    score2 += checksd_pos(pos0-3);
   } else if (this["t"+(pos0-3)].types == 8) {
    score2 -= this["c"+curplayer].pos;
   }
  } else if (this["t"+pos0].types == 4) {
   score2 += 1;
   score2 += checkhit_pos(pos0+1);
   if (this["t"+(pos0+1)].types == 6) {
    score2 -= 5;
   } else if (this["t"+(pos0+1)].types == 7) {
    score2 += checksd_pos(pos0+1);
   } else if (this["t"+(pos0+1)].types == 8) {
    score2 -= this["c"+curplayer].pos;
   }
  } else if (this["t"+pos0].types == 5) {
   score2 += 3;
   score2 += checkhit_pos(pos0+3);
   if (this["t"+(pos0+3)].types == 6) {
    score2 -= 5;
   } else if (this["t"+(pos0+3)].types == 7) {
    score2 += checksd_pos(pos0+3);
   } else if (this["t"+(pos0+3)].types == 8) {
    score2 -= this["c"+curplayer].pos;
   }
  } else if (this["t"+pos0].types == 6) {
   score2 -= 5;
  } else if (this["t"+pos0].types == 7) {
   score2 += checksd_pos(pos0);
  } else if (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);
 } 

时间: 2024-12-06 07:14:32

《历史飞行棋》游戏设计的相关文章

C#飞行棋小程序设计代码_C#教程

飞行棋游戏大家应该都玩过吧,如何使用C#语言进行编写,本文实例就为大家分享了飞行棋C#实现代码,供大家参考,具体内容如下 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Pachee { class Program { #region 静态字段 // 关卡数量 public static int

《游戏机制——高级游戏设计技术》一2.1 突现和渐进的历史

2.1 突现和渐进的历史 游戏机制--高级游戏设计技术突现和渐进这种分类方法,由游戏研究者Jesper Juul在论文<The Open and the Closed: Games of Emergence and Games of Progression>(2002)中首次提出.简单地说,突现型游戏就是那些规则相对简单,但变化多样的游戏.之所以用突现(emergence)这个词,是因为这类游戏的挑战和事件流程并非事先安排好,而是在游戏进行的过程中显现出来的.突现现象由各种可能的规则组合所产生

《游戏机制——高级游戏设计技术》一1.2 离散机制vs.连续机制

1.2 离散机制vs.连续机制 游戏机制--高级游戏设计技术我们已经列出了五种游戏机制,但我们还需说明另一个重要的机制区分方法,即机制可以是离散的(discrete)或连续的(continuous).现代游戏倾向于通过精确地模拟物理机制(包括前面阐述过的时机和节奏)来创造出流畅.连续的游戏流程,在这种情况下,将一个游戏物体左右移动半个像素就可能产生巨大的影响.为了最大限度保证精确性,游戏在计算物理机制时需要高度精确到若干位小数,这就是我们所说的连续机制(continuous mechanics)

Silverlight网页游戏设计思想(WebGame Essence):(一)动态资源

即开即玩是网页游戏相比传统客户端游戏的最大优势.如果说在每台电脑安装上G的客户端是一种资源浪费及时间污染:那么 Silverlight作为RIA界的新宠儿,在继承祖辈优秀血统的前提下拥有更加卓越的性能及更为曼妙的动态表现,势将引领网络未来世界进入那 令人神往的低碳空间. 笔者学习Silverlight开发1年有余,在写第一部Silverlight游戏系列教程时为了尽快的实现目标而将所有素材资源打包进XAP中.与其 他Silverlight初学者一样,这或许是我们所必须会经历的一个过程.QXGam

游戏设计中的锁机制

这篇文章是关于游戏设计中一个普通细节的,我把它称为"锁"机制.尽管"锁"这种概念在很多类型的游戏中都会出现,但是它对于冒险游戏和角色扮演游戏(RPG)来说有着非同小可的作用. 游戏设计师为了做出高品质的RPG或冒险游戏,往往需要做大量的工作.必须架构一个完整的世界.如果一个玩家可以操作他的角色不受限制的穿越整个世界,那么他必然会错过很多精心设计的地区. 为了避免这个问题,设计师在游戏中加入了"锁"的概念.这就保证了玩家在探索完足够的区域后才能进入

《游戏机制——高级游戏设计技术》一1.4 原型制作技术

1.4 原型制作技术 游戏机制--高级游戏设计技术 原型是产品或工序的一个模型,它通常是预备性的.不完整的.它的作用是在产品实际制造出来之前测试产品的可用性.由于原型不像最终产品那样需要仔细润饰和打磨,因此它构建和修改起来更为快速且廉价.游戏设计师制作原型来测试游戏的机制和可玩性.游戏设计师经常使用的原型技术有软件原型(software prototype).纸面原型(paper prototype)和物理原型(physical prototype). 1.4.1 一些术语 多年以来,软件开发者

《游戏机制——高级游戏设计技术》一导读

前 言 游戏机制--高级游戏设计技术 这是一本涉及游戏最深层次的书.一个游戏无论看上去多么棒,如果其机制乏味或失衡,那么它玩起来就不会有趣.游戏机制产生可玩性,要创造出优秀的游戏,你必须懂得这件事之中的道理. 本书将告诉你如何设计.测试及调整游戏的核心机制.这些理论适用于任何游戏-从庞大的角色扮演游戏(RPG,role-playing game)到手机休闲游戏,再到传统的桌上游戏(board game).在学习过程中,我们会使用大量你可能已经耳熟能详的实际游戏作品作为案例,包括<吃豆人>(Pa

《游戏机制——高级游戏设计技术》一1.1 规则定义游戏

1.1 规则定义游戏 游戏机制--高级游戏设计技术 游戏这个概念有很多不同的定义.但大多数说法都同意:规则是游戏的本质特性.例如,在<Fundamentals of Game Design>一书中,Ernest Adams是如此定义游戏的: 游戏是在一个模拟出来的真实环境中,参与者遵照规则行动,尝试完成至少一个既定的重要目标的游乐性活动. 在<Rules of Play>中,Katie Salen和Eric Zimmerman提出如下定义: 游戏是一个让玩家在规则的约束下参与模拟的

微软Dream.Build.Play游戏设计大赛今天开始报名

北京时间3月1日上午消息,微软2011年Dream.Build.Play游戏设计大赛今天开始报名,独立游戏开发商可于5月17日至6月14日间提交游戏作品,参与大奖角逐. 参赛游戏针对Xbox 360平台,均需使用XNA Game Studio开发.四名优胜者将分享总计75000美元的奖金,还有机会获得一份Xbox LIVE Arcade出版合同:其中大奖奖金为40000美元,一等奖为20000美元,二等奖为10000美元,三等奖为5000美元. 微软Xbox先进技术团队研发主管马克·塞米那托尔(