JavaSE实现五子棋小游戏

适合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方法,就可以启动游戏了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章