五子棋的由来:
五子棋起源于中国,相传中华民族的祖先轩辕黄帝无意之中画了一些纵横交叉的线段,然后在上面摆上小石块,就想出了连五子的玩法。
实现过程:
- 创建棋盘类(Board.java):
public class Board {
public static final int ROW = 15; // 棋盘行数
public static final int COLUMN = 15; // 棋盘列数
private int[][] board; // 存储棋盘上每个格子的棋子状态,0表示未落子,1表示黑棋,2表示白棋
public Board() {
board = new int[ROW][COLUMN];
}
// 在指定位置落子,返回true表示落子成功,false表示该位置已经有棋子了
public boolean makeMove(int row, int column, int player) {
if (board[row][column] != 0) {
return false;
}
board[row][column] = player;
return true;
}
// 判断是否有玩家获胜,返回1表示黑棋获胜,2表示白棋获胜,0表示未分胜负
public int checkWin() {
int i, j, k;
for (i = 0; i < ROW; i++) { // 横向判断
for (j = 0; j < COLUMN - 4; j++) {
if (board[i][j] == board[i][j+1] && board[i][j] == board[i][j+2] && board[i][j] == board[i][j+3] && board[i][j] == board[i][j+4]) {
return board[i][j];
}
}
}
for (j = 0; j < COLUMN; j++) { // 竖向判断
for (i = 0; i < ROW - 4; i++) {
if (board[i][j] == board[i+1][j] && board[i][j] == board[i+2][j] && board[i][j] == board[i+3][j] && board[i][j] == board[i+4][j]) {
return board[i][j];
}
}
}
for (i = 0; i < ROW - 4; i++) { // 斜向判断(左上到右下)
for (j = 0; j < COLUMN - 4; j++) {
if (board[i][j] == board[i+1][j+1] && board[i][j] == board[i+2][j+2] && board[i][j] == board[i+3][j+3] && board[i][j] == board[i+4][j+4]) {
return board[i][j];
}
}
}
for (i = ROW-1; i >= 4; i--) { // 斜向判断(右上到左下)
for (j = 0; j < COLUMN - 4; j++) {
if (board[i][j] == board[i-1][j+1] && board[i][j] == board[i-2][j+2] && board[i][j] == board[i-3][j+3] && board[i][j] == board[i-4][j+4]) {
return board[i][j];
}
}
}
return 0; // 未分胜负
}
// 判断棋盘是否已满
public boolean isFull() {
for (int i = 0; i < ROW; i++) {
for (int j = 0; j < COLUMN; j++) {
if (board[i][j] == 0) {
return false;
}
}
}
return true;
}
// 获取棋盘上指定位置的状态
public int getCell(int row, int column) {
return board[row][column];
}
}
2.游戏界面类(GameFrame):
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class GameFrame extends JFrame implements ActionListener {
private static final long serialVersionUID = 1L;
private Board board; // 棋盘对象
private JButton[][] buttons; // 每个格子对应的按钮
private JLabel messageLabel; // 显示游戏信息的标签
private int currentPlayer = 1; // 当前落子玩家,1表示黑棋,2表示白棋
public GameFrame() {
board = new Board();
setTitle("五子棋");
setSize(600, 600);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel(new GridLayout(Board.ROW, Board.COLUMN));
add(panel, BorderLayout.CENTER);
buttons = new JButton[Board.ROW][Board.COLUMN];
for (int i = 0; i < Board.ROW; i++) {
for (int j = 0; j < Board.COLUMN; j++) {
JButton button = new JButton();
button.setPreferredSize(new Dimension(30, 30));
button.addActionListener(this);
panel.add(button);
buttons[i][j] = button;
}
}
JPanel bottomPanel = new JPanel(new FlowLayout());
add(bottomPanel, BorderLayout.SOUTH);
messageLabel = new JLabel("黑棋先行");
bottomPanel.add(messageLabel);
}
// 处理按钮点击事件
public void actionPerformed(ActionEvent e) {
JButton button = (JButton)e.getSource();
int row = -1, column = -1;
// 根据按钮在二维数组中的位置计算出在棋盘上的坐标
for (int i = 0; i < Board.ROW; i++) {
for (int j = 0; j < Board.COLUMN; j++) {
if (button == buttons[i][j]) {
row = i;
column = j;
break;
}
}
}
if (row >= 0 && column >= 0) {
if (board.makeMove(row, column, currentPlayer)) {
updateButton(button, currentPlayer);
int winner = board.checkWin();
if (winner != 0) {
gameOver(winner);
} else if (board.isFull()) {
gameOver(0); // 平局
} else {
switchPlayer();
}
}
}
}
// 更新按钮上的显示内容
private void updateButton(JButton button, int player) {
if (player == 1) {
button.setIcon(new ImageIcon("black.png"));
} else {
button.setIcon(new ImageIcon("white.png"));
}
}
// 切换落子玩家
private void switchPlayer() {
currentPlayer = currentPlayer == 1 ? 2 : 1;
messageLabel.setText(currentPlayer == 1 ? "黑棋下一步" : "白棋下一步");
}
// 游戏结束,显示胜利信息,并禁用所有按钮
private void gameOver(int winner) {
if (winner == 1) {
messageLabel.setText("黑棋获胜!");
} else if (winner == 2) {
messageLabel.setText("白棋获胜!");
} else {
messageLabel.setText("平局!");
}
for (int i = 0; i < Board.ROW; i++) {
for (int j = 0; j < Board.COLUMN; j++) {
buttons[i][j].setEnabled(false);
}
}
}
public static void main(String[] args) {
GameFrame frame = new GameFrame();
frame.setVisible(true);
}
}
最后,Black.png和white.png是用于白棋和黑棋的图片文件,自己网上找到,放在程序所在的目录下。即可运行开始游戏。
新人第一次发博客,请勿乱喷,谢谢