首页 » 游戏资讯 » 五子棋的学习让我大脑茅塞顿开

五子棋的学习让我大脑茅塞顿开

时间:

五子棋的学习让我大脑茅塞顿开,五子棋的魅力其实很少人会去仔细的了解,最早接触应该是在小学的时候吧那时候被简单的玩法所吸引,如今慢慢的发现了五子棋另一种独特的魅力如今还在坚持着玩下去。

内容介绍

哇,花了四天的时间终于把五子棋理解的差不多了

现在让我来从头到尾分析一下五子棋的编写吧。

第一步:界面;就是一个15*15的棋盘加上几个功能按钮。棋盘就是横着画15条线,竖着画15条线,然后取好距离。给个小建议:就是把棋盘的行数和列数,还有棋子和格子的大小写在一个接口里面,这样的话就如果要修改参数的话就很方便了。考虑到我是左边画棋盘,右边画按钮,所以这里我用了BorderLayout(边框布局),就留下了中间和右边的边框。然后就是中间和右边都是JPanel。我的主函数是继承JPanel,然后定义一个JFrame.然后就是一些基本设置了,这个就不说了。

第二步:写事件处理类。这里的功能按有:开始游戏,认输,悔棋,人人对战,人机对战。

现在来功能分析:

1.开始游戏就是重新开始,原来是人机现在还是人机,不改变模式。所以这里只要重新画一次棋盘,棋子清零就可以了。

2.认输就是当A方下完棋后,如果B方点击了认输,那么就是B方输了,所以这里的判断是此时谁刚下了棋。

3.悔棋,人人模式中就去掉刚画下的棋,人机模式中就是人的和电脑的棋子都去掉。

4.人机对战,这里用了权值法来判断下棋的位置。人人对战就是一次下白棋,一次下黑棋。

现在来先要干嘛先吧。首先,你点击棋盘中交线附近的位置时要可以画出棋子来,就是画个带颜色的圆。这个就是要写鼠标点击的这个方法了。点击一下,首先是获取他点击的坐标,然后来一次遍历,看它在哪个格子的范围内,然后选择该格子画圆。用个chessColor变量来记录棋子的颜色,一次是白色,一次是黑色,所以我就让它为0或1,如果他是0,我就画黑色,如果是1,我就画白色,画完后就修改他的数值。这样画棋子就没问题了。但是要注意画圆的filloval这个方法的参数,第一个的x是左上角的横坐标,第二个的y是左上角的纵坐标,他的x是向右的,y是向下的。这个细节要处理好,不然后面出bug了就难受了,我当时写的就模糊了。。。

然后现在就可以画棋子了,可是有没有发现这个问题,当你把棋盘移到边缘或者是最大最小化时会出现棋子消失的情况。这个就涉及到一个新的知识点了,重绘。每次你有上面的这些操作时它都会重新画一次这个画板,而你的棋子都是在事件处理类中画的,所以重绘后就没有了。

所以,现在我们要重新写这个重绘的方法,JPanel的paint方法,在主函数的类中写,因为它继承的就是JPanel这个类。首先要先调用父类中的paint,来个super.paint(g);然后就是重新绘制一次棋盘,现在出现一个问题了,怎么把之前的棋子全部重新绘制出来呢?这就要创建一个数组来存储这个棋盘上棋子的情况了,没有棋子数组里的值就是0,黑子就是1,白子就是2.然后主函数和事件处理类中都要操作这个数组,所以在主函数和事件处理类中都要定义一个数组,然后在事件处理类中再写一个方法把两个数组搭在一起,最后在主函数中调用这个函数就行了。

现在,显示就没什么问题了。人人对战也可以实现了。有必要写一个判断输赢的函数了。我的思路是这样的,做一次遍历,每个格子都进行4条路的搜索,米字形的四条路,根据数组里面的数进行搜索,遇到颜色不同或者为空时就停下来。然后封装在一个函数里面就可以了。

