五子棋游戏软件设计

1. 设计内容

设计一个程序能完成五子棋游戏功能。五子棋规则:双方各执一色棋子,轮流下子(即将棋子放在棋盘的任一空交叉点上),直到有一方的棋子有5个排成一线(无论是横向、竖向还是斜向均可),则棋局结束,该方胜利。

2. 设计要求

  • (1) 设计游戏的核心算法;
  • (2) 设计可视化的界面且双方所使用的两色棋子和彩色棋盘得体大方、比例恰当;
  • (3) 双方轮流用键盘或鼠标下子。只有当鼠标单击在棋盘网格交叉点附近时才可下子,点击其他地方及已有子的位置不能下子,且应给出相应提示;
  • (4) 在适当位置可显示比赛结果,比赛中能随时存储当前棋局。

3. 设计思路

  • (1) 核心算法:使用二维数组表示棋盘,每个位置的值为 0 表示该位置为空,为 1 表示为黑棋,为 2 表示为白棋。每次下子后判断是否有五子连珠,若有则游戏结束,否则继续轮流下子。
  • (2) 界面设计:使用 GUI 界面设计,使用合适大小的棋盘和棋子图案,可以使用图片或自绘。
  • (3) 下子操作:使用鼠标单击事件实现下子操作,判断点击位置是否在网格交叉点附近,若是则下子,否则给出相应提示。
  • (4) 比赛结果显示:在适当位置显示比赛结果,使用弹窗或标签实现。存储当前棋局可以使用文件存储或数据库存储。

4. 参考代码

以下是五子棋游戏的 Java 参考代码:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Gobang extends JFrame implements ActionListener, MouseListener {
    private int[][] board = new int[15][15]; // 棋盘
    private int turn = 1; // 轮到哪一方下棋
    private JLabel resultLabel = new JLabel('游戏进行中'); // 显示比赛结果的标签

    public Gobang() {
        // 初始化界面
        setTitle('五子棋');
        setSize(500, 500);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        // 添加菜单栏
        JMenuBar menuBar = new JMenuBar();
        setJMenuBar(menuBar);
        JMenu gameMenu = new JMenu('游戏');
        menuBar.add(gameMenu);
        JMenuItem newGameMenuItem = new JMenuItem('新游戏');
        newGameMenuItem.addActionListener(this);
        gameMenu.add(newGameMenuItem);
        JMenuItem saveGameMenuItem = new JMenuItem('保存游戏');
        saveGameMenuItem.addActionListener(this);
        gameMenu.add(saveGameMenuItem);
        JMenuItem loadGameMenuItem = new JMenuItem('加载游戏');
        loadGameMenuItem.addActionListener(this);
        gameMenu.add(loadGameMenuItem);

        // 添加棋盘
        JPanel boardPanel = new JPanel(new GridLayout(15, 15));
        boardPanel.setPreferredSize(new Dimension(400, 400));
        for (int i = 0; i < 15; i++) {
            for (int j = 0; j < 15; j++) {
                JButton button = new JButton();
                button.setPreferredSize(new Dimension(25, 25));
                button.setBackground(Color.WHITE);
                button.setBorder(BorderFactory.createLineBorder(Color.BLACK));
                button.addMouseListener(this);
                boardPanel.add(button);
            }
        }
        add(boardPanel, BorderLayout.CENTER);

        // 添加比赛结果标签
        add(resultLabel, BorderLayout.SOUTH);
    }

    public static void main(String[] args) {
        Gobang game = new Gobang();
        game.setVisible(true);
    }

    // 菜单栏和棋盘监听事件
    public void actionPerformed(ActionEvent e) {
        String command = e.getActionCommand();
        if (command.equals('新游戏')) {
            newGame();
        } else if (command.equals('保存游戏')) {
            saveGame();
        } else if (command.equals('加载游戏')) {
            loadGame();
        }
    }
    public void mouseClicked(MouseEvent e) {
        JButton button = (JButton) e.getSource();
        int x = button.getX() / 25;
        int y = button.getY() / 25;
        if (board[x][y] == 0) {
            board[x][y] = turn;
            if (turn == 1) {
                button.setBackground(Color.BLACK);
            } else {
                button.setBackground(Color.WHITE);
            }
            if (checkWin(x, y)) {
                resultLabel.setText(turn == 1 ? '黑方获胜' : '白方获胜');
            } else {
                turn = turn == 1 ? 2 : 1;
                resultLabel.setText(turn == 1 ? '黑方下棋' : '白方下棋');
            }
        } else {
            JOptionPane.showMessageDialog(this, '该位置已经有棋子,请重新下棋');
        }
    }
    public void mousePressed(MouseEvent e) {}
    public void mouseReleased(MouseEvent e) {}
    public void mouseEntered(MouseEvent e) {}
    public void mouseExited(MouseEvent e) {}

    // 新游戏
    private void newGame() {
        for (int i = 0; i < 15; i++) {
            for (int j = 0; j < 15; j++) {
                board[i][j] = 0;
                Component component = getComponentAt(i * 25, j * 25);
                if (component instanceof JButton) {
                    JButton button = (JButton) component;
                    button.setBackground(Color.WHITE);
                }
            }
        }
        turn = 1;
        resultLabel.setText('游戏进行中');
    }

    // 保存游戏
    private void saveGame() {
        // TODO: 文件存储当前棋局
    }

    // 加载游戏
    private void loadGame() {
        // TODO: 从文件中读取棋局并恢复当前棋局
    }

    // 判断胜负
    private boolean checkWin(int x, int y) {
        int count = 1; // 连续棋子的个数
        for (int i = x - 1; i >= 0 && board[i][y] == turn; i--) { // 横向
            count++;
        }
        for (int i = x + 1; i < 15 && board[i][y] == turn; i++) {
            count++;
        }
        if (count >= 5) {
            return true;
        }
        count = 1;
        for (int j = y - 1; j >= 0 && board[x][j] == turn; j--) { // 纵向
            count++;
        }
        for (int j = y + 1; j < 15 && board[x][j] == turn; j++) {
            count++;
        }
        if (count >= 5) {
            return true;
        }
        count = 1;
        for (int i = x - 1, j = y - 1; i >= 0 && j >= 0 && board[i][j] == turn; i--, j--) { // 左上到右下
            count++;
        }
        for (int i = x + 1, j = y + 1; i < 15 && j < 15 && board[i][j] == turn; i++, j++) {
            count++;
        }
        if (count >= 5) {
            return true;
        }
        count = 1;
        for (int i = x - 1, j = y + 1; i >= 0 && j < 15 && board[i][j] == turn; i--, j++) { // 左下到右上
            count++;
        }
        for (int i = x + 1, j = y - 1; i < 15 && j >= 0 && board[i][j] == turn; i++, j--) {
            count++;
        }
        if (count >= 5) {
            return true;
        }
        return false;
    }
}

原文地址: https://www.cveoy.top/t/topic/oh43 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录