五子棋人机对战实践项目
总的任务和目标
完成一个人机对战的五子棋项目,基本效果如下:
第一部分 Java绘图原理
1. 基本概念
像素,坐标
2. 组件自定义绘图原理
3. Graphics对象的常用方法
setFont(), setColor(), drawLine(), drawString(), drawOval(), drawRect(), fillOval(), fillRect(), drawImage()
第二部分 绘制棋盘
1. 基本思路
在一个JPanel上绘制一个背景,然后绘制水平和垂直的若干条线,使其构成等距离的格子,通常是15*15(条线)。
2. 代码实现
(1)主类代码:
(2) ChessPanel代码:
第三部分 绘制棋子
1. 基本思路
使用drawOval()可以绘制空心的圆,使用fillOval()可以填充实心的圆。
2. 坐标计算
由于格子是水平和垂直的有下标的,而绘制时需要使用实际的像素坐标,所以,需要进行行列下标到像素坐标的转换:
int x = col * GRID_WIDTH;
int y = row * GRID_WIDTH;
3. 代码实现
第四部分 鼠标下棋
1. 基本思路
需要处理鼠标单点事件,获取鼠标所在的位置,然后计算出应该绘制棋子的行列下标,并使用一个二维数组来全局存储棋子的位置。
2. 鼠标位置与行列下标计算
int x = e.getX();
int y = e.getY();
int row = y / GRID_WIDTH;
int col = x / GRID_WIDTH;
3. 代码实现
(1) ChessPanel属性和构造方法代码:
(2)监听器类(内部类)代码:
(3)绘图代码:
第五部分 判断胜负
1. 基本思路
判断胜负是因为在当前位置(row, col)落子导致了胜负,所以,判断胜负其实是在当前落子位置为中心,横向搜索左边第4个位置开始到右边第4个位置(其余位置不需要考虑),或者从上到下,或者正向45度,或者反向45度位置。
2. 处理方法
处理方法有很多,可以采用计数的方式,也可以采用字符串连接的方式,此处采用了将从左边第4颗开始,到右边第4颗结束,将每颗的颜色表示成字符1(黑色)或者2(白色),只需要判断其中是否有连续的5个1或5个2,即“11111”或“22222”即可知道胜负。
3. 代码实现
(1) 监听器类(内部类)代码:
(2)checkWin判断胜负的代码:
/**判断胜负
*@paramrow 落子的行下标
*@paramcol 落子的列下标
*@return是否获胜,true-是,false-否*/
public boolean checkWin(int row, intcol) {}
(3)重置游戏状态