请教数据结构高手,高分相赠!!

callwa 2003-08-15 10:02:08
我做一个象棋软件
要用开局库
我的想法是这样的
建立一个三维数组chessboard[15][10][9],意思是表示棋盘上任何一个位置可能有任何一个棋子的状态,15表示14种棋子和没有棋子的某一位置的15种可能状态,10和9表示棋盘的行和列数,也就是的定义了所有的位置点;将数组中每一个元素填满互相完全不一样的数据,任意一个盘面上局势的状态用各元素之和chesstotal描述(当然没有棋子的位置对应的元素不加在里面),请问怎么样确定最少需要多少位的数据,才能保障任意一个盘面对应的chesstotal的值不一样?怎么确定这些数据,不会是硬往上凑吧?
另外一个问题:用以上的chesstotal最为关键字索引,后面记录着当前局面下做好地应着,对于有多种应法的情况怎么处理呢?
需要一个随机数来确定选择哪一种招法,但在开局库中怎么样存储呢?
因为每一个局面的应法多少是不一定的,也就是每一个chesstotal对应的记录长度是不一样,请高手指教效率最高的处理方法!!
谢谢了
分不够再加!
...全文
34 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
yzb1000 2003-08-17
  • 打赏
  • 举报
回复
mark
loewe 2003-08-17
  • 打赏
  • 举报
回复
GZ......
BlueSky2008 2003-08-17
  • 打赏
  • 举报
回复
happy__888要跟我过招啊?不过你的破绽好像不小啊:)
“最终的结果肯定是构造一个chesstotal(太长了,以后就简称CT)状态转移数据库。”
这岂不是太大了?
君不见棋谱都是
炮二平五 炮8平5
马二进三 马8进7
...
之类?
计算机上存储也应该采取这种形式。
每一着棋只需纪录当前走动的子。这样既节省空间,又便于充分利用已有的棋谱资源。
ZhangYv 2003-08-16
  • 打赏
  • 举报
回复
开局库楼主就免了吧,工作量太大.好的搜索算法和评价函数照样可以达到很好的效果.
效率最高的应当属于紧凑的数据结构,比特棋盘是个很高效的可以直接使用位运算的结构,但是难度比较大.国内没见过有相关的资料,你到国外去搜搜是苏联人发明的.直接用数组比较好懂,但是效率低了.看看自己的实际水平选择吧.
你最好查阅相关的书籍或文档,做象棋是很高深的,也有不少开放源码的软件你可以去参考一下别人的做法.在此两三句是解释不清的.
luanjiajia 2003-08-15
  • 打赏
  • 举报
回复
顶 接分
goooogle 2003-08-15
  • 打赏
  • 举报
回复
up
wswyygy 2003-08-15
  • 打赏
  • 举报
回复
友情up
sworldc 2003-08-15
  • 打赏
  • 举报
回复
这属于人工智能的博弈问题,查一下人工智能的博弈篇吧。
寻开心 2003-08-15
  • 打赏
  • 举报
回复
没有书可以教会你应付所有问题的能力,
多想,多看,多动笔,最后才是多动键盘
callwa 2003-08-15
  • 打赏
  • 举报
回复
TO:
happy__888([顾问团]寻开心)
Bluesky2008:
两位真是高手啊!
小弟没学过数据结构的东东
自己一点都不会分析
但你们讲的我还是基本上听懂了
多谢了!
下周一我会再次高分相赠的
决不食言
可不可以说说
学了那一本书以后就能更深地理解这些东东
盼指教
谢谢!
WYlslrt 2003-08-15
  • 打赏
  • 举报
回复
帮忙推
寻开心 2003-08-15
  • 打赏
  • 举报
回复
从整体来说

CHESSBOARD简称CB,就是一个二维数组 BYTE CB[9][5]
CB和CT是一一对应的,我们不方便记录一个二维的数组,把它转换成为一个定长的字符串

一个CT有两类多个后续CT和它对应,这个对应关系和CT本身在一个数据库当中保存。

要得到这个数据库,就要从大量的人工啦,或者是你自己写一个函数来生成这个。

程序运行的时候,开始的棋盘状态就是一个CT,对应的可以从数据库当中搜索出来多个后续CT。棋盘就是一个状态机,数据库就是状态机的所有可能数据库了。
寻开心 2003-08-15
  • 打赏
  • 举报
回复
哈。
Bluesky2008继续过招。

最终的结果肯定是构造一个chesstotal(太长了,以后就简称CT)状态转移数据库,我们不去管从每个CT到另外的CT的关系怎么来的,也就是说,我们不去考虑下一步怎么走,只是从数据结构上来讨论,这种状态变换关系如何表示。

显然,从一个CT上至少是连接出两类多个CT来,两类就是一个下一步是黑先还是红先的问题,每类现面又有多种选择,构造这种结构干脆就是使用一个数据库来表示,数据库结构如下:
CT表
CTIndex(AUTO) CT
CT关系表
CTINDEX FLAG CTCHOICE

注意第一个表,只是表示CT的状态,记录所有的状态
第二个表是,后续表,FLAG表示红先还是黑先
第一个CTINDEX索引到CT表当中,表示的是当前的状态。
后面的CTCHOICE实际就是CT表当中的CTIndex, 同一个CTINDEX FLAG可以对应多个CTCHOICE也就是红先或者黑先条件下的后续招法。

每一步都是通过数据库查询来获得后续多个招法,从中随机选择一个来处理。
BlueSky2008 2003-08-15
  • 打赏
  • 举报
回复
局面可以不要用3维数组,用2维数组char chessboard[10][9]就可以了,用数组元素的值来表示某个位置的棋子状态。这样,需要的空间起码降低14倍,当你开局很多时,是可省不少空间的。
实际上,象棋有90个格子,而棋子只有32个,残局子更少,可以看作稀疏矩阵,如果用链表来存储的话更省空间。但链表对于后序的走子规则,人工智能等处理都不方便。可以在硬盘上以链表存储,而运行时,在内存中以数组存储。

"怎么样确定最少需要多少位的数据,才能保障任意一个盘面对应的chesstotal的值不一样?"
大概是:log2(P(90,32))这个量级的吧。由于各种规则,可能实际需要的比这个少一点,但位数还是很多的。反正是不适合。
你描述的chesstotal作为关键字,也不好。因为值不唯一。
可以先用一些重要信息将棋局分类,如双方总棋子数,重要棋子车马炮数等。然后在每一类中顺序查找。

有很多中应法的情况可以用m叉树来处理。









寻开心 2003-08-15
  • 打赏
  • 举报
回复
1 chessboard的最小结构是: BYTE chessboard[9][5]
2 chesstotal的结构是一个字符串,长度90,每个字符就是一个16进制字符当中的0~E
3 一个结构实际也就是一个chessboard状态

解释
1 棋盘9×10个点,每个点有至多15种状态
(其实至多12种状态,因为双方的将士象的位置是互斥的)。
1个BYTE8位,可以表示两个16种状态
因此棋盘的状态可以用一个9×5的二维数组表示
因此棋盘的状态chessboard不是三维数组,而是一个二维数组
2 把一个chessboard的45个BYTE字节合并到一起,就是一个chesstotal
展看就是90位长的字符串,完全和一个chessboard对应
3 看展开方式就知道chesstotal和chessboard完全是一回事。

关键是你的数据库如何建立,如何从一个chesstotal变化到另外一个chesstotal
同一个chesstotal至少有两类后续招法,一个是红先,一个是黑先。
每类又有多个选择,数据库太庞大啦。

33,006

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