动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > C/C++教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ C/C++教程 ]的信息

本月文章推荐
.栈的表示与实现及栈的应用.
.C程序设计基础之多维数组的指针变.
.C++内联函数(Inline)介绍.
.More Effective C++:不要重载的.
.C程序开发经典实例之5.
.Socket的地址结构.
.关于文曲星上猜数字游戏的c编程方.
.C++ builder 的文件读写操作总结.
.C程序开发经典实例之4.
.深度探索C++对象模型(3).
.传递焦点的五种方法.
.高质量C++/C编程指南 --&nb.
.本人写的迷宫,不过知道这样才能.
.新手入门:C++中的函数重载.
.C++ 对象的生存期.
.用托管C++监视Windows事件日志.
.陀螺.
.一个c++写的发牌程序.
.实例解析C++/CLI的“克隆”.
.设计的一个计算器类的源代码,很简.

用游戏串起程序员的基本功之四

发表日期:2008-3-8 |



  对于麻将牌的玩法来说,重要的就是要有吃、碰、杠、胡等四种功能.那么在游戏中怎样编码实现呢?

  吃牌,就是比较对方打出的牌,和自家的牌是否可以连成一串.而碰牌就是比较对方打出的牌和自家的牌是否有2张相同的.假如有三张牌和对方打出的牌相同,就可以杠.胡牌则是至少要有一对相同的牌,除此之外,也可以有三张三张的相同的牌或连成串的牌.

  所以对于吃、碰、杠、胡,我们可以分解为,查找两张连续的牌,查找两张相同的牌,查找三张相同的牌,对于胡牌,还要确定有且只能有一对相同的牌,其他的可以是三种相同的牌,或三张连续的牌。可见在此查找是算法的要害。

  我们先来看一下有关查找的知识。

  第一种查找的方法叫“线性查找法”,是从数据中的第一个数值开始查找比较,假如找到就返回该值或该值所在的位置。

  示例如下:

  13 25 16 23 57 66 为一个整型数组。

  假如要在这样一个数组中找到57,

  步骤1:得到第一个数13,不相等,取得下一个数

  步骤2:得到第二个数25,不相等,取得下一个数

  步骤3:得到第三个数16,不相等,取得下一个数

  步骤4:得到第三个数23,不相等,取得下一个数

  步骤5:得到第三个数57,相等,返回所在位置5

  代码如下:

int chazhao(int key)//用线性查找法 ,key表示要查找的数值

{

int i=0; //指示在数组中的位置

while(i<14) // 直到结尾

{

if (key==apai[i]) //假如找到,

return i; //返回所在位置

i++; //没找到,继续向后搜索

}

return -1; //没找,返回失败

}
  可以看到这种方法,不管数据是否有顺序,也不管数据的多少,都是按顺序挨个的搜索,直到找到或搜索完成,当数据很多时,尤其是要查找的数据排的比较靠后,就会很费时间。所以,对于已经排好顺序的数据,假如还用线性查找法来查找的话,一定是很浪费时间的。有什么好的方法呢?

  大家一定都查过英语词典吧,当你要查一个以S开头的单词时,谁都不会从头一页一页的向后翻,而是跳跃式的向后翻,假如我们先翻到了P开头的一页,我们一定会继续向后翻,而不必再查前面的页码。再翻一次,到达T开头的一页,我们就会又先前翻,找P和T之间的页.我们可以把这种查找的方法叫“折半查找法”。

  它的原理是:先用欲查找的数值和该组数据的中间位置上的数值比较,当小于中间值时,再向前查询,大于中间值时向后查询,继续取前面(或后面)一半数据的中间值进行比较,假如小于再向前查询,大于就向后查询,一直到找到或查询完毕为止。

  示例如下:

5 7 12 25 34 37 43 46 58 //是要查找的数据段,其中要查找46,

  步骤一:中间值34<46,向后查找

  步骤二:得到后半部分的中间值43<46,再向后查找

  步骤三: 得到剩余部分的中间值46,返回

  可见,这种方法明显的减少了比较的次数.

  下面是源代码:

void chaxun(int key)//用折半查询法,key表示要查询的数值

{

int left=o; //待查询数据段的左边界

int right=12; //待查询数据段的右边界

int mid; //待查询数据段的中间值

while(left<=right) //只要没查询完

{

mid=(right+left)/2; //取得待查询数据段的中间值

if(key<apai[mid]) //中间值大于待查询的数值

right=mid-1; //再查找前半段

else if (key>apai[mid]) //中间值小于待查询的数值

left=mid+1; //再查找后半段

else if(key= = apai[mid]) //中间值等于待查询的数值

return mid; //返回位置

}//end while

return –1;

}//end

  查询数据是数据结构中的又一重要知识,在实际应用中也很重要,假如有爱好可再深入的研究.我们只能到此为止.

  回过头来,我们再来看一看,这样判定吃,碰,杠,胡.在此我们只以万牌为例.

  下面是数和牌对应关系:

1 2 3 4 5 6 7 8 9 10

11 12 13 14 15 16 17 18 19 20

21 22 23 24 25 26 27 28 29 30

31 32 33 34 35 36 37 38 39 40

一 二 三 四 五 六 七 八 九 (万) 东

  很明显同一张牌是在小于40的数据段中,并且个位相同的数.并且它还对应着牌上的数.

  所以判定是否为同一张牌的方法,我们可以这样写:


tempa=apai[i]%10;
tempb=apai[i+1]%10;
if(tempa==tempb)
 shi tong yi zhang pai
(注重这种牌和数得对应关系,在排序时,一定要以个位为准,而不是以实际的数值大小)
  判定是否可碰,则可以这样:

tempa=apai[i]%10;
tempb=apai[i+1]%10;
tempc=apai[i+2]%10;
if(tempa==tempb && tempb==tempc)

  判定是否可杠,可以这样:

tempa=apai[i]%10;
tempb=apai[i+1]%10;
tempc=apai[i+2]%10;
tempd=apai[i+3]%10;
if(tempa==tempb && tempb==tempc && tempc==tempd)
  是否为顺,则可以这样判定:

tempa=apai[i]%10;
tempb=apai[i+1]%10;
tempc=apai[i+2]%10;
if(tempa==tempb+1 && tempb==tempc+1)
  很简单吧,相信你应该也会判定对方出的牌,自己是否可以碰,杠,吃了吧.在此我们就不多罗嗦了.

  胡牌稍麻烦些,要判定各种副牌的方式,这里我们一起看看一条龙的胡法.

  下面是源程序:

void yitiaolong ()
{ int wan,bing,tiao;//wan,bing,tiao 分别代表三种牌
 int temp;
 for(int I=0;I<13;I++)
 {
  temp=apai[I];
  if(0<temp<40)
   wan++;
  if(40<temp<80)
   bing++;
  if(80<temp<120)
   tiao++;
  if(wan=8)//万牌一条龙
  for(int I=1;I<9;I++) //比较这8张牌
    if(apai[I]%10=api[I+1]%10)
     //是否後一张等于前一张,相等,说明已经有将牌了
    for(int a=1;a<40;a++)
     if (chaxun(a)!==-1) //找到所缺的牌
      if (I=duifangchupai)比较是否和对家大的牌相等
        ……..//胡了
       else
       //表示8张牌没有相同的,也就是又8个串
       //查找所缺的牌,
       //与对方出的牌比较,
       //相等 胡牌
        ……….
       if(wan=9)
        ……….
 }
 if(bing>=8)
  …..//饼牌一条龙
 if(tiao>=8)
  …… //条牌的一条龙
 }
}
  由于篇幅所限而且文章的重点不在于此,这仅给出一个框架,聪明的读者,可以发挥自己的才智,将他补充完整.

  下面我们简单谈一下人工智能,究竟我们在游戏中还需要一个对手.

  作为程序员,我们不可能做出一个具有高超聪明的对手,而且我们也不可能将游戏中种种可能的打牌方法都写入程序.那么就需要一种可操作的方法,使你的对手不至于太傻.

  对于给策略性的游戏添加人工智能主要有这么几步:

  (1) 要找出所有获胜的可能性

  (2) 建立获胜表,

  (3) 每一步的玩法给出一个恰当的评价分值,其中包括给对手制造的麻烦所得的分,和给自己带来的获胜机会所带来的分

  (4) 根据所给的分值,确定其中所有可能的玩法中,分值最高的一种玩法,也就是最好的一步走法.

  具体到麻将游戏下面是具体的分析:

  假设a1,a2,... an 是手上当前牌序列,其中包括吃 碰 杠后的牌,

  步骤1: 计算 玩家 离胡牌还有几步. 假如 玩家 已经听牌, 它离胡牌的步数是 1, 假如是一上一听, 步数是 2, 以此类推;

  步骤2: 假如步数是 m , 计算所有能使 玩家 到达胡牌的序列也就是所有胡牌的可能玩法 {b11,b12,....b1m}, {b21,b22,...b2m}, ....,{BT1,bt2,....,btm}

  步骤3: 对于每个一个 {bt1,bt2,...,btm}, 计算胡牌的点数, 以及到达胡牌时要打出去的牌: {ci1,ci2,....,cim}

  步骤4: 对于每一个 {bt1,bt2,...,btm} 计算胡牌的点数;

  步骤5: 选取收益最大的方案 {bji,bj2,....bjm}

  步骤6: 从{cj1,cj2,....cjm} 中按照跟熟原则打一张

  动动脑筋相信你会做出更智能化的得对手。 更多文章 更多内容请看网络游戏攻略  游戏开发专题,或
上一篇:在Listboxes中加背景图 人气:323
下一篇:c++中布尔类型的入门教程 人气:359
浏览全部C/C++的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-10-7 Web Wiz Forums(论坛系统) v9.53
2008-10-7 Web Wiz Forums(论坛系统) v9.53
2008-10-7 Web Wiz Forums(论坛系统) v9.53
2008-10-7 HDWiki v4.0.1 bulid 081007 UTF
2008-10-7 迅易评选投票管理系统 v10.0
2008-10-7 HDWiki v4.0.1 bulid 081007 GBK
2008-10-7 Bitrac单用户博客 v1.14 bulid 0
2008-10-7 OpenX(广告管理系统) v2.6.2 多国
2008-10-7 乐铺网店系统免费普及版 v3.41
2008-9-29 酷狗音乐(原KuGoo)2008 v5.310 正
2008-9-29 QQTab 1.1
2008-9-29 网络传送带 Net Transport 2.64a
2008-9-29 谷歌金山词霸v1.8
2008-9-29 TweakVI 1.0 Build 1090
2008-9-29 ACDSee Pro 2.5 Build 333 汉化绿
2008-9-29 Winamp v5.541(2189) 周明波简体
2008-9-27 CCleaner 2.12.651
2008-9-27 Mozilla Thunderbird 2.0.0.17 英
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | js/vbs加密 | md5加密 | 进制转换 | UTF-8 转换工具 | Html转换js | Html转换asp | Html转换php | Html转换perl
实用工具:汉字翻译拼音 | 拼音字典 | 符号对照表 | 个税计算 | 实时汇率查询换算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 | 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵
SEO対策 中国語教室 ホームページ作成