原创 五子棋对战算法验证平台的建立

2012-2-19 16:32 1263 9 9 分类: 消费电子

 

  五子棋是一个老少皆宜的运动,而随着人工智能的发展,我们也有机会用计算机的高速的运算能力来进行弈棋,在这里,我们就要试图建立一个能够验证各种人工弈棋思维的五子棋平台,而在这个平台上,我们可以根据先前已经给定的棋盘大小(这个事唯一的确定的设定),为了一定的方便,我们在这里就不去改变棋盘的默认的大小,而在官方的标准中,棋盘的大小是有严格的限制的,比如在qq游戏中,棋盘的大小是15*15的标准,而基本上别的标准也与之差别不大,最大的或许是25*25,为了能够使用于更多的场合,在这里设计的棋盘的大小是25*25,而这个棋盘已经足够大了。

  平台的好处就是所有的使用者可以在一定的简单的规则制定下,编写出自己想要的对战策略,而不需要去很多的考虑一些基础的显示和检查越界的问题,平台提供的就是一个接口,通过这个接口,我们可以在平台上很好的编写自己的代码,而不必去担心会对程序造成很大的影响。

  如果你没有学习过JAVA编程语言,或者说,你认为你的学习还不足够,这不是问题,只要你有一些时间,有对五子棋和人工智能的一些想法,想要通过计算机程序来创造属于你自己的奇迹,那么,这个平台就能够有效的帮助你,在下面的介绍中,我会详细的说明程序的组成,其实这个程序很简单,我是通过网上的一些代码的学习然后进行相应的改进来实现这个代码的,而设计的初衷就是使它尽量的容易被理解,容易进行接口的外接。

  至于人工智能或者说机器对弈的具体的算法,这个我不会在这里介绍,我会在以后的文章中说到,当然,有了JAVA的开发环境(比如eclipse)还有这个平台性的程序,再加上你的热情和新颖的想法,相信你能够编写出自己想要的智能下棋能手!

  好了,言归正传,先来把代码贴出来:

import java.awt.*;

import java.awt.event.*;

import java.applet.Applet;

import java.awt.Color;

public class test2 extends Applet implements MouseListener,

MouseMotionListener{

int color = 0;// 旗子的颜色标识 0:白子 1:黑子

int bodyArray[][] = new int[25][25]; // 设置棋盘棋子状态 0 无子 1 白子 2 黑子

public void init() {

setLayout(null);

addMouseListener(this);

gameInit();

this.resize(new Dimension(500,490));

}

public void mousePressed(MouseEvent e) {

}

public void mouseClicked(MouseEvent e) {

int x1, y1;

x1 = e.getX();

y1 = e.getY();

if (e.getX() < 20 || e.getX() > 480 || e.getY() < 20 || e.getY() > 480) {

return;

}

if (x1 % 20 > 10) {

x1 += 20;

}

if (y1 % 20 > 10) {

y1 += 20;

}

x1 = x1 / 20 * 20;

y1 = y1 / 20 * 20;

setDown(x1, y1);

danao9();

}

public void mouseEntered(MouseEvent e) {

}

public void mouseExited(MouseEvent e) {

}

public void mouseReleased(MouseEvent e) {

}

public void mouseDragged(MouseEvent e) {

}

public void mouseMoved(MouseEvent e) {

}

public void danao9()

{

         //这里就是这个JAVA人机对战程序的主要部分,在这里,你可以自由的实现你所需要的人工智能的代码,这里存在

         //所有的可能!而我们给它起的名字是danao9,也是希望这个程序的智能部分能够做到给人留下深刻的印象!

         //相信在这个五子棋的平台的帮助下,你可以很好的完成人工智能的编程!祝你好运!

         //但是你也有一些注意事项,主要就是你需要注意给定的数组的大小,因为数组的大小是给定的,所以你必须注意到这样的一点

         //除了对于数组的大小的注意,你还需要使用我提供的标准的记录数组,在这个数组中,有你所有需要的期盼实时信息

         //利用这些信息,你可以很好的完成相应的功能,五子棋是一门艺术,希望你能让它更富有魅力!

  setDown2(90,90);

}

public void paint(Graphics g) {

g.setColor(Color.lightGray);

g.fill3DRect(10, 10, 480, 480, true);

g.setColor(Color.black);

for (int i = 1; i < 25; i++) {

g.drawLine(20, 20 * i, 480, 20 * i);

g.drawLine(20 * i, 20, 20 * i, 480);

}

}

public void setDown(int x, int y) // 落子

{

if (bodyArray[x / 20][y / 20] != 0) {

return;

}

Graphics g = getGraphics();

g.setColor(Color.black);

g.fillOval(x - 10, y - 10, 20, 20);

bodyArray[x / 20][y / 20] =2;

}

public void setDown2(int x2, int y2) // 落子

{

if (bodyArray[x2 / 20][y2 / 20] != 0) {

return;

}

Graphics g = getGraphics();

g.setColor(Color.white);

g.fillOval(x2 - 10, y2 - 10, 20, 20);

 

bodyArray[x2 / 20][y2 / 20] =1;

}

public void gameInit() // 游戏开始初始化

{

for (int i = 0; i < 25; i++) {

for (int j = 0; j < 25; j++) {

bodyArray[j] = 0;

}

}

 

}

 

}

