写一个五子棋小项目
今天来写一个五子棋的小项目,最终实现如下功能:
- 进行对战并判断输赢
- 悔棋
- 复盘
- 人机对战
不急,我们一步一步来实现这些功能
首先,我们需要创建一个棋盘:
TODO:
- 设置参数
- 绘制棋盘
- 背景、19*19格、特殊点位标记
- 添加按钮实现游戏的开始暂停、悔棋等功能
设置参数
在设置参数的时候,我们使用接口(interface)来定义常量,以便其他类使用1
2
3
4
5
6public interface GoData {
int ROW = 19, COL = 19;//行、列
int SIZE = 40;//格子size
int GX = 60, GY = 60;//棋盘左上角
int BX = 45, BY = 45;//背景左上角
}
某个类想要调用这个接口,只需要implements
即可:1
public class GoUI implements GoData{Do something...}
绘制棋盘
注意:19条线,18个格
1 | public class GoUI extends JFrame implements GoData { |
到此,棋盘就画好了
下面实现下棋
TODO:
- 黑白交替下棋
- 判断游戏是否开始,未开始则无法下棋
- 鼠标点击下棋
- 黑白交替
- 自动调整下棋坐标
- 判断此处是否能落子
- 判断游戏输赢
- 棋子重绘(防止因改变窗体大小导致棋子丢失)
- 清空棋盘
- 悔棋
- 复盘
- 人机对战
黑白交替下棋
1 | public class GoListener implements MouseListener, ActionListener, GoData { |
判断输赢
显然,我们的胜负只与最后一步棋有关,所以,我们只需以最后落下的棋子为中心,进行米子查询,判断是否满5子即可
1 | private boolean Judge(int i, int j, int flag) { |
棋子重绘
利用二维数组GoArr[][]
记录棋盘上的棋子,每次绘制棋盘的时候将棋盘上的棋子重绘一次,麻麻再也不用担心棋子因为拖动窗体而消失了~
1 | public void DrawChess(Graphics g) { |
悔棋
通过记录每次下棋的坐标,通过更改GoArr[][]
,重绘来达到目的。1
2
3
4
5
6
7(act.equals("悔棋")) {
if (step >= 1) {
GoArr[EveryI[step]][EveryJ[step]] = 0;
step--;
Repaint(g);
}
}
1 | int[] EveryI = new int[ROW * COL]; |
清空棋盘
清空EveryI
,EveryJ
,step
,以及GoArr
,最后进行重绘即可
1 | public void DelBoard(Graphics g) { |
复盘
1 | (act.equals("复盘")) { |
这里面使用Thread.sleep()
实现了每隔一秒下一步棋的效果
暂时先这样叭,最后还差一个人机对战,估计是要调用什么库来实现吧~
$-By\ AHC$