J2SE版五子棋(Demo学习总结)

(完全手绘版五子棋)

在制作五子棋时的一般流程:

首先:设置好显示窗口的大小、布局、外观,绘制好棋子所下的网格线和一些信息描述等等。

其次:定义一个二维数组用于保存所有棋子的坐标,

例如:

// 保存之前下过的所有全部棋子的坐标

// 其中数据内容 0:表示这个点并没有棋子, 1:表示有这个点

int[][] allChess = new int[19][19];

当在网格线中放置棋子时,将相应的网格点存入到该数组中。如下所示:

x = e.getX();

y = e.getY();

if (x >= 10 && x <= 370 && y >= 70 && y <= 430) { // 鼠标在整个棋盘范围之内

x = (x - 10) / 20; // 判断是哪一格

y = (y - 70) / 20;

if (allChess[x][y] == 0) {

// 判断当前要下的是什么颜色的棋子

if (isBlack == true) {

allChess[x][y] = 1; // 向棋子数组中添加数据

isBlack = false;

} else {

allChess[x][y] = 2;

isBlack = true;

}

//在每次点击的时候进行重绘(这样不知妥不妥)

//并且在每走一格的时候都进行判断输赢O(∩_∩)O~

下面是详细的判断方法:

@Override

public void mousePressed(MouseEvent e) {

// TODO 鼠标点击操作

x = e.getX();

y = e.getY();

if (x >= 10 && x <= 370 && y >= 70 && y <= 430) { // 使鼠标在整个棋盘范围之内

x = (x - 10) / 20;

y = (y - 70) / 20;

if (allChess[x][y] == 0) {

// 判断当前要下的是什么颜色的棋子

if (isBlack) {

allChess[x][y] = 1; // 向棋子数组中添加数据

} else {

allChess[x][y] = 2;

}

isBlack = !isBlack; // 目的是让黑白棋子轮流下

winFlag = checkWin();//每走一格都要进行判断

if (winFlag) {

JOptionPane.showMessageDialog(this, "游戏结束,"

+ (allChess[x][y] == 1 ? "黑方" : "白方") + "获胜!");

}

}

}

this.repaint();

}

private boolean checkWin() {

boolean flag = false;

int color = allChess[x][y]; // 判断是黑色还是白色(表示刚下的那一格的棋子)

// 保存共有多少相同颜色的棋子相连

int count = 1;

int i = 1;

while (color == allChess[x + i][y]) {

count++;

i++;

}

i = 1;

while (color == allChess[x - i][y]) {

count++;

i++;

} // 纵向的判断

int i2 = 1;

int count2 = 1;

while (color == allChess[x][y - i2]) {

count2++;

i2++;

}

i2 = 1;

while (color == allChess[x][y + i2]) {

count2++;

i2++;

} // 斜方向的判断(右上 + 左下)

int i3 = 1;

int count3 = 1;

while (color == allChess[x + i3][y - i3]) {

count3++;

i3++;

}

i3 = 1;

while (color == allChess[x - i3][y + i3]) {

count3++;

i3++;

} // 斜方向的判断(右下 + 左上)

int i4 = 1;

int count4 = 1;

while (color == allChess[x + i4][y + i4]) {

count4++;

i4++;

}

i4 = 1;

while (color == allChess[x - i4][y - i4]) {

count4++;

i4++;

}

if (count >= 5)

flag = true;

if (count2 >= 5)

flag = true;

if (count3 >= 5)

flag = true;

if (count4 >= 5)

flag = true;

return flag;

}

根据棋盘上的左右方向,上下方向,左上右下方向,右下左上方向,判断当前网格线上的棋子个数,然后判断输赢。

下面是优化后的判断输赢的方法

private boolean checkWin() {

boolean flag = false;

// 保存共有多少相同颜色的棋子相连

int count = 1;

// 判断横向是否有五个棋子相连,特点 纵坐标 是相同,即allChess[x][y]中y值相同

int color = allChess[x][y]; // 判断是黑色还是白色

count = this.checkCount(1, 0, color); // 横向

if (count >= 5)

flag = true;

else {

count = this.checkCount(0, 1, color);

if (count >= 5)

flag = true;

else {

count = this.checkCount(1, -1, color);

if (count >= 5)

flag = true;

else {

count = this.checkCount(1, 1, color);

if (count >= 5)

flag = true;

}

}

}

return flag;

}

// 判断棋子连接的数量

private int checkCount(int xChange, int yChange, int color) {

int count = 1;

int tempX = xChange; // x临时变量

int tempY = yChange; // y临时变量

while (color == allChess[x + xChange][y + yChange]) {

count++;

if (xChange != 0)

xChange++;

if (yChange != 0)

if (yChange > 0)

yChange++;

else

yChange--;

}

xChange = tempX;

yChange = tempY;

while (color == allChess[x - xChange][y - yChange]) {

count++;

if (xChange != 0)

xChange++;

if (yChange != 0)

if (yChange > 0)

yChange++;

else

yChange--;

}

return count;

}

linux

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwjjdw.html