面向对象程序设计(Java) 课程设计——三少五子棋 Part1

本文描述了一个团队使用JavaSwing和Graphic2D设计的五子棋游戏,包括人机对战和双人对战功能。团队成员分工明确,分别负责界面搭建、算法编写和事件监听。游戏界面通过按钮和图形绘制实现,采用了五元组算法进行智能决策。此外,还有悔棋、重玩、排行榜等附加功能。
摘要由CSDN通过智能技术生成

背景:设计五子棋游戏背景,

初步猜想:

① 设计一个五子棋小游戏,实现人机对战和双人对战两功能。

② 设计五子棋小游戏,使用Java Swing设计可视化操作界面,并使用GraPhic 2D技术设计图形

③ 使用五元组算法实现人机对战方法

参考博客:五元组评价算法实现简易五子棋【人工智能】_五子棋五元组算法_YouthUpward的博客-CSDN博客

目录

一、团队成员及任务队长:

二、项目简介

三、.功能架构图

​编辑四、运行结果截图

五、项目git地址:

六、个人部分实现过程

一、团队成员及任务
队长:

高晔川 计科(智能)22-1 202203200035
负责模块:  Java Swing界面搭建,Graphic 2D图形绘制,Panel面板搭建,五子棋过程的实现构思
队员:
戚彦良 计科(智能)22-1 202203200029
负责模块:  负责函数算法的编写,使用函数方法体判断哪方获胜,人机对战中如何实现  排行榜功能的实现
吴沅峰 计科(智能)22-1 202203200020
负责模块:鼠标监听器、动作监听器、人机对战自动下棋算法

二、项目简介


功能描述:在Java Swing的界面上


三、.功能架构图


四、运行结果截图

 

 

 


五、项目git地址:

五子棋_final: 此仓库专用于课程设计任务 (gitee.com)


六、个人部分实现过程

〇 我们假设每个数组可以存储对应的五子棋的显色情况,声明存储五子棋存在的二维数组,

① 总体界面如图所示

 总体界面搭建我们使用了继承JPanel类的子类,在构造方法中声明Panel面板的信息

总体工作模块如图所示:

    JLabel selectLabel = new JLabel("游戏选择:");
    JButton doublePerson = new JButton("双人对战");
    JButton singleBlack = new JButton("人机持黑");
    JButton singleWrite = new JButton("人机持白");
    JLabel elseLabel = new JLabel("其他设置:");
    JButton regret = new JButton("悔棋");
    JButton restart = new JButton("Replay");
    JButton forExit = new JButton("GameOver");
    JButton surrender = new JButton("投降");
    JButton leaderBoard = new JButton("排行榜");
    JButton aboutUs = new JButton("About us");

