用Java写一个点格棋程序实现人机对战
时间: 2023-08-14 20:07:20 浏览: 115
好的,以下是Java实现的点格棋程序的基本思路:
1. 首先需要定义一个棋盘,可以使用二维数组或者其他数据结构来表示。
2. 接着,需要定义玩家和AI两个角色,在玩家下完一步棋后,AI会根据当前局面做出回应。
3. 玩家和AI轮流下棋,每次下完棋之后需要判断是否有人获胜或者平局,如果没有,则交换角色继续下棋。
4. 在AI下棋时,可以使用一些算法来评估当前局面的价值,比如极大极小值算法、alpha-beta剪枝算法等。
5. 最后,需要实现一个简单的GUI界面,让用户可以点击棋盘上的空位来下棋,并且能够显示当前的游戏进度和结果。
下面是一个简单的点格棋程序的Java代码示例,仅供参考:
```java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class DotBox extends JFrame implements ActionListener {
private JButton[][] button;
private int[][] board;
private int currentPlayer;
private final int player1 = 1;
private final int player2 = 2;
private final int size;
private final int maxMoves;
private int movesLeft;
public DotBox(int size) {
super("Dot Box");
this.size = size;
maxMoves = size * (size + 1) * 2;
movesLeft = maxMoves;
currentPlayer = player1;
board = new int[size][size];
button = new JButton[size + 1][size + 1];
JPanel p = new JPanel();
p.setLayout(new GridLayout(size + 1, size + 1));
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
board[i][j] = 0;
}
}
for (int i = 0; i < size + 1; i++) {
for (int j = 0; j < size + 1; j++) {
button[i][j] = new JButton();
button[i][j].setPreferredSize(new Dimension(50, 50));
button[i][j].addActionListener(this);
p.add(button[i][j]);
}
}
add(p);
setSize(600, 600);
setVisible(true);
}
public void actionPerformed(ActionEvent e) {
for (int i = 0; i < size + 1; i++) {
for (int j = 0; j < size + 1; j++) {
if (e.getSource() == button[i][j]) {
if (i == 0 || j == 0 || i == size || j == size) {
// Border button clicked
return;
} else if (board[i - 1][j - 1] == 0) {
board[i - 1][j - 1] = currentPlayer;
movesLeft--;
button[i][j].setEnabled(false);
if (currentPlayer == player1) {
button[i][j].setBackground(Color.RED);
} else {
button[i][j].setBackground(Color.BLUE);
}
checkForBoxes(i - 1, j - 1);
if (movesLeft == 0) {
endGame();
}
currentPlayer = (currentPlayer == player1) ? player2 : player1;
return;
}
}
}
}
}
private void checkForBoxes(int row, int col) {
int boxesCompleted = 0;
// Check square above
if (row > 0) {
if (board[row - 1][col] > 0 && board[row - 1][col + 1] > 0 && board[row][col] > 0
&& board[row][col + 1] > 0) {
boxesCompleted++;
if (currentPlayer == player1) {
button[row][col].setBackground(Color.ORANGE);
button[row - 1][col].setBackground(Color.ORANGE);
button[row - 1][col + 1].setBackground(Color.ORANGE);
button[row][col + 1].setBackground(Color.ORANGE);
board[row - 1][col] = board[row - 1][col + 1] = board[row][col] = board[row][col + 1] = player1 + 2;
} else {
button[row][col].setBackground(Color.GREEN);
button[row - 1][col].setBackground(Color.GREEN);
button[row - 1][col + 1].setBackground(Color.GREEN);
button[row][col + 1].setBackground(Color.GREEN);
board[row - 1][col] = board[row - 1][col + 1] = board[row][col] = board[row][col + 1] = player2 + 2;
}
}
}
// Check square below
if (row < size - 1) {
if (board[row][col] > 0 && board[row][col + 1] > 0 && board[row + 1][col] > 0
&& board[row + 1][col + 1] > 0) {
boxesCompleted++;
if (currentPlayer == player1) {
button[row][col].setBackground(Color.ORANGE);
button[row][col + 1].setBackground(Color.ORANGE);
button[row + 1][col].setBackground(Color.ORANGE);
button[row + 1][col + 1].setBackground(Color.ORANGE);
board[row][col] = board[row][col + 1] = board[row + 1][col] = board[row + 1][col + 1] = player1 + 2;
} else {
button[row][col].setBackground(Color.GREEN);
button[row][col + 1].setBackground(Color.GREEN);
button[row + 1][col].setBackground(Color.GREEN);
button[row + 1][col + 1].setBackground(Color.GREEN);
board[row][col] = board[row][col + 1] = board[row + 1][col] = board[row + 1][col + 1] = player2 + 2;
}
}
}
// Check square left
if (col > 0) {
if (board[row][col - 1] > 0 && board[row + 1][col - 1] > 0 && board[row][col] > 0
&& board[row + 1][col] > 0) {
boxesCompleted++;
if (currentPlayer == player1) {
button[row][col].setBackground(Color.ORANGE);
button[row + 1][col].setBackground(Color.ORANGE);
button[row][col - 1].setBackground(Color.ORANGE);
button[row + 1][col - 1].setBackground(Color.ORANGE);
board[row][col - 1] = board[row + 1][col - 1] = board[row][col] = board[row + 1][col] = player1 + 2;
} else {
button[row][col].setBackground(Color.GREEN);
button[row + 1][col].setBackground(Color.GREEN);
button[row][col - 1].setBackground(Color.GREEN);
button[row + 1][col - 1].setBackground(Color.GREEN);
board[row][col - 1] = board[row + 1][col - 1] = board[row][col] = board[row + 1][col] = player2 + 2;
}
}
}
// Check square right
if (col < size - 1) {
if (board[row][col] > 0 && board[row + 1][col] > 0 && board[row][col + 1] > 0
&& board[row + 1][col + 1] > 0) {
boxesCompleted++;
if (currentPlayer == player1) {
button[row][col].setBackground(Color.ORANGE);
button[row + 1][col].setBackground(Color.ORANGE);
button[row][col + 1].setBackground(Color.ORANGE);
button[row + 1][col + 1].setBackground(Color.ORANGE);
board[row][col] = board[row + 1][col] = board[row][col + 1] = board[row + 1][col + 1] = player1 + 2;
} else {
button[row][col].setBackground(Color.GREEN);
button[row + 1][col].setBackground(Color.GREEN);
button[row][col + 1].setBackground(Color.GREEN);
button[row + 1][col + 1].setBackground(Color.GREEN);
board[row][col] = board[row + 1][col] = board[row][col + 1] = board[row + 1][col + 1] = player2 + 2;
}
}
}
if (boxesCompleted > 0) {
if (currentPlayer == player1) {
// Player 1 gets another turn
movesLeft++;
} else {
// Switch to player 2's turn
currentPlayer = player2;
}
}
}
private void endGame() {
int player1Score = 0;
int player2Score = 0;
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
if (board[i][j] == player1 + 2) {
player1Score++;
} else if (board[i][j] == player2 + 2) {
player2Score++;
}
}
}
if (player1Score > player2Score) {
JOptionPane.showMessageDialog(this, "Player 1 wins!");
} else if (player2Score > player1Score) {
JOptionPane.showMessageDialog(this, "Player 2 wins!");
} else {
JOptionPane.showMessageDialog(this, "It's a tie!");
}
System.exit(0);
}
public static void main(String[] args) {
int size = 5;
new DotBox(size);
}
}
```
这个程序使用了Swing框架来实现GUI界面,玩家和AI的角色切换是在`actionPerformed()`方法中实现的,AI的下棋算法可以在这个方法中添加。检查是否有人获胜或者平局的方法是在`checkForBoxes()`方法中实现的。最后,当游戏结束时,会调用`endGame()`方法来显示游戏结果。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)