您的位置:首页 > 其它

五子棋游戏

2016-12-25 17:39 134 查看


五子棋游戏


关于画布


五子棋游戏中绘制棋盘时是需要用到画布,当然画布要从一个面板上得到,然后在画布上进行绘制横线和竖线得到画布用的方法是graphics=panel.getGraphics();那么接下来就可以绘制棋盘了。


这里以绘制十行十列棋盘为例


// 棋盘面板
JPanel panel_grid = new JPanel() {
public void paint(Graphics g) {
super.paint(g);
for (int i = 0; i < 10; i++) {
//水平直线
g.drawLine(10, 10 + 50 * i, 460, 10 + 50 * i);
//垂直直线
g.drawLine(10 + 50 * i, 10, 10 + 50 * i, 460);
}
}
}
4000
>


关于paint和repaint


在窗口发生改变的时候,比如放大或缩小,就会自动调用paint()方法。而在下棋的过程中会发现如果没有将绘制棋子的方法写在paint()方法里,一旦将窗口关掉,那么棋盘上的棋子就会消失。


而repaint()方法是用来调用paint()方法的,在设计重新开始一局游戏的时候直接用repaint,就会将棋子抹掉,当然还要用到一点其他的方法。


关于监听和绘制棋子


绘制棋子的时候是通过对棋盘面板pannel_grid进行鼠标监听来绘制。在绘制的时候需要将所有的棋子都记录下来,这样在重绘的时候就能画出棋盘在窗口改变前棋盘的样子,那么就需要用到一个集合ArrayList,当鼠标点击的时候就向集合中添加一颗棋子,再用循环将集合重的元素遍历。为了将棋子画在交叉点上,需要调整绘制棋子的位置。


值得注意的是在实现鼠标监听的时候,要将监听里的所有方法实现,其中内容可以是空,但不可以没有这个方法。

panel_grid.addMouseListener(new MouseListener() {//匿名内部类
@Override
public void mouseClicked(MouseEvent mouse) {
int x1 = mouse.getX();
int y1 = mouse.getY();
int x0, y0;
for (int i = 0; i <= 10; i++) {
for (int j = 0; j <= 10; j++) {
//x0,y0表示所有的交叉点
x0 = 50 * i;
y0 = 50 * j;
//flag数组用来记住棋盘上当前位置是否已有棋子
//0没有棋子,1为黑棋,2为白棋
if (flag[i][j] == 0) {
if (x0 - 50 / 3 <= x1 && x1 < x0 + 50 / 3
&& y0 - 50 / 3 <= y1 && y1 <= y0 + 50 / 3) {
//flag_color是一个全局变量,用来判断是画白棋还是黑棋
if (flag_color == 0) {
flag[i][j] = 1;
//chess也是一个全局变量,用来创建当前要画的棋子
chess = new Chess(x0, y0, Color.black);
// 黑棋
flag_color = 1;
} else if (flag_color == 1) {
chess = new Chess(x0, y0, Color.white);
flag[i][j] = 2;
// 白棋
flag_color = 0;
}
chess.draw(graphics);
isWin(i, j);
//list是一个棋子集合
list.add(chess)
}
}
}
}
}

@Override
public void mouseEntered(MouseEvent arg0) {
}
@Override
public void mouseExited(MouseEvent arg0) {
}
@Override
public void mousePressed(MouseEvent arg0) {
}
@Override
public void mouseReleased(MouseEvent arg0) {
}
});



遍历集合

for (int j = 0; j < list.size(); j++) {
list.get(j).draw(g);
}



由于在集合中放置的是棋子类的对象,所以就需要建立一个棋子类。而棋子其实就是一个圆盘,那么用fillOval(x, y, width, height)就可以绘制棋子了。

public class Chess {
int x, y;
Color color;
public Chess(int x, int y, Color color) {
this.color = color;
this.x = x - 5;
this.y = y - 5;
}
public void draw(Graphics g) {
g.setColor(color);
g.fillOval(x, y, 30, 30);
}
}



关于判断输赢


每下一颗棋子就需要判断四个方向是否有五颗连续相同颜色的棋子,四个方向分别是水平,垂直及对角线。那么就需要将棋盘的情况记录下来,而整个棋盘的交叉点就相当于是一个二维数组,因此在绘制一颗棋子的同时用二维数组记录下来,黑棋还是白棋。


这里给出水平方向的判断代码

public void isWin(int x, int y) {
int count = 1;
int a, b
92e7
;
a = x;
b = y;
while (a > 0 && flag[a][b] == flag[a - 1][b]) {// 向左
count++;
a--;
}
a = x;
b = y;
while (flag[a][b] == flag[a + 1][b] && a < 10) {// 向右
count++;
a++;
}
if (count >= 5) {
colorWin(flag[a][b]);
}


public void colorWin(int color) {
if (color == 1) {
JOptionPane.showMessageDialog(null, "黑棋赢了!");
}
if (color == 2) {
JOptionPane.showMessageDialog(null, "白棋赢了!");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: