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方法,就可以啓動遊戲了。

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