三子棋是大家学习完C语言数组知识后接触到的第一个小游戏设计,在初步设计的时候,他的智障ai总是感觉自己玩起来像一个智障,游戏体验感不是很好。那么,在结合了一些大佬的思想以后,我得出了一个逻辑简单,新手入门难度低的ai算法,虽然说代码不是很简洁,但只涉及到一些基本的编程思想和设计思路。废话不多说,让我们开始吧。(假设大家已经完成了基础框架的搭建,只是想提升一下电脑下棋部分的电脑智商,下面只介绍算法的大致实现思路)。
要让电脑带脑子,首先要明白的一件事是:如果我是电脑,我要如何赢,或者不让对方赢?这里大概有两步:第一步:占据有利点位;第二步:能赢就别磨蹭,抓住机会堵死对方不让对方赢。
第一步:占据有利点位
要占据有利点位,首先得知道哪个是有利点位——最中央。谁能占住最中央的点,谁的赢的概率就大。但是,要是是人先走的话,并且占了中央位置,那电脑该走哪里呢?答案是四个角的任意一个
第二步:抓住机会赢,堵死对面
当电脑落子连成两颗以后,就迅速在相应空位落子完成绝杀,当没有机会赢的时候,就找到对方是否有两颗子连在一起,有就堵住他。
思路就是那么简单,那具体又该如何实现呢,对于一个小白来说,实现这个程序的难点又在哪里呢?在我看来,最大的难点就在于如何判断他即将要赢了,毕竟,赢的情况在三乘三的九宫格里面足足有八种情况!!一个个写这是在是太繁琐了!想着八个if...else if就不寒而栗。这里我借鉴了大佬的解决方法,虽然不是最简便的,但是相对来说也很不错了,也容易理解。那就是创建一个三维数组,将赢的可能性储存进去!
下面是代码:
很多人可能要问了,这个三维数组是什么意思,为什么会让我们写代码更方便?其实这个数组的意思就是八种情况,每种情况涉及三个棋子,每个棋子的横纵坐标,它们反别对应数组的[8][3][2],是不是很神奇。
那我么解决完这一步后,很多同学又要问了,我要如何遍历这个数组来获得赢或要赢的信息呢,下面是部分代码实现:
在这个代码中,我创建了一个数组board2[3][3]用来存放我的下棋数据,没有下棋的位置就是0,人下棋的位置就变为1,电脑下棋的位置就变为-1,这样我用了两个嵌套循环遍历了上面创建的三维数组的行和列,得到了能赢的情况下涉及的行标和列标,将它赋值给了我的board2数组,找到该位置的值并将它们相加,如果相加等于2,则说明人快要赢了,如果等于-2则说明电脑快要赢了,这时候我们只用再在该行里面找到没有下棋的位置下棋既可以了。
以上就是该算法的大致实现,经过以上的循环和if语句,我们就可以让我们的电脑配备一个还算不错的大脑,让你游戏体验感更加好。