许多人在操作完绘图板之后,立马开始了五子棋这一个项目,因为这个项目相当于绘图板的延伸,同时需要一定的Java语法及数据结构的基础,比较适合训练各项能力,所以我也不例外,也走向了这一条道路。但是,本文并不打算详细讲述每一行代码,只是根据功能实现提供一定的思路。
首先,五子棋是一个轮流下棋,并根据棋局来判断胜负的游戏。因此我们需要做的事情就是以下:绘制棋盘,绘制棋子(包括重绘),判断胜负,使游戏开始,使游戏结束。这看上去是否简单,但是往往实现起来便没有这么简单了。
P.S.:纯粹的抄代码是没有什么意义的,因此这里不会贴完整代码,只会贴具体实现的部分代码(也不代表可以一步一步拼成一个完整代码)。
正题:我们需要一个界面,这个界面最好是比较大一点,因为棋盘是比较大的(15X15,当然希望做19X19的也是可以的,看个人的喜好),然后在左侧一定要留一个JPanel用于取画笔(不知道这一步由来的可以转向我之前写的绘图板篇详细了解绘图的有关内容)代码略……(界面是随意的,只要自己看得过去)
五子棋项目中,实现绘图最重要的是用于作为画板的JPanel(也可以是JFrame,原理是一样的),但是没有任何组件创建出来就是以棋盘为背景的,因此,我们需要自己绘制棋盘或者找一张棋盘的贴图贴上去。
这讲解一下绘制棋盘的方法,贴图的方法不提及。
原理是简单的划线,即在面板上反复绘制直线已达到棋盘的效果(也可以是画矩形,方法类似)
public void paintTable(Graphics g) {
for (int i = 0; i < RC; i++) {
g.drawLine(X + SIZE * i, Y, X + SIZE * i, SIZE * (RC - 1) + X);
g.drawLine(X, Y + SIZE * i, SIZE * (RC - 1) + X, Y + SIZE * i);
}
}
//RC表示需要的棋盘大小范围,X、Y代表棋盘的起始位置,SIZE表示每个格子的宽高。
//这些是参数,可以根据需要自行调整
此外,绘制棋子简单点说就是绘制圆形,即在规定位置绘制圆形,而且不能胡乱绘制(毕竟不是在纸上下棋,不可能乱画的),因此,要对鼠标点击的位置进行判断,然后在规定位置下棋。
if (x > 25 || y > 25) {
x = x - X;
y = y - Y;
dx = x - x / SIZE * SIZE;
dy = y - y / SIZE * SIZE;
if (dx <= SIZE / 2)
dx = x / SIZE;
else
dx = x / SIZE + 1;
if (dy <= SIZE / 2)
dy = y / SIZE;
else
dy = y / SIZE + 1;
} else if (x < 25 || y < 25) {
dx = x;
dy = y;
}
g.setColor(Color.WHITE);//白棋,如果是黑棋就为Color.BLACK
g.fillOval(dx * SIZE - R + X, dy * SIZE - R + Y, 2 * R, 2 * R);
//dx、dy用于保存棋子在棋盘上的相对位置,方便后续的绘制棋子等工作
//x、y为当时鼠标点击的x、y坐标
但是还有比较关键的部分是换颜色,不可能一直下黑棋或者白棋。此时使用一个标志变量就可以了,每下一个棋子我们将改变变量的值,然后在绘制棋子的时候就进行一次判断,根据不同的值来绘制不同的棋子。
if (b)
g.setColor(Color.BLACK);
else
g.setColor(Color.WHITE);
g.fillOval(dx * SIZE - R + X, dy * SIZE - R + Y, 2 * R, 2 * R);
b = !b;
//b为判断用的全局变量,true为下黑棋,false为下白棋,在上述的设置颜色的步骤中加上
完整方法:
private void play(int x, int y) {
if (x > 25 || y > 25) {
x = x - X;
y = y - Y;
dx = x - x / SIZE * SIZE;
dy = y - y / SIZE * SIZE;
if (dx <= SIZE / 2)
dx = x / SIZE;
else
dx = x / SIZE + 1;
if (dy <= SIZE / 2)
dy = y / SIZE;
else
dy = y / SIZE + 1;
} else if (x < 25 || y < 25) {
dx = x;
dy = y;
}
//dx、dy用于保存棋子在棋盘上的相对位置,方便后续的绘制棋子等工作
//x、y为当时鼠标点击的x、y坐标
if (b)
g.setColor(Color.BLACK);
else
g.setColor(Color.WHITE);
g.fillOval(dx * SIZE - R + X, dy * SIZE - R + Y, 2 * R, 2 * R);
b = !b;
//b为判断用的变量,true为下黑棋,false为下白棋
}
}
这就完成了五子棋的界面部分,并实现了下棋这个基本功能。但是,这个还存在各种各样的问题,即可以重复在一个位置不停下棋,这个问题之后的文章会不断完善。