请编出以下代码使用JavaSwing完成一款五子棋小游戏 功能要求: 1. 设计五子棋游戏棋盘 2. 首页菜单要求具备重新开始、悔棋、退出功能 3. 游戏要求具备人人、人机模式 4. 提供帮助菜单 说明游戏规则 5. 游戏玩法需要符合五子棋游戏基本规则
时间: 2024-03-08 21:50:59 浏览: 26
以下是JavaSwing实现的五子棋小游戏代码,实现了题目所要求的所有功能:
```java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class FiveChess extends JFrame implements ActionListener{
private int ROW = 15; // 棋盘行数
private int COL = 15; // 棋盘列数
private int[][] board; // 棋盘数组,0表示空位,1表示黑子,2表示白子
private int player; // 当前玩家,1表示黑子,2表示白子
private boolean gameover; // 游戏是否结束
private boolean isManToMan; // 是否人人对战
private boolean isManToMachine; // 是否人机对战
private boolean isPlayerTurn; // 是否轮到玩家下棋
private boolean isMachineTurn; // 是否轮到电脑下棋
private JButton[][] btns; // 按钮数组
private JButton btnStart; // 开始游戏按钮
private JButton btnRestart; // 重新开始按钮
private JButton btnWithdraw; // 悔棋按钮
private JButton btnExit; // 退出游戏按钮
private JButton btnManToMan; // 人人对战按钮
private JButton btnManToMachine; // 人机对战按钮
private JButton btnHelp; // 帮助按钮
private JTextArea txtHelp; // 帮助文本框
private JScrollPane scrollPane; // 帮助文本框滚动条
private JPanel pnlChessboard; // 棋盘面板
private JPanel pnlControl; // 控制面板
private JPanel pnlButtons; // 按钮面板
private JPanel pnlStart; // 开始游戏面板
private JPanel pnlHelp; // 帮助面板
public FiveChess(){
setTitle("五子棋小游戏");
setSize(600, 600);
setLocationRelativeTo(null);
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
board = new int[ROW][COL];
player = 1;
gameover = false;
isManToMan = false;
isManToMachine = false;
isPlayerTurn = true;
isMachineTurn = false;
// 初始化按钮数组
btns = new JButton[ROW][COL];
for(int i = 0; i < ROW; i++){
for(int j = 0; j < COL; j++){
btns[i][j] = new JButton();
btns[i][j].setPreferredSize(new Dimension(32, 32));
btns[i][j].addActionListener(this);
}
}
// 初始化开始游戏面板
btnStart = new JButton("开始游戏");
btnStart.addActionListener(this);
pnlStart = new JPanel();
pnlStart.add(btnStart);
// 初始化控制面板
btnRestart = new JButton("重新开始");
btnRestart.addActionListener(this);
btnRestart.setEnabled(false);
btnWithdraw = new JButton("悔棋");
btnWithdraw.addActionListener(this);
btnWithdraw.setEnabled(false);
btnExit = new JButton("退出游戏");
btnExit.addActionListener(this);
btnManToMan = new JButton("人人对战");
btnManToMan.addActionListener(this);
btnManToMan.setEnabled(false);
btnManToMachine = new JButton("人机对战");
btnManToMachine.addActionListener(this);
btnManToMachine.setEnabled(false);
pnlButtons = new JPanel();
pnlButtons.add(btnRestart);
pnlButtons.add(btnWithdraw);
pnlButtons.add(btnExit);
pnlControl = new JPanel(new GridLayout(2, 1));
pnlControl.add(pnlButtons);
pnlControl.add(btnManToMan);
pnlControl.add(btnManToMachine);
// 初始化帮助面板
txtHelp = new JTextArea();
txtHelp.setEditable(false);
txtHelp.setLineWrap(true);
txtHelp.setText("游戏规则:\n五子棋是一种运用黑白两色棋子在15×15格的棋盘上进行的棋类游戏。先在棋盘上落下的一方为先手,另一方为后手。先手方的棋子颜色为黑色,后手方的棋子颜色为白色。两人轮流在棋盘上落子,先连成五子者获胜。");
scrollPane = new JScrollPane(txtHelp, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
btnHelp = new JButton("帮助");
btnHelp.addActionListener(this);
pnlHelp = new JPanel();
pnlHelp.setLayout(new BorderLayout());
pnlHelp.add(scrollPane, BorderLayout.CENTER);
pnlHelp.add(btnHelp, BorderLayout.SOUTH);
// 初始化棋盘面板
pnlChessboard = new JPanel(new GridLayout(ROW, COL));
for(int i = 0; i < ROW; i++){
for(int j = 0; j < COL; j++){
pnlChessboard.add(btns[i][j]);
}
}
// 添加面板到窗口
add(pnlStart, BorderLayout.NORTH);
add(pnlControl, BorderLayout.WEST);
add(pnlChessboard, BorderLayout.CENTER);
add(pnlHelp, BorderLayout.EAST);
}
// 处理按钮事件
public void actionPerformed(ActionEvent e){
if(e.getSource() == btnStart){
btnStart.setEnabled(false);
btnManToMan.setEnabled(true);
btnManToMachine.setEnabled(true);
}
else if(e.getSource() == btnRestart){
gameover = false;
isPlayerTurn = true;
isMachineTurn = false;
player = 1;
btnStart.setEnabled(true);
btnManToMan.setEnabled(true);
btnManToMachine.setEnabled(true);
btnWithdraw.setEnabled(false);
for(int i = 0; i < ROW; i++){
for(int j = 0; j < COL; j++){
board[i][j] = 0;
btns[i][j].setIcon(null);
}
}
}
else if(e.getSource() == btnWithdraw){
if(isManToMan){
withdrawManToMan();
}
else if(isManToMachine){
withdrawManToMachine();
}
}
else if(e.getSource() == btnExit){
System.exit(0);
}
else if(e.getSource() == btnManToMan){
isManToMan = true;
isManToMachine = false;
btnManToMan.setEnabled(false);
btnManToMachine.setEnabled(false);
btnWithdraw.setEnabled(true);
for(int i = 0; i < ROW; i++){
for(int j = 0; j < COL; j++){
btns[i][j].setEnabled(true);
}
}
}
else if(e.getSource() == btnManToMachine){
isManToMan = false;
isManToMachine = true;
btnManToMan.setEnabled(false);
btnManToMachine.setEnabled(false);
btnWithdraw.setEnabled(true);
for(int i = 0; i < ROW; i++){
for(int j = 0; j < COL; j++){
btns[i][j].setEnabled(true);
}
}
}
else if(e.getSource() == btnHelp){
JOptionPane.showMessageDialog(null, pnlHelp, "游戏帮助", JOptionPane.PLAIN_MESSAGE);
}
else{
if(!gameover){
JButton btn = (JButton)e.getSource();
int row = -1, col = -1;
for(int i = 0; i < ROW; i++){
for(int j = 0; j < COL; j++){
if(btn == btns[i][j]){
row = i;
col = j;
break;
}
}
}
if(row != -1 && col != -1 && board[row][col] == 0){
if(isManToMan){
playManToMan(row, col);
}
else if(isManToMachine){
playManToMachine(row, col);
}
}
}
}
}
// 处理人人对战下棋
private void playManToMan(int row, int col){
if(isPlayerTurn){
board[row][col] = player;
if(player == 1){
btns[row][col].setIcon(new ImageIcon("black.png"));
}
else{
btns[row][col].setIcon(new ImageIcon("white.png"));
}
if(checkWin(row, col)){
gameover = true;
JOptionPane.showMessageDialog(null, "玩家" + player + "获胜!", "游戏结束", JOptionPane.INFORMATION_MESSAGE);
btnWithdraw.setEnabled(false);
}
else{
player = 3 - player;
}
}
else{
JOptionPane.showMessageDialog(null, "轮到另一个玩家下棋!", "提示", JOptionPane.WARNING_MESSAGE);
}
}
// 处理人机对战下棋
private void playManToMachine(int row, int col){
if(isPlayerTurn){
board[row][col] = player;
if(player == 1){
btns[row][col].setIcon(new ImageIcon("black.png"));
}
else{
btns[row][col].setIcon(new ImageIcon("white.png"));
}
if(checkWin(row, col)){
gameover = true;
JOptionPane.showMessageDialog(null, "玩家获胜!", "游戏结束", JOptionPane.INFORMATION_MESSAGE);
btnWithdraw.setEnabled(false);
}
else{
isPlayerTurn = false;
isMachineTurn = true;
makeMove();
}
}
else{
JOptionPane.showMessageDialog(null, "轮到电脑下棋!", "提示", JOptionPane.INFORMATION_MESSAGE);
}
}
// 处理人人对战悔棋
private void withdrawManToMan(){
int option = JOptionPane.showConfirmDialog(null, "确定要悔棋吗?", "确认", JOptionPane.YES_NO_OPTION);
if(option == JOptionPane.YES_OPTION){
for(int i = ROW - 1; i >= 0; i--){
for(int j = COL - 1; j >= 0; j--){
if(board[i][j] != 0){
board[i][j] = 0;
if(player == 1){
btns[i][j].setIcon(null);
player = 2;
}
else{
btns[i][j].setIcon(null);
player = 1;
}
isPlayerTurn = true;
isMachineTurn = false;
return;
}
}
}
}
}
// 处理人机对战悔棋
private void withdrawManToMachine(){
int option = JOptionPane.showConfirmDialog(null, "确定要悔棋吗?", "确认", JOptionPane.YES_NO_OPTION);
if(option == JOptionPane.YES_OPTION){
for(int i = ROW - 1; i >= 0; i--){
for(int j = COL - 1; j >= 0; j--){
if(board[i][j] != 0){
board[i][j] = 0;
if(player == 1){
btns[i][j].setIcon(null);
player = 2;
}
else{
btns[i][j].setIcon(null);
player = 1;
}
isPlayerTurn = true;
isMachineTurn = false;
return;
}
}
}
}
}
// 电脑下棋
private void makeMove(){
int[] move = findBestMove();
board[move[0]][move[1]] = player;
if(player == 1){
btns[move[0]][move[1]].setIcon(new ImageIcon("black.png"));
}
else{
btns[move[0]][move[1]].setIcon(new ImageIcon("white.png"));
}
if(checkWin(move[0], move[1])){
gameover = true;
JOptionPane.showMessageDialog(null, "电脑获胜!", "游戏结束", JOptionPane.INFORMATION_MESSAGE);
btnWithdraw.setEnabled(false);
}
else{
isMachineTurn = false;
isPlayerTurn = true;
}
}
// 查找最佳下棋位置
private int[] findBestMove(){
int[] move = new int[2];
int maxScore = Integer.MIN_VALUE;
for(int i = 0; i < ROW; i++){
for(int j = 0; j < COL; j++){
if(board[i][j] == 0){
int score = evaluate(i, j);
if(score > maxScore){
maxScore = score;
move[0] = i;
move[1] = j;
}
}
}
}
return move;
}
// 估价函数
private int evaluate(int row, int col){
int score = 0;
int[][] dirs = {{-1, -1}, {-1, 0}, {-1, 1}, {0, -1}, {0, 1}, {1, -1}, {1, 0}, {1, 1}};
for(int i = 0; i < dirs.length; i++){
int count1 = 0, count2 = 0;
for(int j = 1; j <= 4; j++){
int r = row + j * dirs[i][0];
int c = col + j * dirs[i][1];
if(r < 0 || r >= ROW || c < 0 || c >= COL || board[r][c] == 2){
break;
}
if(board[r][c] == 1){
count1++;
}
else{
count2++;
}
}
if(count1 == 4){
return Integer.MAX_VALUE;
}
if(count2 == 4){
return Integer.MIN_VALUE;
}
score += getScore(count1, count2);
}
return score;
}
// 根据连子数获取得分
private int getScore(int count1, int count2){
if(count1 == 0){
return getScore(count2);
}
if(count2 == 0){
return getScore(count1);
}
return 0;
}
// 根据连子数获取得分
private int getScore(int count){
switch(count){
case 1: return 1;
case 2: return 10;
case 3: return 100;
case 4: return 1000;
default: return 0;
}
}
// 检查是否获胜
private boolean checkWin(int row, int col){
int[][] dirs = {{-1, -1}, {-1, 0}, {-1, 1}, {0, -1}, {0, 1}, {1, -1}, {1, 0}, {1, 1}};
for(int i = 0; i < dirs.length; i++){
int count = 1;
for(int j = 1; j <= 4; j++){
int r = row + j * dirs[i][0];
int c = col + j * dirs[i][1];
if(r < 0 || r >= ROW || c < 0 || c >= COL || board[r][c] != player){
break;
}
count++;
}
for(int j = 1; j <= 4; j++){
int r = row - j * dirs[i][0];
int c = col - j * dirs[i][1];
if(r < 0 || r >= ROW || c < 0 || c >= COL || board[r][c] != player){
break;
}
count++;
}
if(count >= 5){
return true;
}
}
return false;
}
public static void main(String[] args){
FiveChess game = new FiveChess();
game.setVisible(true);
}
}
```
注意:上述代码中使用了黑色棋子图片`black.png`和白色棋子图片`white.png`,需要准备好这两张图片并放在程序所在目录下。