首页  韩国资源  酷站加油  我的展厅  设计名站  古典元素  推荐下载  设计欣赏  每周专访  招募精英  人才专区  网页教程  平面设计  编程开发  设计竞赛
当前位置:首页 > 网页教程 > Flash教程 > 正文
Google
游戏制作:猜数字算法(as2.0)
来源:conanlwl.net 作者:柯南 2008年07月03日 14:15 网友评论:0条 点击:

猜数字是我初中时在课堂上最喜欢玩的游戏....游戏平台嘛.....我的文曲星PC260........

这个游戏的规则比较简单,一般两个人玩,一方出数字,一方猜。出数字的人要想好一个没有重复数字的4位数,不能让猜得人知道。猜的人就可以开始猜。 每猜一个数字,出数者就要根据这个数字给出几A几B,其中A前面的数字表示位置正确的数的个数,而B前的数字表示数字正确而位置不对的数的个数。

如正确答案为5234,而猜的人猜5346,则是1A2B,其中有一个5的位置对了,记为1A,而3和4这两个数字对了,而位置没对,因此记为2B,合起来就是1A2B。

接着猜的人再根据出题者的几A几B继续猜,直到猜中为止。

次数限制
有的时候,这个游戏有猜测次数上的限制。根据计算机测算,这个游戏,如果以最严谨的计算,任何数字可以在7次之内猜出。而有些地方把次数限制为6次或更 少,则会导致有些数可能猜不出来。而有些地方考虑到人的逻辑思维难以达到计算机的那么严谨,故设置为8次甚至10次。也有的没有次数上的限制。

首先我们先来完成对游戏的实现,反过来再为游戏完成算法反猜...[游戏预览]

游戏的实现必没有什么难度,只是一些简单的算法而已,首先生成一个各不相同的四位数,可以向用一个项为0~9的数组,然后每次从数组里随机取出一个数字并删除该位置的数字,这样便可以保证四位数在各个位上互不相同..代码实现为:

view plaincopy to clipboardprint?
function getRandomNum()//生成四位不相同數字   
{   
    var strArray = new Array(0,1,2,3,4,5,6,7,8,9);   
    var s="";   
    for(var i=0;i<4;i++)   
    {   
        s += strArray.splice(parseInt(strArray.length *Math.random()),1)   
    }   
    return s;   
}   
function chkSameNum(s)//檢查數字中是否有相同數字   
{   
    for(var i=0;i<s.length;i++)   
    {   
        for(var j=i+1;j<s.length;j++)   
        {   
            if(s.substr(i,1) == s.substr(j,1))   
            {   
                return true;                   
            }   
        }   
    }   
    return false;   
}  

完整代码可以进入游戏,通过右键,查看源文件得到。

刚实现了计算机出题,让我们猜,那可以让我们出题,让计算机来猜吗?当然可以,而且也可以验证一下计算机是不是都能在七次以内完成数字的猜测..首先先看一下算法的演示.
[点进预览]

算法的原理,还是使用网上较为普遍的枚举排除法,因为原理简单,所以也较容易理解与实现.

从0~9随便取出四位组成一个互不相同的四位数,按照组合的算法,一共有10*9*8*7=5040个.也就是无论你想的是哪一个数,一定是在这 5040个里面.所以我们每一步就必须枚举出这5040个可能组合,并存于一个数组中,我们称这个数组为字典,我们的答案就存在这个字典里面,每一次我们 都从字典里取出一个来猜测,并排除一切不符合判断结果的项,从字典里删除,一直排除到只剩一项的时候,就是我们的正确答案了.

我们可以先通过一个函数来检测这个四位数是否是各个位置上都不相同的.

var dictArray ;//当前可能枚举的数组

function chkSameNum(num)//检查数字中是否有相同的数字
{
 num = parseInt(num,10);//保证如0123这样的数能够正确的被转化为10进制的数
 var a=parseInt(num/1000)%10; 
 var b=parseInt(num/100)%10;
 var c=parseInt(num/10)%10;
 var d=parseInt(num)%10;
 
 if(a==b || a==c || a==d || b==c || b==d || c==d) return true;
 return false;
}

接着我们可以通过一个循环来存储整个初始枚举字典.

 dictArray = new Array();
 for(var i=123;i<=9876;i++)
 {
  if(!chkSameNum(i))
  {
   if(i<1000)dictArray.push("0"+i);
   else dictArray.push(""+i);
  } 
 }

对任何一个数的猜测,到底有多少种判断结果呢?我们先来罗列一下.

0A0B,0A1B,0A2B,0A3B,0A4B
1A0B,1A1B,1A2B,1A3B
2A0B,2A1B,2A2B
3A0B
4A0B

可以看到一共有十四种判断结果,注意,是不会有出现3A1B的情况的.我们可以将每一个判断用一个数字来表示.10位数表示A,个位数表示为B,则 任何一种判断可以表示为A*10+B .chkScore函数是对随意的两个四位数进行比较,并返回比较的判断结果,如两个数的判断结果为40,也即4A0B,所以两个数为相同的数.

function chkScore(guessnum,textnum)
{
 var a=0,b=0;
 for(var i=0;i<4;i++)
 {
  for(var j=0;j<4;j++)
  {
    if(guessnum.substr(j,1)==textnum.substr(i,1))
    {
     if(i==j)a++;
     else b++;
    }
  }
 }
 return a*10+b;
}

那么我们只要将每次猜测的数与字典里的每个数做比较得到判断结果,然后再独个的与用户输入的判断结果做比较,不相同的则从字典里删除,这样,只要多次猜测多次排除就可以得到一个唯一的结果,也即正确的结果.

for(var i=dictArray.length-1;i>=0;i--)
  {
     if(chkScore(guessnum,dictArray[i])!=score)
    dictArray.splice(i,1);
  }

完整的源码可以通过演示预览,并通过右键查看源文件得到...

在枚举所有可能值与第一次猜测的时候,需要花费很长的时间(大概在10S左右)导致假死状态,也关无法响应,其实这并不是算法太慢的问题,而是下拉列表要显示太多的选项而拖慢了..

上一篇:速度和加速度在flash中的描述   下一篇:ActionScript 3.0垃圾回收
收藏此页】【打印】【关闭
 相关文章  我要点评
·FLASH小游戏开发 第七节
·70多行颜色配对游戏Demo
·腾讯所有游戏停止运营三天
·高清晰游戏场景壁纸
·FLASH推箱子游戏分析(as2.0)
·网页游戏磨砺10余年迎来第二春
·百度游戏娱乐平台上线
·红杉首度投资网页游戏公司51wan.com

免责声明:本站刊载此文不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。对本文有任何异议,请联络:68design#163.com
转载要求:作者及来源信息必需保留。转载之图片、文件,链接请不要盗链到本站,且不准打上各自站点的水印。



关于我们 | 在线反馈 | 广告报价 | 友情链接 | 联系我们 | 免责声明 | 在线投稿 | 网站地图
Copyright © 2003-2007 68design.net, All Rights Reserve 【找网页设计师,当然上网页设计师联盟】