计算机项目:国际象棋

老师给了我们一个作业,一个月之内做一个程序出来,想来想去,想到了这个题目——国际象棋
目前的想法只有这么多,代码在之后的一个月之内(不出意外)应该会完成连载。

国际象棋的算法描述

  我大概想了一下,国际象棋的整个程序里面,一共有这几套算法:

  1:基础规则

  2:特殊规则和特殊情况

  3:计分和胜负的判断

  4AI对棋局的判断和对自己棋子的保护

  5AI的进攻

  6:人人对战

  7:基础规则的说明

  8:投降、悔棋等其他功能

  9:基础界面的显示

10AI 对棋局的扫描

  基本上就是上述的9套算法,其中第四套和第五套算法合并为AI 的棋子移动算法,也是这个程序里面最难的部分。

  先来解决一些可以解决的问题,我在这描述一下整个棋盘的构筑和棋子的数据库:

  首先是棋盘,国际象棋的棋盘一共有8X8=64个方格,我们采用二维字符数组的方法来进行构筑和显示。

  其次是棋子的数据库,为了可以计算和判断棋局的情况,每一方的棋子数据库采用结构体数组来构筑(两个结构图数组,一个给玩家,一个给AI ;把数组的内容放入棋盘的数组中,返回每个棋子的下标作为坐标,根据坐标的位置确定相应的数据进行计算),结构体数组内部包括的数据类型为两种:int char 这两种类型。

  Char 类型的数据用来存放每种棋子的图标;int 类型的数据用来存放每种棋子的权重。

  关于棋子的权重问题,这个是和程序的计分算法有关:假设由棋子A可以吃掉棋子B,在给每种棋子赋予权重数值的情况下,做如下运算:X=A-B,结果X作为两种棋子的权重差值(由于象棋的胜负判断方法是国王是否被吃掉,所以当X的值在一个区间内的时候,判断被减数的一方输,也就是B的那一方输,区间的下限是士兵的权重和国王权重的差值;区间的上限是王后的权重和国王权重的差值)。

  这是每个棋子的权重值:

士兵:1

战车:2

马:3

象:4

王后:5

国王:10

这种情况下的X的区间范围为(-9-5

这个区间满足所有棋子吃掉王的情况,而且和其他棋子权重的差值区域没有交集。

下面是重点:第四套算法、AI 对棋局的判断和对自己棋子的保护

我现在的想法是设置一个变量:dangerous (危险系数变量),AI 可以通过检测这个变量的大小来判断棋局对自己的危险程度,从而做出相应的措施(有时候会出现有好几种可以实行的走法,但是你只有一步,这时把所有的操作的权重差值从高到低,如果自己被将军则把保护国王的操作放在第一位,危险系数变量的值越高,就执行权重差值越高的操作,保护国王的操作作为特殊情况来执行,单独建立函数),危险系数变量的确定算法我有个想法(不是最好的,需要优化),把排列棋子的方向作为棋盘的行(X轴),另一个方向作为棋盘的列(Y轴),以玩家的那一方为首,确定一个基准线,超过这个基准线则給棋子的权重值乘上相应的数值,计入危险系数变量,通过这个方法来确定危险系数(目前我的想法是把第三行确定为基准线,因为第一步只有马可以越子,且最远走到第三行,超过第三行,就可以布局,所以从第三行到第八行分别给每一行赋值,把走过基准线的棋子的权重值乘以当前到达的那一行,计入危险系数,每次AI的回合开始的时候,危险系数的数值重置,重新计算【这里想到一个新想法:每当玩家的同一种一种棋子吃掉AI的棋子三次或两次以上的时候,在危险系数计算的过程中给玩家使用的棋子的权重加上一个数字之后再进行乘法运算,然后标记这种棋子,在,以更加有效的保护自己的棋子或者发起更有效的进攻,操作顺序放在保护国王之后,也作为特殊操作】)。

重点2AI的进攻:当出现可以消灭的棋子时,进行操作比对,如果AI 的棋子造成的危险系数(使用相同的危险系数算法进行计算,情况以玩家为准,【dangerous-player】两个变量进行大小对比)大于玩家的棋子给AI 造成的危险系数就进行进攻;如果出现多种进攻的选择时,选择给玩家造成危险系数最大的操作执行。

扫描算法:从AI的那一方开始,从最后一行扫描到玩家的最后一行,如果有棋子满足进攻,保护,和危险系数变量计算的条件,返回它们的数组下标和其他相应需要的数值,进行计算。

还需要确定每个棋子的势力范围,作为基础数据,以那个棋子的权重值标号它们自己的势力范围,在扫描的过程中,扫描那个棋子的权重来使用相应的基础数据。

 

你可能感兴趣的:(C语言学习,C-PROJECT)