使用Button按钮搭建整体操作平台,并设置事件监听器,方便后续类的开发 

  ActionListener actionListener = new ActionListener() {
        @Override
                ...

在这里呈现了我们的代码块 

public TablePanel() {
        setLayout(null);
        setPreferredSize(new Dimension(TABLE_WIDTH, TABLE_HEIGHT));//设置组件的首选大小
        setBackground(Color.yellow); //设置背景颜色
        init(); //初始化一些属性
        isStart = 0;
        addMouseListener(mouseAdapter); //添加鼠标监听
        addMouseMotionListener(mouseAdapter);
        selectLabel.setFont(font1);
        doublePerson.setBounds(50,600,100,30);
        doublePerson.setFont(font2);
        singleBlack.setBounds(175,600,100,30);
        singleBlack.setFont(font2);
        singleWrite.setBounds(300,600,100,30);
        singleWrite.setFont(font2);
        elseLabel.setFont(font1);
        regret.setBounds(425,600,100,30);
        regret.setFont(font2);
        restart.setBounds(550,600,100,30);
        restart.setFont(font2);
        forExit.setBounds(50,660,100,30);
        forExit.setFont(font2);
        surrender.setBounds(175,660,100,30);
        surrender.setFont(font2);
        leaderBoard.setBounds(300,660,100,30);
        leaderBoard.setFont(font2);
        aboutUs.setBounds(425,660,100,30);
        aboutUs.setFont(font2);
        titleLabel.setFont(font3);

        doublePerson.addActionListener(actionListener);
        singleBlack.addActionListener(actionListener);
        singleWrite.addActionListener(actionListener);
        regret.addActionListener(actionListener);
        restart.addActionListener(actionListener);
        forExit.addActionListener(actionListener);
        surrender.addActionListener(actionListener);
        leaderBoard.addActionListener(actionListener);
        aboutUs.addActionListener(actionListener);

        add(selectLabel);
        add(doublePerson);
        add(singleBlack);
        add(singleWrite);
        add(elseLabel);
        add(regret);
        add(restart);
        add(forExit);
        add(surrender);
        add(leaderBoard);
        add(titleLabel);
        add(aboutUs);
    }

 

通过上述代码我们可以搭建出基本的操作界面,为后续功能实现创造条件

②使用Graphic绘图

在实现过程中,我们首先考虑了使用棋盘图片作为背景,但图片的质量可能会影响到面板的清晰度和整体的观感,甚至出现锐度低效果失真的情况,遂不考虑使用Icon类方法插入图片。最终我们使用了Graphic类方法创建了五子棋网格,代码如图所示

 private void initPaint(Graphics g, Graphics2D gg) {
        super.paint(g);
        g.setColor(Color.BLACK);
        for (int i = 0; i < num; i++) {
            int x = Initial_X + SP * i;
            int y = Initial_Y + SP * (num - 1);
            g.drawLine(x, Initial_Y, x, y);
        }
        for (int i = 0; i < num; i++) {
            int x = Initial_X + SP * (num - 1);
            int y = Initial_Y + SP * i;
            g.drawLine(Initial_X, y, x, y);
        }
        int[][] positions = { {3, 3}, {11, 3}, {3, 11}, {11, 11}, {7, 7} };

        for (int[] pos : positions) {
            int x = Initial_X + SP * pos[0] - RECT_SIZE / 2;
            int y = Initial_Y + SP * pos[1] - RECT_SIZE / 2;
            g.fillOval(x, y, RECT_SIZE, RECT_SIZE);
        }
        bs = new BasicStroke(5);
        gg.setStroke(bs);
        gg.drawRect(Initial_X - 7, Initial_Y - 7, (num - 1) * SP + 14, (num - 1) * SP + 14);
        bs = new BasicStroke(3);
        gg.setStroke(bs);
        for (int i = 1; i < num; i += 4) {
            int x = Initial_X + SP * i;
            int y = Initial_Y + SP * (num - 1);
            gg.drawLine(x, Initial_Y, x, y);
        }
        for (int i = 1; i < num; i += 4) {
            int x = Initial_X + SP * (num - 1);
            int y = Initial_Y + SP * i;
            gg.drawLine(Initial_X, y, x, y);
        }
    }

 我们首先清除之前绘制的内容,使用前两组for循环创建基本的网格,确定棋盘的基本框架。  

position数组存储的是特殊的坐标,用于存储棋盘上key point的位置,第三组循环是用于绘制棋盘上的关键点。之后两组循环是用来加粗边界。

我们创建ovalPaint方法确定了每个棋子的显示状况

 private void ovalPaint(Graphics2D gg) {
        for (int i = 0; i < num; i++) {
            for (int j = 0; j < num; j++) {
                int x = Initial_X + SP * i - cheeseSize / 2;
                int y = Initial_Y + SP * j - cheeseSize / 2;
                if (table[i][j] == 2) {
                    gg.setColor(Color.BLACK);
                    gg.fillOval(x, y, cheeseSize, cheeseSize);
                } else if (table[i][j] == 1) {
                    gg.setColor(Color.WHITE);
                    gg.fillOval(x, y, cheeseSize, cheeseSize);
                } else if (table[i][j] == 3) {
                    gg.setColor(Color.RED);
                    gg.drawOval(x, y, cheeseSize, cheeseSize);
                }
            }
        }
        if (win) {
            select_X = -10;
            select_Y = -10;
        } else {
            bs = new BasicStroke(1);       // 画笔宽度为1
            gg.setStroke(bs);
            //画选择框
            gg.setColor(Color.BLACK);
            gg.drawOval(Initial_X + SP * select_X - cheeseSize / 2,
                    Initial_Y + SP * select_Y - cheeseSize / 2,
                    cheeseSize, cheeseSize);
        }
    }

这样,我们可以确定基本的操作面板。

③彩蛋  About us按钮实现的过程

else if ("About us".equals(text)) {
                    JOptionPane.showMessageDialog(null,"制作人:高晔川  戚彦良  吴沅峰");
                }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值