它具有简单的游戏循环和胜利条件检查。记住,这只是一个基础版本,并未包含人工智能(AI)对手或图形用户界面(GUI)。
import java.util.Scanner;
public class Gomoku {
private static final int SIZE = 15; //棋盘大小
private static final char EMPTY = '.'; //未放置棋子的位置
private static final char PLAYER_X = 'X';
private static final char PLAYER_O = 'O';
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
char[][] board = new char[SIZE][SIZE];
initializeBoard(board);
printBoard(board);
char currentPlayer = PLAYER_X;
while (true) {
System.out.println("Player " + currentPlayer + "'s turn");
System.out.print("Enter row and column (0 - " + (SIZE - 1) + "): ");
int row = scanner.nextInt();
int col = scanner.nextInt();
if (row < 0 || col < 0 || row >= SIZE || col >= SIZE || board[row][col] != EMPTY) {
System.out.println("Invalid move. Try again.");
continue;
}
board[row][col] = currentPlayer;
printBoard(board);
if (isWinningMove(board, row, col, currentPlayer)) {
System.out.println("Player " + currentPlayer + " wins!");
break;
} else if (isBoardFull(board)) {
System.out.println("The game is a tie!");
break;
}
currentPlayer = (currentPlayer == PLAYER_X) ? PLAYER_O : PLAYER_X;
}
scanner.close();
}
private static void initializeBoard(char[][] board) {
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
board[i][j] = EMPTY;
}
}
}
private static void printBoard(char[][] board) {
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
System.out.print(board[i][j] + " ");
}
System.out.println();
}
}
private static boolean isWinningMove(char[][] board, int row, int col, char player) {
// 检查行、列、对角线
return (checkLine(board, row, 0, 0, 1, player) ||
checkLine(board, 0, col, 1, 0, player) ||
checkLine(board, row, col, 1, 1, player) ||
checkLine(board, row, col, 1, -1, player));
}
private static boolean checkLine(char[][] board, int startRow, int startCol, int deltaRow, int deltaCol, char player) {
int count = 0;
for (int i = -4; i <= 4; i++) {
int r = startRow + i * deltaRow;
int c = startCol + i * deltaCol;
if (r >= 0 && r < SIZE && c >= 0 && c < SIZE && board[r][c] == player) {
count++;
if (count == 5) return true;
} else {
count = 0; // Reset count if not consecutive
}
}
return false;
}
private static boolean isBoardFull(char[][] board) {
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
if (board[i][j] == EMPTY) {
return false;
}
}
}
return true;
}
}
在这份代码中,我们定义了几个关键的方法:
- `initializeBoard()`: 初始化棋盘,填充为`EMPTY`由`.`表示。
- `printBoard()`: 打印当前棋盘的状态。
- `isWinningMove()`: 检查最后一手棋是否导致胜利。
- `checkLine()`: 检查一条线上是否连续有五个相同的棋子。
- `isBoardFull()`: 检查棋盘是否已满。
玩家交替输入他们的移动,如果输入无效(超出棋盘范围或该位置已经有棋子),他们需要重新输入。游戏在有一方胜出或棋盘填满后结束。
请记得,尽管这个例子没有图形界面,也没有过多复杂的规则实现(如禁手规则等),但它为你展示了五子棋基本逻辑的实现方式。😄🎲