五子棋是一种双人对弈的棋类游戏,通常在棋盘上进行。棋盘为 15×15 的方格,黑白双方各执棋子,轮流在棋盘的格点上落子,先在横、竖、斜线上形成五个相连的同色棋子者获胜。五子棋规则简单,易学难精,兼具攻防和谋略,是一种极具智慧和趣味性的游戏。
以下是使用Java编写的五子棋游戏的示例代码:
棋盘类:
public class ChessBoard {
private int[][] board;
private final int rows;
private final int cols;
private final int winCount;
public ChessBoard(int rows, int cols, int winCount) {
this.rows = rows;
this.cols = cols;
this.winCount = winCount;
board = new int[rows][cols];
}
public int getRows() {
return rows;
}
public int getCols() {
return cols;
}
public int getWinCount() {
return winCount;
}
public int getChessman(int row, int col) {
return board[row][col];
}
public boolean canPutChessman(int row, int col) {
return board[row][col] == 0;
}
public void putChessman(int row, int col, int player) {
board[row][col] = player;
}
public boolean isFull() {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if (board[i][j] == 0) {
return false;
}
}
}
return true;
}
public boolean hasWinner(int player) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if (board[i][j] == player) {
if (checkHorizontal(i, j, player)) {
return true;
}
if (checkVertical(i, j, player)) {
return true;
}
if (checkDiagonal1(i, j, player)) {
return true;
}
if (checkDiagonal2(i, j, player)) {
return true;
}
}
}
}
return false;
}
private boolean checkHorizontal(int row, int col, int player) {
int count = 1;
for (int j = col + 1; j < cols && board[row][j] == player; j++) {
count++;
}
for (int j = col - 1; j >= 0 && board[row][j] == player; j--) {
count++;
}
return count >= winCount;
}
private boolean checkVertical(int row, int col, int player) {
int count = 1;
for (int i = row + 1; i < rows && board[i][col] == player; i++) {
count++;
}
for (int i = row - 1; i >= 0 && board[i][col] == player; i--) {
count++;
}
return count >= winCount;
}
private boolean checkDiagonal1(int row, int col, int player) {
int count = 1;
for (int i = row + 1, j = col + 1; i < rows && j < cols && board[i][j] == player; i++, j++) {
count++;
}
for (int i = row - 1, j = col - 1; i >= 0 && j >= 0 && board[i][j] == player; i--, j--) {
count++;
}
return count >= winCount;
}
private boolean checkDiagonal2(int row, int col, int player) {
int count = 1;
for (int i = row + 1, j = col - 1; i < rows && j >= 0 && board[i][j] == player; i++, j--) {
count++;
}
for (int i = row - 1, j = col + 1; i >= 0 && j < cols && board[i][j] == player; i--, j++) {
count++;
}
return count >= winCount;
}
}
游戏界面类:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class GameUI extends JFrame {
private final int rows;
private final int cols;
private final int winCount;
private ChessBoard board;
private int currentPlayer;
private boolean gameOver;
private final JPanel panel;
public GameUI(int rows, int cols, int winCount) {
this.rows = rows;
this.cols = cols;
this.winCount = winCount;
setTitle("五子棋");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(cols * 40, rows * 40); // 每个棋子为正方形,大小为40
setLocationRelativeTo(null);
currentPlayer = 1;
board = new ChessBoard(rows, cols, winCount);
gameOver = false;
panel = new JPanel() {
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
int chessman = board.getChessman(i, j);
if (chessman == 1) {
g.setColor(Color.BLACK);
g.fillOval(j * 40 + 5, i * 40 + 5, 30, 30);
} else if (chessman == 2) {
g.setColor(Color.WHITE);
g.fillOval(j * 40 + 5, i * 40 + 5, 30, 30);
g.setColor(Color.BLACK);
g.drawOval(j * 40 + 5, i * 40 + 5, 30, 30);
}
}
}
}
};
panel.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (gameOver) {
return;
}
int col = e.getX() / 40;
int row = e.getY() / 40;
if (row < rows && col < cols && board.canPutChessman(row, col)) {
board.putChessman(row, col, currentPlayer);
panel.repaint();
if (board.hasWinner(currentPlayer)) {
gameOver = true;
System.out.println("Player " + currentPlayer + " wins.");
} else if (board.isFull()) {
gameOver = true;
System.out.println("Tie game.");
} else {
currentPlayer = 3 - currentPlayer; // 切换玩家
}
}
}
});
add(panel);
setVisible(true);
}
}
主程序:
public class Main {
public static void main(String[] args) {
new GameUI(15, 15, 5);
}
}
在主程序中创建游戏界面对象,传入行数、列数和获胜所需连续棋子个数,即可开始游戏。
效果如下:
快去体验一下吧!