这里的是完整的代码,通过eclipse或是别的能够运行JAVA程序的场所,你就可以看到你需要的那个原始的界面了,25*25的五子棋盘!

  相信你已经看到,在danao9中,你可以再将来放进你想要实现的代码,在这个函数的最后,你会被要求调用setDown2函数,当然,还是需要一些编程的基础的,这二个并不是难事,百度一下,这些在很短的时间内可以被了解,但是对于JAVA中的面向对象的思维方式,我还是建议去好好看一些相关的书或是别的视频或是啥的资料,当然,在这里要说明的是,我原来学习的是C语言,后来在自己的兴趣下自己学习了面向对象的语言,当然会有很多的不足之处,如有批评指正,我一定虚心接受。在我看来,这个setDown2函数你可以看做是模拟的下子的功能,而你所要给它的指令,就是两个传入的int 型变量,这样在后面他会通过部分的代码自动完成界面上棋子的安置,当然,在这篇文章结束的时候,你会详细的明白其中的运作机理,到时候你可以自己写出一个用JAVA运行的平台来啦!

  面向对象的程序设计思想其实就是对我们日常生活的一种良好的外延和模拟,单从下棋来看,我们需要首先初始化界面,也就是显示出我们所需要看到的棋盘面上的实时状况,由此我们可以把程序分为两个部分,一个部分,也即是不需要你操心的,就是完成界面的描绘和刷新工作,而另一个,以你的机器博弈算法为主体的控制代码部分。

  在程序开头的bodyArray是一个数组的名字,至于为啥是这个名字,因为这个程序也是改自网上,而当初这个程序编写者就是用的这个名字,在这里就保留原来的一部分啦,这个无关紧要,你也可以改成你需要的名字。而对于后面的博弈算法,这个事必须要使用的公共部分之一,也就是说,它就是一个交流的媒介,通过它,你可以随时掌控到棋盘面上形势的变化,JAVA的设计就是通过用对象,也就是class来进行相关的变量和函数的封装,如果对这一点不是很了解,还是百度吧,程序最前头的import语句,其实就相当于c 语言中的include(我是这么认为的),在这些库中有一些封装好可以现成拿来用的代码,而作为窗体程序,有别于诸如C语言中的开始时学习的小黑框,子JAVA中的设计变得更为的方便和简单,和普通JAVA程序不太相同的是,你要写上extends Applet implements MouseListener,

MouseMotionListener这样的语句,其实就是表明首先它是一个窗体程序,其次他会去监视windows或是别的啥操作系统中的鼠标点击的事件,对于windows中来说(就我了解),通过事件的模型,可以类比于单片机中的中断,也使操作系统的性能得到一定程度的提高,好的,接下去继续。

  Init函数是一个初始化函数,也就是我前面提到过的,主要也就是对数组之类的饿变量进行一些初始化的工作,你在最后的gameInit函数中可以看到是对数组的初始化,在这样的介绍之后,出去一些并没有实质内容但是又必须的代码后(如public void mouseEntered(MouseEvent e) {

}),我们可以发现剩下的就是和鼠标的点击的处理有关的函数了,在它之前介绍paint函数,也就是绘图函数,它负责的也就是我们最后真正能够看得见的东西,用到的也是几个基础的函数,一个是画直线的函数,也就是drawline,至于setcolor和fill3DRect函数,想必你通过它的英文的含义已经了解到了,而棋盘实质上就是一些直线嘛!

  g.fillOval(x - 10, y - 10, 20, 20)负责的是填上棋子,中间的就是传入的坐标参数,一共四个,两个数确定一个点,两个点,也就是四个数,确定一条直线,别的相信你也能知道怎么使棋子填上去的了吧。界面设计的时候每两条直线是20的距离,后面还会提到这个东西,我们一共25条直线,所以你可以算得出来一共是多少。

  好的,剩下的就是对于鼠标的处理了,这个也是很激动人心的,当然,能够写出前面所有的提到的标准的函数才是更为激动人心的事情呢,当然,我暂时没有这个软件,感兴趣的朋友可以去探究一下。JAVA本身就提供了能够对鼠标点击事件处理的函数,想起刚开始我们加入的implements MouseListener, MouseMotionListener了吗?这样鼠标点击事件就可以被监听了,好了,继续,函数返回给你的是点击时的坐标位子,在实际的改进中,可以加入鼠标是否点击在窗体内的检测,在这里为了方便就没有加,大家可以自己加上。

  鼠标的坐标不会正好落在整数的点的,但是我们的x1 = x1 / 20 * 20就可以完成规整的操作,其中的道理就不说了,相信你会明白。然后把这个整数化的坐标当做参数传给setDown或是setDown2函数,棋子就下去了。其中各个情况都会被记录在数组中,白旗是2,黑棋是1,没有棋是0.好了,程序的主要的部分,或者说,其实所有的代码都得到了解释,接下来的问题就交给你了,你可以再danao9里完成机器智能的代码,其实就是通过一系列的代码来得到可以传给setDown2函数,在你落子后让电脑完成自动落子。

  当然,你肯定能看出来,danao9中的setDown2(90,90);是没有实际上的意义的,只是一个演示,你可以删除。

  关于这个平台就讲到这里,希望你能理解其中的关节,改进就是你的事情了,如果有好的改进的建议吗,都热烈欢迎!我的邮箱jxcjxcjzx@sina.com,qq:970435817大家一起交流切磋!

文章评论0条评论)

登录后参与讨论
我要评论
0
9
关闭 站长推荐上一条 /2 下一条