import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class GameFrame extends JFrame implements ActionListener {
private static final long serialVersionUID = 1L;
private static final int ROWS = 15;
private static final int COLS = 15;
private char[][] board;
private JButton[][] buttonGrids;
private JLabel playerLabel;
private char currentPlayer;
public GameFrame() {
setTitle("五子棋游戏");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 初始化棋盘
board = new char[ROWS][COLS];
for (int i = 0; i < ROWS; i++) {
for (int j = 0; j < COLS; j++) {
board[i][j] = '+';
}
}
// 初始化玩家信息
currentPlayer = 'X';
// 创建棋盘面板
JPanel boardPanel = new JPanel(new GridLayout(ROWS, COLS));
boardPanel.setPreferredSize(new Dimension(640, 640));
buttonGrids = new JButton[ROWS][COLS];
for (int i = 0; i < ROWS; i++) {
for (int j = 0; j < COLS; j++) {
JButton button = new JButton();
button.addActionListener(this);
button.setBackground(Color.WHITE);
buttonGrids[i][j] = button;
boardPanel.add(button);
}
}
// 创建底部信息面板
JPanel infoPanel = new JPanel(new BorderLayout());
playerLabel = new JLabel("当前玩家:X", JLabel.CENTER);
playerLabel.setFont(new Font("宋体", Font.BOLD, 30));
infoPanel.add(playerLabel, BorderLayout.CENTER);
// 将棋盘面板和底部信息面板添加到游戏主窗口
getContentPane().add(boardPanel, BorderLayout.CENTER);
getContentPane().add(infoPanel, BorderLayout.SOUTH);
// 设置窗口大小并居中显示
pack();
setLocationRelativeTo(null);
setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
JButton button = (JButton) e.getSource();
int row = -1, col = -1;
for (int i = 0; i < ROWS; i++) {
for (int j = 0; j < COLS; j++) {
if (button == buttonGrids[i][j]) {
row = i;
col = j;
break;
}
}
}
if (row >= 0 && col >= 0 && board[row][col] == '+') {
board[row][col] = currentPlayer;
button.setText(String.valueOf(currentPlayer));
button.setBackground(currentPlayer == 'X' ? Color.BLACK : Color.WHITE);
if (isWinningMove(row, col)) {
JOptionPane.showMessageDialog(this, "玩家 " + currentPlayer + " 获胜!");
newGame();
} else if (isDraw()) {
JOptionPane.showMessageDialog(this, "平局!");
newGame();
} else {
currentPlayer = (currentPlayer == 'X' ? 'O' : 'X');
playerLabel.setText("当前玩家:" + currentPlayer);
}
}
}
private boolean isWinningMove(int row, int col) {
char color = board[row][col];
int count = 1;
for (int i = col - 1; i >= 0; i--) {
if (board[row][i] == color) {
count++;
} else {
break;
}
}
if (count >= 5) {
return true;
}
for (int i = col + 1; i < COLS; i++) {
if (board[row][i] == color) {
count++;
} else {
break;
}
}
if (count >= 5) {
return true;
}
count = 1;
for (int i = row - 1; i >= 0; i--) {
if (board[i][col] == color) {
count++;
} else {
break;
}
}
if (count >= 5) {
return true;
}
for (int i = row + 1; i < ROWS; i++) {
if (board[i][col] == color) {
count++;
} else {
break;
}
}
if (count >= 5) {
return true;
}
count = 1;
for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) {
if (board[i][j] == color) {
count++;
} else {
break;
}
}
if (count >= 5) {
return true;
}
for (int i = row + 1, j = col + 1; i < ROWS && j < COLS; i++, j++) {
if (board[i][j] == color) {
count++;
} else {
break;
}
}
if (count >= 5) {
return true;
}
count = 1;
for (int i = row + 1, j = col - 1; i < ROWS && j >= 0; i++, j--) {
if (board[i][j] == color) {
count++;
} else {
break;
}
}
if (count >= 5) {
return true;
}
for (int i = row - 1, j = col + 1; i >= 0 && j < COLS; i--, j++) {
if (board[i][j] == color) {
count++;
} else {
break;
}
}
if (count >= 5) {
return true;
}
return false;
}
private boolean isDraw() {
for (int i = 0; i < ROWS; i++) {
for (int j = 0; j < COLS; j++) {
if (board[i][j] == '+') {
return false;
}
}
}
return true;
}
private void newGame() {
currentPlayer = 'X';
playerLabel.setText("当前玩家:" + currentPlayer);
for (int i = 0; i < ROWS; i++) {
for (int j = 0; j < COLS; j++) {
board[i][j] = '+';
buttonGrids[i][j].setText("");
buttonGrids[i][j].setBackground(Color.WHITE);
}
}
}
public static void main(String[] args) {
new GameFrame();
}
}
这份代码创建了一个类 `GameFrame`,它继承自 `JFrame` 并实现了 `ActionListener` 接口,用来监听按钮事件。
首先,在构造函数中创建了棋盘面板和底部信息面板,并将它们添加到游戏主窗口。
然后,在按钮事件的处理方法 `actionPerformed()` 中,首先判断当前按钮是否可以下棋,如果可以则将当前玩家的棋子放入该位置,并改变按钮的显示和背景颜色。然后判断当前位置是否是获胜的位置或者所有位置都下满了的平局,如果是则弹出相应的提示框,并调用 `newGame()` 方法开始新的游戏。
`isWinningMove()` 方法用来判断当前落子是否为获胜的位置,它通过搜索该位置所在的行、列、对角线是否存在五个相同颜色的棋子来判断是否获胜。
`isDraw()` 方法用来判断是否为平局。
`newGame()` 方法用于初始化棋盘和玩家状态,为开始新的游戏做准备。
最后,在 `main()` 方法中创建了一个 `GameFrame` 类的实例,即开始游戏。
需要注意的是,上述示例代码只是五子棋游戏的一份简单实现,你可以在此基础上进行扩展和优化,使其更加完善。