2301_79988164 2024-05-03 13:06 采纳率: 33.3%
浏览 19
已结题

求一个头歌java五子棋游戏题的代码

自己测试10多遍一次都没通过,老是存在问题,但是日期要截止了,现在来求一个代码。

img

img

img

  • 写回答

2条回答 默认 最新

  • 檀越@新空间 2024-05-06 13:22
    关注

    下午好🌅🌅🌅
    本答案参考ChatGPT-3.5

    首先,针对五子棋游戏题目,我们可以考虑以下解决方案:

    1.设计游戏界面与游戏逻辑:通过界面设计和游戏规则实现游戏的展示和运行, 需要注意在界面的设计中要将地图、棋子的显示以及落子等操作考虑进去

    2.编写游戏逻辑代码:编写五子棋游戏的逻辑,包括棋子的移动、胜利判断等, 需要注意边界的判断

    3.实现人机对战:实现人机对战的代码,比如 AI 算法等, 应该要注意难度设置、能否落子等问题

    4.实现联网对战:实现联网对战的代码,包括多种方式,比如聊天、棋盘更新以及棋子落点的同步等。

    以下是一份可用五子棋游戏代码示例:

    import java.awt.*;
    import java.awt.event.*;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
    import java.util.ArrayList;
    import javax.imageio.ImageIO;
    import javax.swing.*;
    
    public class Gobang{
        // 棋盘大小
        private int broadSize = 15;
        // 棋子大小
        private int chessSize = 30;
        // 棋盘起始坐标
        private int broadStart = 50;
        // 棋盘间隔距离
        private int broadGap = 35;
        // 当前选中的点
        private Point point = null;
        // 当前棋子颜色
        private int nowPlayerColor = 1;
        // 游戏是否结束
        private boolean isOver = false;
        // 游戏记录
        private int[][] record = new int[broadSize][broadSize];
        // 记录全部可交互点
        private ArrayList<Point> broadPoint = new ArrayList<>();
    
        public void clear(){
            // 初始化棋盘
            nowPlayerColor = 1;
            isOver = false;
            point = null;
            for(int i = 0; i < broadSize; i++){
                for(int j = 0; j < broadSize; j++){
                    record[i][j] = 0;
                }
            }
        }
    
        private void initBroad(Graphics g){
            // 绘制棋盘
            g.setColor(Color.LIGHT_GRAY);
            // 绘制横向线
            for(int i = 0; i < broadSize; i++){
                g.drawLine(broadStart, broadStart + i * broadGap, broadStart + (broadSize - 1) * broadGap, broadStart + i * broadGap);
            }
            // 绘制竖向线
            for(int j = 0; j < broadSize; j++){
                g.drawLine(broadStart + j * broadGap, broadStart, broadStart + j * broadGap, broadStart + (broadSize - 1) * broadGap);
            }
            // 初始化记录的可交互点
            for(int i = 0; i < broadSize; i++){
                for(int j = 0; j < broadSize; j++){
                    Point p = new Point(i, j);
                    broadPoint.add(p);
                }
            }               
        }
    
        private void drawChess(Graphics g, Point p, int color){
            // 绘制棋子
            int x = broadStart + p.x * broadGap - chessSize / 2;
            int y = broadStart + p.y * broadGap - chessSize / 2;
            if(color == 1){
                g.setColor(Color.BLACK);
            }
            else{
                g.setColor(Color.WHITE);
            }
            g.fillOval(x, y, chessSize, chessSize);
        }
    
        private void playChess(Graphics g){
            // 状态检测
            if(isOver){
                return;
            }       
            // 未选中时,返回
            if(point == null){
                return;
            }           
            // 当前位置上已经有棋子了,返回
            if(record[point.x][point.y] != 0){
                return;
            }
            // 更新棋盘信息
            record[point.x][point.y] = nowPlayerColor;
            drawChess(g, point, nowPlayerColor);               
            // 棋子颜色切换
            if(nowPlayerColor == 1){
                nowPlayerColor = 2;
            }
            else{
                nowPlayerColor = 1;
            }
        }
    
        private boolean isWin(){
            // 判断是否有一方获胜  
            int result = 0;
            // 横向
            for(int i = 0; i <= broadSize - 5; i++){
                for(int j = 0; j < broadSize; j++){
                    result = record[i][j] + record[i + 1][j] + record[i + 2][j] + record[i + 3][j] + record[i + 4][j];
                    if(result == 5 || result == 10){
                        return true;
                    }
                }
            }
            // 竖向
            for(int i = 0; i < broadSize; i++){
                for(int j = 0; j <= broadSize - 5; j++){
                    result = record[i][j] + record[i][j + 1] + record[i][j + 2] + record[i][j + 3] + record[i][j + 4];
                    if(result == 5 || result == 10){
                        return true;
                    }
                }
            }
            // 对角线
            for(int i = 0; i <= broadSize - 5; i++){
                for(int j = 0; j <= broadSize - 5; j++){
                    result = record[i][j] + record[i + 1][j + 1] + record[i + 2][j + 2] + record[i + 3][j + 3] + record[i + 4][j + 4];
                    if(result == 5 || result == 10){
                        return true;
                    }
                }
            }
            for(int i = 0; i <= broadSize - 5; i++){
                for(int j = broadSize - 1; j >= 4 ; j--){
                    result = record[i][j] + record[i + 1][j - 1] + record[i + 2][j - 2] + record[i + 3][j - 3] + record[i + 4][j - 4];
                    if(result == 5 || result == 10){
                        return true;
                    }
                }
            }
            return false;
        }
    
        public void go(){
            JFrame mainFrame = new JFrame("五子棋游戏"); 
            mainFrame.setSize(650, 650);
            mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            JPanel mainPanel = new JPanel();
            mainPanel.setLayout(null);
            mainFrame.add(mainPanel);
            mainFrame.setVisible(true);
    
            BufferedImage image = new BufferedImage(650, 650, BufferedImage.TYPE_INT_BGR);
            Graphics g = image.getGraphics();
            clear();
            initBroad(g);
            isOver = false;
    
            // 绘制logo
            try {
                BufferedImage img = ImageIO.read(new File("logo.jpg"));
                g.drawImage(img, broadStart + broadGap * 5 - img.getWidth() / 2, broadStart + broadGap * 6 - img.getHeight() / 2 , null);
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            JPanel showPanel = new JPanel(){
                public void paint(Graphics g){
                    g.drawImage(image, 0, 0, null);
                }
            };
            showPanel.setBounds(0, 0, 650, 650);
            showPanel.addMouseListener(new MouseAdapter() {          
                public void mouseClicked(MouseEvent e){
                    // 将点击位置转换成棋子的位置
                    int x = e.getX();
                    int y = e.getY();
                    // 判断点击的位置是否在棋盘内
                    if(x >= broadStart - chessSize && x < broadStart + broadGap * (broadSize - 1) + chessSize && y >= broadStart - chessSize && y < broadStart + broadGap * (broadSize - 1) + chessSize){
                        // 选择最近的交点
                        int i = Math.round((float)(x - broadStart) / broadGap);
                        int j = Math.round((float)(y - broadStart) / broadGap);
                        if(i >= 0 && i <= broadSize && j >= 0 && j <= broadSize){
                            for(Point p: broadPoint){
                                if(p.x == i && p.y == j)
                                    point = p;
                            }
                        }
                    }
                    // 执行落子逻辑
                    playChess(g);
                    // 获胜判断
                    if(isWin()){
                        JOptionPane.showMessageDialog(null, "玩家" + nowPlayerColor + "获胜");
                        isOver = true;
                    }
                }
            });
            mainPanel.add(showPanel);
    
            JMenuBar menuBar = new JMenuBar();         
            mainPanel.add(menuBar);
    
            JMenu gameMenu = new JMenu("游戏");
            menuBar.add(gameMenu);
    
            JMenuItem clearItem = new JMenuItem("重新开始");
            clearItem.addActionListener(new ActionListener() {           
                public void actionPerformed(ActionEvent e) {
                    // 需要重新绘制棋盘
                    clear();
                    g.clearRect(0, 0, 650, 650);
                    initBroad(g);
                    isOver = false;
                    showPanel.repaint();
                }
            });
            gameMenu.add(clearItem);
    
            JMenuItem exitItem = new JMenuItem("退出");
            exitItem.addActionListener(new ActionListener() {            
                public void actionPerformed(ActionEvent e) {
                    System.exit(0);
                }
            });
            gameMenu.add(exitItem);
    
            JLabel nowPlayer = new JLabel("当前玩家:黑棋");
            nowPlayer.setBounds(500, 20, 100, 30);
            mainPanel.add(nowPlayer);
    
            mainFrame.setVisible(true);
    
            // 启动时显示状态
            showPanel.repaint();
            nowPlayer.setText("当前玩家:黑棋");
        }
    
        public static void main(String[] args){       
            new Gobang().go();      
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 5月15日
  • 已采纳回答 5月7日
  • 创建了问题 5月3日