这样,胜负也就没问题了。

然后,我们先把人机模式的AI算法即权值法写了吧。这里用到hashmap,他是一个单向的对应关系表,参数是两个引用类型的数据,我们就用到他的两个方法,put和get。put(“11112”,1000):这个式子的意思是建议1112这个字符串和1000的对应关系,当你使用get(“1112”)时,他就会返回1000这个数值。具体的建立代码如下

HashMap hm = new HashMap();

public void creatHashMap()

{

hm.put(“1”,20); //1为黑棋,2为白棋(机子下的棋)

hm.put(“11”,200);

hm.put(“111”,700);

hm.put(“1111”,800);

//hm.put(“2”,10);

hm.put(“12”,10);

hm.put(“112”,100);

hm.put(“1112”,600);

hm.put(“11112”,800);

这个刚开始比较难理解,所以这部分代码还是贴上来吧。这就建立了棋子的排布情况和对应的权值的关系。这个权值是根据自己下五子棋的判断来给的。这个建立好以后调用一次就好了。然后要建立一个存放权值的数组。

然后开始写我们的AI算法。它要在每个格子上向八个方向都去获取权值,然后把权值累加起来,这才是这个位置的权值。

//向左搜索棋子相连的情况

chess=””;

for(int k=i-1;k>=0;k–)

{

if(chesses[k][j] == 0)

{

break;

}

else

{

if(chesses[k][j] == 1)

{

chess+=chesses[k][j];

}

else

{

//颜色不同的情况

chess+=chesses[k][j];

break;

}

}

}

Integer value1 = hm.get(chess);

if(value1 != null){

chessValue[i][j]+=value1;

}

这就是里面的核心代码,注意字符串加上数字就整个都强制转换为字符串。然后就是注意逻辑了。然后AI算法就写完了,结果就是一次遍历过后就可以获取到当前局势的全部格子的权值了。这时我们就在后面再加上一次遍历,就可以找出最大权值的位置,然后画上圆圈就行了。

我这里默认人下的是黑棋,电脑下的是白棋。对了,提醒一下,每次下完棋后把权值全部归零,不然会出问题。然后加上判断输赢的方法。这样,一个人机模式就结束了。

然后,开始写按钮的监听方法。开始游戏就和之前的思路一样,重画一次棋盘,棋盘数组的值全部归零。然后这个还有一个有没有出现输赢的标志。在开始游戏这里的得把标志置零,表示没有人胜利。然后在之前写的胜利之后要把这个标志置1,表示已经出现输赢,然后就是只有没有出现输赢的情况下才能使目标在棋盘上的点击有效,然后这个标志位在认输,人人对战,人机对战的时候也会有相应的使用。然后还要记得把棋子的颜色置为黑色,不然会出错。

额,感觉说的有点罗嗦了,这些东西自己想一下就指导该怎么办了。所以就不细讲了,需要注意的是悔棋里面在人机模式的情况下还要把电脑下的白棋也悔掉,所以得定义一个全局变量保存电脑下的棋子位置的坐标。然后人人模式和人机模式就是立个标志位区别就可以了。还有重绘棋盘。

最值得注意的一点就是横坐标和纵坐标的明确。因为这里有很多的数组,很多的遍历,所以里面的位置的对应关系一点要正确,一但出错就会很伤。比如人机情况下会出现你下了棋子之后就没有反应等等,刚开始写的时候最好把人下的坐标和电脑下的坐标打印出来,看看是否正确。我也是把各种错误经历过后才搞出最后的五子棋的。然后就是我写的hashmap很简单,很容易就赢了。所以你们可以自己想想怎么变难。

注意好各种标志位什么时候开启和关闭。那些逻辑的代码和复制粘贴的代码就不贴上来了,太多了。这里主要讲了逻辑,你们看得差不多就可以写,不懂的再来看。请多多指教。

上一篇:

下一篇:

网站地图