适合Java练手用,及其简单,界面使用awt框架实现。
五子棋小游戏一共有四个类: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方法,就可以启动游戏了。