这部分内容需要一定的数组之类的数据结构的基础,这一部分讲解一下五子棋的重绘和防止重复在一个位置下棋的思路和解决方案。
之前是实现了简易的界面的点一下绘制一个棋子以及棋子的换边。但是,我们在下棋的函数里没有任何的判断语句是用于判断点击的位置是否有棋子,所以导致可以在一个位置不断下棋。
于是,我们需要一个用于存储位置的二维数组(当然也可以使用一维数组,本文介绍二维数组的使用方法),本人命名为piece
int[][] piece = new int[RC][RC];
//RC是棋盘的范围,RC X RC 的棋盘。
然后在每次下棋的时候进行一次判断,如果当前的相对位置没有棋子,则下一个当前颜色的棋子,否则什么都不会发生
更改后的下棋的函数:
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 (piece[dx][dy] == 0) {
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);
//emptyPiece、blackPiece与whitePiece棋子的颜色参数
if (piece[dx][dy] == emptyPiece) {
if (b) {
g.setColor(Color.BLACK);
piece[dx][dy] = blackPiece;
}
else {
g.setColor(Color.WHITE);
piece[dx][dy] = whitePiece;
}
g.fillOval(dx * SIZE - R + X, dy * SIZE - R + Y, 2 * R, 2 * R);
b = !b;
//b为判断用的变量,true为下黑棋,false为下白棋
}
b = !b;
//b为判断用的变量,true为下黑棋,false为下白棋
}
}
然后,为了不影响用户体验,我们还是要重绘。原理是类似的,先创建一个棋子类Pieces。
import java.awt.Color;
import java.awt.Graphics;
public class Pieces implements Gobang_window{
//Gobang_window,设置全局变量参数的接口,如RC,SIZE之类的值就在这里面,不是系统自带,为本人自己创建的
private int x , y;
private Color c;
private Graphics g;
/**
* 棋子类的构造方法
* @param g 传入要绘制棋子的绘图板
* @param x 传入棋子的x坐标
* @param y 传入棋子的y坐标
* @param c 传入棋子的颜色
*/
Pieces(Graphics g, int x, int y, Color c){
this.g = g;
this.x = x;
this.y = y;
this.c = c;
}
/**
* 绘制棋子的方法,重绘时使用,可以不写在这里,写在重绘的方法里
* @param g
*/
public void rePaint(Graphics g) {
g.setColor(c);
g.fillOval(x*SIZE-R+X, y*SIZE-R+Y, 2*R, 2*R);
}
public Color getC() {
return c;
}
public void setC(Color c) {
this.c = c;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
}
然后再在创建一个棋子类的数组Pi,并在下棋子成功时在数组内存储之前下的一个棋子信息。
if (piece[dx][dy] == emptyPiece) {
if (b) {
g.setColor(Color.BLACK);
piece[dx][dy] = blackPiece;
Pi[++len] = new Pieces(g, dx, dy, Color.BLACK);
}
else {
g.setColor(Color.WHITE);
piece[dx][dy] = whitePiece;
Pi[++len] = new Pieces(g, dx, dy, Color.WHITE);
}
g.fillOval(dx * SIZE - R + X, dy * SIZE - R + Y, 2 * R, 2 * R);
b = !b;
//b为判断用的变量,true为下黑棋,false为下白棋
}
此时,我们在我们熟悉的重绘方法里添加棋盘和棋子的重绘
public void paint(Graphics g) {
int x = 0, y = 0;
super.paint(g);
paintTable(g);
for (int i = 0; Pi[i] != null; i++)
Pi[i].rePaint(g);
}
然后,我们便实现了重绘并解决了重复下棋的问题;但是,我们还没有完成五子棋的基本内容,因为我们还无法判断胜负,这个问题涉及到有关的算法,会在之后的文章不断完善。