java五子棋人机对战_实现简单的人机对战五子棋(实践)

  • Post author:
  • Post category:java


五子棋人机对战实践项目

总的任务和目标

完成一个人机对战的五子棋项目,基本效果如下:

第一部分 Java绘图原理

1.   基本概念

像素,坐标

2.   组件自定义绘图原理

3.   Graphics对象的常用方法

setFont(), setColor(), drawLine(), drawString(), drawOval(), drawRect(), fillOval(), fillRect(), drawImage()

第二部分 绘制棋盘

1.   基本思路

在一个JPanel上绘制一个背景,然后绘制水平和垂直的若干条线,使其构成等距离的格子,通常是15*15(条线)。

2.   代码实现

(1)主类代码:

21703215cfb71f232900bef9004be665.png

(2) ChessPanel代码:

第三部分 绘制棋子

1.   基本思路

使用drawOval()可以绘制空心的圆,使用fillOval()可以填充实心的圆。

2.   坐标计算

由于格子是水平和垂直的有下标的,而绘制时需要使用实际的像素坐标,所以,需要进行行列下标到像素坐标的转换:

int x = col * GRID_WIDTH;

int y = row * GRID_WIDTH;

3.   代码实现

5023ab2266d32d4dd36cbe644eabffdd.png

第四部分 鼠标下棋

1.   基本思路

需要处理鼠标单点事件,获取鼠标所在的位置,然后计算出应该绘制棋子的行列下标,并使用一个二维数组来全局存储棋子的位置。

2.   鼠标位置与行列下标计算

int x = e.getX();

int y = e.getY();

int row = y / GRID_WIDTH;

int col = x / GRID_WIDTH;

3.   代码实现

(1)      ChessPanel属性和构造方法代码:

b9dac5c9bd0ea7b1633248c29b2bad3e.png

(2)监听器类(内部类)代码:

f8709ddd6c6a6e4fb8430bcf5bce0d86.png

(3)绘图代码:

e94602c2a3c0a704efbb9b9dfc84f4bb.png

第五部分 判断胜负

1.   基本思路

判断胜负是因为在当前位置(row, col)落子导致了胜负,所以,判断胜负其实是在当前落子位置为中心,横向搜索左边第4个位置开始到右边第4个位置(其余位置不需要考虑),或者从上到下,或者正向45度,或者反向45度位置。

2.   处理方法

处理方法有很多,可以采用计数的方式,也可以采用字符串连接的方式,此处采用了将从左边第4颗开始,到右边第4颗结束,将每颗的颜色表示成字符1(黑色)或者2(白色),只需要判断其中是否有连续的5个1或5个2,即“11111”或“22222”即可知道胜负。

3.   代码实现

(1)     监听器类(内部类)代码:

8866b4309bee7f920037c0504754b842.png

(2)checkWin判断胜负的代码:

/**判断胜负

*@paramrow 落子的行下标

*@paramcol 落子的列下标

*@return是否获胜,true-是,false-否*/

public boolean checkWin(int row, intcol) {}

dcde88749d5c44b78f3b287266a5f746.png

be4f092bd50080d882c6d994f075d6d5.png

(3)重置游戏状态



版权声明:本文为weixin_39883286原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。