JavaSE实现五子棋小游戏
五子棋小游戏一共有四个类:background.java(画五子棋的背景)、constant.java(存储一些常量)、ruler.java(判赢规则)、Main.java(启动类)。
一步一步来,我们先定义好游戏内的常量(这里是我一点一点调出来的):
-
public
class constant {
-
final
static
int h =
14;
// 行数
-
final
static
int l =
14;
// 列数
-
final
static
int space =
50;
// 行与行之间,列与列之间距离
-
final
static
int height =
750;
// 窗口高度
-
final
static
int width =
750;
// 窗口宽度
-
-
}
然后画好五子棋的棋盘background.java,这里也很简单就是两个for循环,一个画横线,一个画竖线:
-
public
class background {
-
public static void draw(Graphics g) {
-
g.setColor(Color.black);
-
for (
int i =
1; i < constant.h +
1; i++)
-
g.drawLine(i * constant.space,
50, i * constant.space, constant.height -
50);
-
for (
int i =
1; i < constant.l +
1; i++)
-
g.drawLine(
50, i * constant.space, constant.width -
50, i * constant.space);
-
}
-
-
}
然后是我们的判赢规则ruler.java,其实也相当简单(因为白棋画不出来,所以用的蓝棋替代):
这里说一下方法参数ArrayList中存储的数据是什么?
其实存储就是每个棋子在棋盘上的位置,在这里我规定的是最左上角的那个落棋点坐标为1,然后向右依次为2、3 、4.。。。,然后第二行最左边的坐标为第一行最右边的坐标加1,以此类推,棋盘上每一个点都有唯一的坐标。
这样我们就可以根据,棋子的坐标,来判定是否已经连成5个。
-
public
class ruler {
-
public static boolean blackWin(ArrayList<Integer> list) {
-
for (
int i =
1; i <= constant.h * constant.l; i++) {
-
// 如果同时出现横着的五个黑棋
-
if (i % constant.h <=
10 && list.contains(i) && list.contains(i +
1) && list.contains(i +
2)
-
&& list.contains(i +
3) && list.contains(i +
4))
-
return
true;
-
// 如果同时出现竖着的五个黑棋
-
if (i < (constant.h -
4) * constant.l && list.contains(i) && list.contains(i + constant.l)
-
&& list.contains(i + constant.l *
2) && list.contains(i + constant.l *
3)
-
&& list.contains(i + constant.l *
4))
-
return
true;
-
// 如果同时出现左倾斜的五个黑棋
-
if (i % constant.h <=
10 && i < (constant.h -
4) * constant.l && list.contains(i)
-
&& list.contains(i + constant.l +
1) && list.contains(i + (constant.l +
1) *
2)
-
&& list.contains(i + (constant.l +
1) *
3) && list.contains(i + (constant.l +
1) *
4))
-
return
true;
-
// 如果同时出现右倾斜的五个黑棋
-
if (i % constant.l >=
5 && i < (constant.h -
4) * constant.l && list.contains(i)
-
&& list.contains(i + (constant.l -
1) *
1) && list.contains(i + (constant.l -
1) *
2)
-
&& list.contains(i + (constant.l -
1) *
3) && list.contains(i + (constant.l -
1) *
4))
-
return
true;
-
}
-
return
false;
-
-
}
-
-
public static boolean blueWin(ArrayList<Integer> list) {
-
for (
int i =
1; i <= constant.h * constant.l; i++) {
-
// 如果同时出现横着的五个蓝棋
-
if (i % constant.h <=
10 && list.contains(i) && list.contains(i +
1) && list.contains(i +
2)
-
&& list.contains(i +
3) && list.contains(i +
4))
-
return
true;
-
// 如果同时出现竖着的五个蓝棋
-
if (i < (constant.h -
4) * constant.l && list.contains(i) && list.contains(i + constant.l)
-
&& list.contains(i + constant.l *
2) && list.contains(i + constant.l *
3)
-
&& list.contains(i + constant.l *
4))
-
return
true;
-
// 如果同时出现左倾斜的五个蓝棋
-
if (i % constant.h <=
10 && i < (constant.h -
4) * constant.l && list.contains(i)
-
&& list.contains(i + constant.l +
1) && list.contains(i + (constant.l +
1) *
2)
-
&& list.contains(i + (constant.l +
1) *
3) && list.contains(i + (constant.l +
1) *
4))
-
return
true;
-
// 如果同时出现右倾斜的五个蓝棋
-
if (i % constant.l >=
5 && i < (constant.h -
4) * constant.l && list.contains(i)
-
&& list.contains(i + (constant.l -
1) *
1) && list.contains(i + (constant.l -
1) *
2)
-
&& list.contains(i + (constant.l -
1) *
3) && list.contains(i + (constant.l -
1) *
4))
-
return
true;
-
}
-
return
false;
-
-
}
-
}
最后就是主类Main.java:
-
public
class Main extends JFrame {
-
private JPanel p;
-
private
int Pointx, Pointy;
// 获得棋子的落点位置
-
private
int count =
0;
// 获得点击次数,用来实现棋子转换
-
private ArrayList<Integer> listblack =
new ArrayList<>();
//存放黑棋落点位置
-
private ArrayList<Integer> listblue =
new ArrayList<>();
//存放蓝棋落点位置
-
-
public Main() {
-
super(
"五子棋");
-
p =
new JPanel();
-
p.addMouseListener(
new Monitor());
-
this.add(p);
-
-
setSize(
750,
750);
-
setVisible(
true);
-
}
-
-
class Monitor extends MouseAdapter {
-
@Override
-
public void mouseReleased(MouseEvent e) {
-
Pointx = Location(e.getX() +
8);
// 鼠标实际点击位置与获得坐标有偏差,这里大家根据自己的情况修改
-
Pointy = Location(e.getY() +
31);
-
repaint();
-
}
-
}
-
-
public void paint(Graphics g) {
-
background.draw(g);
// 画出棋盘
-
// 如果该点之前没被画过,即blacklist和bluelist都不含此点
-
if (!listblue.contains(point(Pointx, Pointy)) && !listblack.contains(point(Pointx, Pointy))) {
-
if (count %
2 ==
0) {
-
g.setColor(Color.black);
-
g.fillOval(Pointx -
20, Pointy -
20,
40,
40);
-
listblack.add(point(Pointx, Pointy));
-
}
else {
-
g.setColor(Color.blue);
-
g.fillOval(Pointx -
20, Pointy -
20,
40,
40);
-
listblue.add(point(Pointx, Pointy));
-
}
-
count++;
-
}
-
gameOver();
-
}
-
-
// 定位与所点击 点最近的落子位置
-
public int Location(int x) {
-
int lx;
-
lx = (x *
2 +
50) /
100;
-
return lx *
50;
-
}
-
-
// 给棋盘上每个点一个标号,方便判断胜利
-
public int point(int x, int y) {
-
return x /
50 + (y /
50 -
1) * constant.h;
-
}
-
-
public void gameOver() {
-
if (ruler.blackWin(listblack)) {
-
JOptionPane.showMessageDialog(
this,
"黑棋胜!",
"游戏结束", JOptionPane.INFORMATION_MESSAGE);
-
System.exit(
0);
-
}
-
if (ruler.blueWin(listblue)) {
-
JOptionPane.showMessageDialog(
this,
"蓝棋胜!",
"游戏结束", JOptionPane.INFORMATION_MESSAGE);
-
System.exit(
0);
-
}
-
}
-
-
public static void main(String[] args) {
-
Main m =
new Main();
-
m.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
-
}
-
-
}
最后运行里面的main方法,就可以启动游戏了。