一个n维井字棋的游戏

  前几天在任务中国上接了一个任务,主要完成一个n维井字棋的设计。n维井字棋的概念是从二维井字棋开始的,二维井字棋为3×3的棋盘,而三维的就为3×3×3,四维,五维以此类推,不过四维,五维有点难以想象,呵呵。
  其中主要有两个实现,第一个就是统计一种符号(代表一个玩家)有3个棋子在一条直线上的出现次数。第二个就是让电脑实现AI。
  第一个任务其实想法比较简单,就是从一个点开始,沿着直线走2步,如果这两步都在棋盘内,并且也是这种符号,则为合法,需要统计。那现在的问题是就如果枚举出所有的直线,也就是方向。这里在请教一个网友后得到一种简单的枚举办法。其实一个方向就是一个-1,0,1的三进制加法。例如:(-1,-1),(-1,0),(-1,1),(0,-1),(0,1)...也就是说当某一位数加到2后他必须向前进一位,自己再变成-1。这样就能枚举所有的方向了。另外还有一种类似的思路就是从某一点向两边各走一步,也就是说选定一个方向走一步,再言着反方向走一步。比如方向(x,y),那反方向就是(-x,-y),同样可以用上面三进制的思想。
  第二个任务是实现一个AI。这个任务里有详细的描述,还是比较简单的,实现简单的A*算法,只需要最多向前3层。我在程序里使用的是DFS(深度优先搜索)的方法,具体也就没啥好说了。不过由于时间的关系没有好好的组织代码的结构,遗憾啊。


  写程序中发现的一些问题,需要巩固:


1.int a[5] = {0},这里a的5个元素都会被初始化为0

   int a[5] = {-1},但是这里只有a[0]会赋值为-1

   编译器的行为:会把第一个元素值赋给数组的第一个元素,然后用0赋给剩下的元素。【C++编程思想,第四章】


2.深拷贝,如果类里有需要动态申请的成员时,这时需要自己重载拷贝构造函数,否则默认的只会拷贝指针本身


3.Myclass a1;

   Myclass a1 = a2 ; 在这里调用的是拷贝构造函数

   a1 = a2;              在这里调用的是重载=(默认也有)


4.vector<Myclass> 中,向vector中加入一个类实例时,需要考虑前面2的情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值