2022软工K班结对编程任务

许锦欣032002234 2022-10-14 20:30:30

2022软工K班结对编程任务

Github链接

Bilibili链接

一、结对探索(4分)

1.1 队伍基本信息(1分)

结对编号:27;队伍名称:丸子馋冰淇淋;

学号姓名作业博客链接具体分工
032002227王长彬https://bbs.csdn.net/topics/608611162前端、后端接口、交互式页面、AI算法、数据计算
032002234许锦欣https://bbs.csdn.net/topics/608610696原型设计、UI素材制作、视频制作、页面布局优化、前端

1.2 描述结对的过程(1分)

很自然就组一队了。经常一起吃饭,一起上课,擅长的技能点也不一样。

1.3 非摆拍的两人在讨论设计或结对编程过程的照片(2分)

在这里插入图片描述

二、原型设计(16分)

2.1 原型工具的选择(2分)

墨刀(yyds/简洁易上手)、ProKnockout 、Procreate、即时设计(figma)、iconpark。

2.2 遇到的困难与解决办法(3分)

困难
1、素材查找:网上的资源很多但也很杂,想要找到心仪的素材需要花费一定的时间。

解决办法:先找到喜欢的游戏页面布局进行模仿,通过ProKnockout 进行抠图和素材编辑,Procreate自行绘画素材,小图标从阿里图标库下载。

2、动态组件的实现:之前没有使用过墨刀,了解了一下基础操作就开始原型设计了,动态组件需要添加不同状态和不同事件,刚开始有点乱不能实现理想效果。

解决办法:熟能生巧,经过不断尝试之后领悟了其中的逻辑,就可以很好的解决页面动画、标签页中的嵌套等。

收获:最直接的收获就是学会了原型设计以及墨刀的使用,这是以前没有的技能(技能点加一);然后发现原型设计除了页面UI外还有相关逻辑功能,可以很好地在实现程序前理清编程思路,提高编程效率。

2.3 原型作品链接(5分) (静态原型作品得2分,交互性强的原型作品得5分)

原型作品链接

小程序体验版二维码(只能在同一个局域网下才可以连上后端接口)

img

2.4 原型界面图片展示 (6分) (尽可能图文并茂地在此处介绍你们队伍设计的各功能模块,创新点也在此处展示说明)

  • 1、欢迎页面和游戏主页(游戏自带bgm,可点击左上角按钮静音)

在这里插入图片描述

  • 2、三种游戏模块

a. 本地对战

在这里插入图片描述


b. 人机对战

在这里插入图片描述


c. 在线对战

在这里插入图片描述

  • 3、排行榜

在这里插入图片描述

  • 4、规则

在这里插入图片描述

  • 5、创新点

    • 规则添加操作提示功能
    • 页面设计结合闽南酒桌文化摇骰子和九宫格选定火锅主题

三、编程实现(14分)

3.1 网络接口的使用(2分)

  • 主要使用Websocket和python的channels模块进行网口的配置,具体如下:

  • 在setting中配置asgi和channel。

    ASGI_APPLICATION = "Double_dice_end.asgi.application"
    CHANNEL_LAYERS = {
        "default": {
            "BACKEND": "channels.layers.InMemoryChannelLayer",
        }
    }
    
  • 在asgi中添加application,用来分别处理http请求和websocket请求(记得添加交换机路径routing)。

    from django.core.asgi import get_asgi_application
    from channels.routing import ProtocolTypeRouter, URLRouter
    from . import routing
    
    application = ProtocolTypeRouter({
        "http": get_asgi_application(),
        "websocket": URLRouter(routing.websocket_urlpatterns)
    })
    
  • routing中添加path(ready是匹配房间等待,123是房间号,consumers和ready分别是对应的websocket处理)。

    from django.urls import re_path
    
    from api import consumers
    from api import ready
    
    websocket_urlpatterns = [
        # xxxxx/room/x1
        re_path(r'room/123/', consumers.ChatConsumer.as_asgi()),
        re_path(r'room/ready/', ready.Waiting.as_asgi()),
    ]
    
  • 最后用 websocket_connect 建立连接,websocket_receive接收客户端消息,然后通过redis返回即可,注意,最好一定用websocket_disconnect断开与客户机的连接,当然客户机也可以用socketonclose来断开连接。

3.2 代码组织与内部实现设计(类图)(2分)

前端:

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

后端:

在这里插入图片描述

3.3 说明算法的关键与关键实现部分流程图(2分)

算法的关键

# 先判断棋子数, 和自己以及对手能下哪
        my_num = 0
        enemy_num = 0
        index = -1
        my_empty = []
        enemy_empty = []
        for j in range(0, 9):
            if int(My_chess[j]) != 0:
                my_num = my_num + 1
            else:
                my_empty.append(j)
            if int(Enemy_chess[j]) != 0:
                enemy_num = enemy_num + 1
            else:
                enemy_empty.append(j)

        # 如果棋子数小于6
        if my_num < 5:
            # 先判断能否消(1不消,2成对消),其余尽量都消
            for j in range(0, 9):
                if int(Dice) == Enemy_chess[j]:
                    if int(Dice) == 1:
                        pass
                    elif int(Dice) == 2:
                        dict = {}
                        for i in range(j % 3, 9, 3):
                            if dict.get(Enemy_chess[i]) is None:
                                dict[Enemy_chess[i]] = 1
                            else:
                                dict[Enemy_chess[i]] += 1

                        if int(dict[Dice]) >= 2:
                            for empty in my_empty:
                                if empty == j % 3 or empty == j % 3 + 3 or empty == j % 3 + 6:
                                    index = empty
                                    break
                            break
                        else:
                            pass
                    else:
                        dict = {}
                        for i in range(j % 3, 9, 3):
                            if dict.get(Enemy_chess[i]) is None:
                                dict[Enemy_chess[i]] = 1
                            else:
                                dict[Enemy_chess[i]] += 1

                        if dict.get(Dice) is not None:
                            for empty in my_empty:
                                if empty == j % 3 or empty == j % 3 + 3 or empty == j % 3 + 6:
                                    index = empty
                                    break
                            break
                        else:
                            pass
            if index != -1:
                return Response({"index": index, "dice": int(Dice)})

            # 如果不能消,则判断是否可以成对(5,6先不成对),尽量不要先成三对,容易被消
            for j in range(0, 9):
                if int(Dice) == My_chess[j]:
                    if int(Dice) == 5 or int(Dice) == 6:
                        pass
                    else:
                        dict = {}
                        for i in range(j % 3, 9, 3):
                            if dict.get(My_chess[i]) is None:
                                dict[My_chess[i]] = 1
                            else:
                                dict[My_chess[i]] += 1

                        if dict.get(Dice) is not None:
                            if int(dict[Dice]) <= 1:
                                for empty in my_empty:
                                    if empty == j % 3 or empty == j % 3 + 3 or empty == j % 3 + 6:
                                        index = empty
                                        break
                                break
                        else:
                            pass
            if index != -1:
                return Response({"index": index, "dice": Dice})

            # 如果是5,6且不能成对,则下自己空位最多的那列,否则5,6下对方空位最少的一列,1,2,3,4下对方较多的那列
            # 自己的空位
            col1_nullnum = 0
            col2_nullnum = 0
            col3_nullnum = 0
            for empty in my_empty:
                if empty == 0 or empty == 3 or empty == 6:
                    col1_nullnum += 1
                if empty == 1 or empty == 4 or empty == 7:
                    col2_nullnum += 1
                if empty == 2 or empty == 5 or empty == 8:
                    col3_nullnum += 1

            # 对方的空位
            enemy_col1_nullnum = 0
            enemy_col2_nullnum = 0
            enemy_col3_nullnum = 0
            for empty in enemy_empty:
                if empty == 0 or empty == 3 or empty == 6:
                    enemy_col1_nullnum += 1
                if empty == 1 or empty == 4 or empty == 7:
                    enemy_col2_nullnum += 1
                if empty == 2 or empty == 5 or empty == 8:
                    enemy_col3_nullnum += 1

            if col1_nullnum > col2_nullnum and col1_nullnum > col3_nullnum:
                for empty in my_empty:
                    if empty == 0 or empty == 3 or empty == 6:
                        index = empty
                        return Response({"index": index, "dice": Dice})
            elif col2_nullnum > col1_nullnum and col2_nullnum > col3_nullnum:
                for empty in my_empty:
                    if empty == 1 or empty == 4 or empty == 7:
                        index = empty
                        return Response({"index": index, "dice": Dice})
            elif col3_nullnum > col2_nullnum and col3_nullnum > col1_nullnum:
                for empty in my_empty:
                    if empty == 2 or empty == 5 or empty == 8:
                        index = empty
                        return Response({"index": index, "dice": Dice})
            elif col1_nullnum == col2_nullnum and col3_nullnum < col1_nullnum:
                if int(Dice) == 5 or int(Dice) == 6:
                    if enemy_col1_nullnum >= enemy_col2_nullnum:
                        for empty in my_empty:
                            if empty == 1 or empty == 4 or empty == 7:
                                index = empty
                                return Response({"index": index, "dice": Dice})
                    else:
                        for empty in my_empty:
                            if empty == 0 or empty == 3 or empty == 6:
                                index = empty
                                return Response({"index": index, "dice": Dice})
                else:
                    if enemy_col1_nullnum >= enemy_col2_nullnum:
                        for empty in my_empty:
                            if empty == 0 or empty == 3 or empty == 6:
                                index = empty
                                return Response({"index": index, "dice": Dice})
                    else:
                        for empty in my_empty:
                            if empty == 1 or empty == 4 or empty == 7:
                                index = empty
                                return Response({"index": index, "dice": Dice})
            elif col1_nullnum == col3_nullnum and col2_nullnum < col1_nullnum:
                if int(Dice) == 5 or int(Dice) == 6:
                    if enemy_col1_nullnum >= enemy_col3_nullnum:
                        for empty in my_empty:
                            if empty == 2 or empty == 5 or empty == 8:
                                index = empty
                                return Response({"index": index, "dice": Dice})
                    else:
                        for empty in my_empty:
                            if empty == 0 or empty == 3 or empty == 6:
                                index = empty
                                return Response({"index": index, "dice": Dice})
                else:
                    if enemy_col1_nullnum >= enemy_col3_nullnum:
                        for empty in my_empty:
                            if empty == 0 or empty == 3 or empty == 6:
                                index = empty
                                return Response({"index": index, "dice": Dice})
                    else:
                        for empty in my_empty:
                            if empty == 2 or empty == 5 or empty == 8:
                                index = empty
                                return Response({"index": index, "dice": Dice})
            elif col2_nullnum == col3_nullnum and col1_nullnum < col2_nullnum:
                if int(Dice) == 5 or int(Dice) == 6:
                    if enemy_col2_nullnum >= enemy_col3_nullnum:
                        for empty in my_empty:
                            if empty == 2 or empty == 5 or empty == 8:
                                index = empty
                                return Response({"index": index, "dice": Dice})
                    else:
                        for empty in my_empty:
                            if empty == 1 or empty == 4 or empty == 7:
                                index = empty
                                return Response({"index": index, "dice": Dice})
                else:
                    if enemy_col2_nullnum >= enemy_col3_nullnum:
                        for empty in my_empty:
                            if empty == 1 or empty == 4 or empty == 7:
                                index = empty
                                return Response({"index": index, "dice": Dice})
                    else:
                        for empty in my_empty:
                            if empty == 2 or empty == 5 or empty == 8:
                                index = empty
                                return Response({"index": index, "dice": Dice})
            # 三行列数都一样,5,6下对方列最小的,1,2,3,4下较多的
            elif col2_nullnum == col1_nullnum == col3_nullnum:
                if int(Dice) == 5 or int(Dice) == 6:
                    if enemy_col1_nullnum >= enemy_col2_nullnum and enemy_col2_nullnum <= enemy_col3_nullnum:
                        for empty in my_empty:
                            if empty == 1 or empty == 4 or empty == 7:
                                index = empty
                                return Response({"index": index, "dice": Dice})
                    elif enemy_col2_nullnum >= enemy_col1_nullnum and enemy_col1_nullnum <= enemy_col3_nullnum:
                        for empty in my_empty:
                            if empty == 0 or empty == 3 or empty == 6:
                                index = empty
                                return Response({"index": index, "dice": Dice})
                    elif enemy_col2_nullnum >= enemy_col3_nullnum and enemy_col3_nullnum <= enemy_col1_nullnum:
                        for empty in my_empty:
                            if empty == 2 or empty == 5 or empty == 8:
                                index = empty
                                return Response({"index": index, "dice": Dice})
                else:
                    if enemy_col1_nullnum >= enemy_col2_nullnum and enemy_col1_nullnum >= enemy_col3_nullnum:
                        for empty in my_empty:
                            if empty == 0 or empty == 3 or empty == 6:
                                index = empty
                                return Response({"index": index, "dice": Dice})
                    elif enemy_col2_nullnum >= enemy_col1_nullnum and enemy_col2_nullnum >= enemy_col3_nullnum:
                        for empty in my_empty:
                            if empty == 1 or empty == 4 or empty == 7:
                                index = empty
                                return Response({"index": index, "dice": Dice})
                    elif enemy_col3_nullnum >= enemy_col2_nullnum and enemy_col3_nullnum >= enemy_col1_nullnum:
                        for empty in my_empty:
                            if empty == 2 or empty == 5 or empty == 8:
                                index = empty
                                return Response({"index": index, "dice": Dice})
            if index != -1:
                return Response({"index": index})

        # 如果棋子数>=6
        # 看看什么时候差最大就下哪
        elif my_num >= 5:
            now_my_point, now_enemy_point = CalculateScore(My_chess, Enemy_chess)
            for empty in my_empty:
                My_chess[empty] = int(Dice)
                new_my_point, new_enemy_point = CalculateScore(My_chess, Enemy_chess)
                if new_my_point - new_enemy_point > now_my_point - now_enemy_point:
                    now_my_point = new_my_point
                    now_enemy_point = new_enemy_point
                    index = empty
                My_chess[empty] = 0

            return Response({"index": index, "dice": Dice})
        elif my_num == 8:
            return Response({"index": my_empty[0], "dice": Dice})

算法流程图

在这里插入图片描述

3.4 贴出重要的/有价值的代码片段并解释(2分)

本来是想用TensorFlow训练一个机器人出来的,但是这种方法属实费时又费力,然后玩了好几把发现,这个游戏并不是那么看重算法,如果说游戏是100%的话,那么技巧只占10%,而经验和运气占90%,所以我用我的经验手写了一下的代码(主要就是前3,4个棋子的时候不要追求差值最大,而是求稳算法):

 if my_num < 5:
            # 先判断能否消(1不消,2成对消),其余尽量都消
            for j in range(0, 9):
                if int(Dice) == Enemy_chess[j]:
                    if int(Dice) == 1:
                        pass
                    elif int(Dice) == 2:
                        dict = {}
                        for i in range(j % 3, 9, 3):
                            if dict.get(Enemy_chess[i]) is None:
                                dict[Enemy_chess[i]] = 1
                            else:
                                dict[Enemy_chess[i]] += 1

                        if int(dict[Dice]) >= 2:
                            for empty in my_empty:
                                if empty == j % 3 or empty == j % 3 + 3 or empty == j % 3 + 6:
                                    index = empty
                                    break
                            break
                        else:
                            pass
                    else:
                        dict = {}
                        for i in range(j % 3, 9, 3):
                            if dict.get(Enemy_chess[i]) is None:
                                dict[Enemy_chess[i]] = 1
                            else:
                                dict[Enemy_chess[i]] += 1

                        if dict.get(Dice) is not None:
                            for empty in my_empty:
                                if empty == j % 3 or empty == j % 3 + 3 or empty == j % 3 + 6:
                                    index = empty
                                    break
                            break
                        else:
                            pass
            if index != -1:
                return Response({"index": index, "dice": int(Dice)})

            # 如果不能消,则判断是否可以成对(5,6先不成对),尽量不要先成三对,容易被消
            for j in range(0, 9):
                if int(Dice) == My_chess[j]:
                    if int(Dice) == 5 or int(Dice) == 6:
                        pass
                    else:
                        dict = {}
                        for i in range(j % 3, 9, 3):
                            if dict.get(My_chess[i]) is None:
                                dict[My_chess[i]] = 1
                            else:
                                dict[My_chess[i]] += 1

                        if dict.get(Dice) is not None:
                            if int(dict[Dice]) <= 1:
                                for empty in my_empty:
                                    if empty == j % 3 or empty == j % 3 + 3 or empty == j % 3 + 6:
                                        index = empty
                                        break
                                break
                        else:
                            pass
            if index != -1:
                return Response({"index": index, "dice": Dice})

3.5 性能分析与改进(2分) (描述你改进的思路,展示性能分析图和程序中消耗最大的函数)

在这里插入图片描述


在这里插入图片描述

由上图可以看出,消耗最大的是 WaitForSingleObject函数,就是主线程等待hHandle对应的线程(因为算法几乎是O(n)所以消耗量并不是很大)。

改进思路:线程等待,暂且没有想到方法改进,但是代码优化还是可以做到的。

3.6 单元测试(2分) (展示出项目部分单元测试代码,并说明测试的函数,构造测试数据的思路)

对于所有的返回数值,前端使用console方法打印,后端则使用tryprint进行测试:

在这里插入图片描述


在这里插入图片描述

构造测试数据的思路:拆分模块,单独查看数据测试,从不同的request进行信息的处理返回,还有特例。

3.7 贴出GitHub的代码签入记录,合理记录commit信息(2分)

在这里插入图片描述

四、总结反思(11分)

4.1 本次任务的PSP表格(2分)

PSP2.1Personal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划77405410
·Estimate·估计这个任务需要多少时间77405410
Development开发75005110
·Analysis·需求分析(包括学习新技术)680200
·Design Spec·生成设计文档500200
·Design Review·设计复审300340
·Coding Standard·代码规范(为目前的开发制定合适的规范)400460
·Design·具体设计10001200
·Coding·具体编码42002360
·Code Review·代码复审12080
·Test·测试(自我测试,修改代码,提交修改)300350
Reporting报告240300
·Test Repor·测试报告6050
·Size Measurement·计算工作量6050
·Postmortem & Process Improment Plan·事后总结,并提出过程改进计划120200
·合计77405410

4.2 学习进度条(每周追加)(2分)

  • 王长彬
第N 周新增代码 (行)累计代码 (行)本周学习耗 时(小时)累计学习耗时 (小时)重要成长
12742742828帮助学习了UI原型设计、figma的使用,以及创建了后端框架,学习了django的使用
280110753058建立服务器redis和代理nginx,撰写了ai接口,分数计算接口,每列的接口,初步完成了本地对战和AI对战(视图view层和配置虚拟交换机)
370317783290撰写在线对战接口,建立数据库和排队机制,单元测试、性能分析和测试数据,最后撰写文档(ORM框架下的SQL,Websocket)
  • 许锦欣
第N 周新增代码 (行)累计代码 (行)本周学习耗 时(小时)累计学习耗时 (小时)重要成长
1002828原型设计能力、寻找素材能力upupup
2229922993058uniapp搭建前端框架,进行相关页面的编写
3168739863290完成剩余页面,进行测试和优化

4.3 最初想象中的产品形态、原型设计作品、软件开发成果三者的差距如何?(2分)

页面样式差不多,但交互动画和用户体验和最初想象的还是有差距的,原型设计页面的看起来比较丝滑,而自己做的有一点点笨笨的哈哈哈哈,但是总的来说实现的还不错,除了时间原因,最核心的还是能力不够硬,继续加油叭!!!

4.4 评价你的队友(2分)

小欣:

值得学习的地方

​ 1、一个特别认真的女孩纸,我们的UI大师,UI界面也许不是班上最好看的,但是是纯手绘的界面(难得啊),全都是小欣同学做的,而且平常经常会挤出时间来赶工完成作业。

​ 2、前端的知识比较牢固(前端的码字调试运行基本都是她做的,页面的布局debug也要花很久的时间,虽然还有一些小瑕疵,但是三周我们已经不错啦~(我觉得))。

​ 3、视频做的也很棒。

需要改进的地方:唯一缺点就是比较马虎哈哈哈哈哈,代码的排版和可读性偏弱,经常偷懒copy自己的代码然后忘了改参数。

小彬:

值得学习的地方

​ 1、他对代码规范很注重,包括命名和注释等,我也跟着改进了很多我的前端代码可读性;

​ 2、待人耐心友好,有团队协作意识。我们分工明确,但如果我的部分遇到问题他也会来一起商量解决,也会经常鼓励写着写着就出bug的我,并经常督促我快点完成任务。

​ 3、学习执行能力比我强,要向优秀的同学看齐,多加提高自己的效率upupup。

需要改进的地方:总体来说挺完美的,合作体验良好。少骂我就更好了

4.5 结对编程作业心得体会(3分)

小欣:

  • 这次作业难度还是有的,我们选择了做微信小程序,而我开发方面主要负责前端,我暑假有简单学习了下uniapp,但没有实践过,感觉这次的作业就是很好地促进我更好地理解和使用uniapp,完成后还是很有成就感的。

  • 对于小程序一个困难就是不同手机尺寸的页面自适应,刚开始使用flex布局,但发现图片没有自适应,搜索后发现有小程序特有的自适应单位rpx;uniapp组件的使用也研究了一会;还有微信本身的api的使用,比如背景音乐的实现;还有一些重启就能解决的奇怪问题😭。

  • 结对编程和个人编程还是很不一样的,可以多一人一起商量研究,做出来的作品感觉会更完善,当然明确地分工很重要,可以互相督促。很开心完成了一个之前没做过的游戏类小程序(虽然打这句话的时候还是有点困),但总体还是满足感比较大✌!

小彬:

  • 作业难度还可以,主要就是每次遇到一个bug就可以百度,然后又新学到了一些知识(比如在单元测试的时候发现wx的request请求里面的处理是异步进行的,这就意味着如果需要返回数据非常有可能是乱序的,就是你后面的代码和前面需要返回的数据的请求是同时进行的,就没有带参数request,然后我试着去改变其同步进行,用了大佬写的promise,但是效果不是很好,所以就在success返回里面执行下一个request,一试,好像是可行的,而且代码的鲁棒性还不错,是稳定的)

  • 终于把结对编程作业ddl做完了✌!虽然还有很多bug和小瑕疵,但是自己玩的时候还是感觉很满足的,有点做项目的感觉了,我之前没想到最后一周单元测试需要花这么多时间的,然后一测,还是出现了很多之前没想到的bug,然后花了挺多的时间去一一解决,最终总算是有了一个稍微能玩的游戏哈哈哈哈,不过还是感觉时间太赶了害,我想着debug完把程序部署到linux服务器上的,因为windows服务器的nginx不大好用,经常失败,所以目前只能在同一片局域网下对战(云服务器要💴,只有限时的呜呜呜😭)。

  • 开发过程中模块还是有出现挺多问题的,比如AI对战时候没有考虑到的情况,在线对战时怎么分房间进入问题。只能一一调试了,用前端和后端分别测试(害~ 所以才说软件测试真的也是很复杂的,因为测试出错前后端都得debug,然后又不知道哪里出错了只能重新理一遍代码的思路)

  • 总的来说还是学到了软件开发时的框架吧,之前只学了对着黑黑的shell执行脚本和服务器搭建,对这种有交互的页面下能看到自己的成果真是太好了!肯定是会对未来的软件开发方面有所帮助的,明白开发的流程,以及每个团队的成员的分工协作,受益良多(还有就是赶工ddl真的是痛并快乐着,感觉学到了,但又感觉还不快点,不然来不及啦!)。

——END——

...全文
272 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
下载代码方式:https://pan.quark.cn/s/dd3561eca308 在软件开发领域,面向对象编程(OOP)是一种普遍采纳的结构化方法,它使得开发者能够借助模拟现实环境中的实体和关系来构建软件系统。在本案例中,我们观察到的是一个关于借助抽象类来执行不同几何图形面积求解的实践应用。现在,让我们详细分析这一议题。 标题 "应用抽象类计算面积" 清晰地表明我们将要讨论一个抽象类,此类设定了一个用于测量图形面积的标准函数,但并未提供实际的执行过程。抽象类在诸如C#或Java等编程语言中通常借助`abstract`修饰符进行声明,它们无法直接创建对象实例,仅能作为其他类的基础模板。 描述部分提及的"图形界面应用"暗示这是一个基于视觉用户界面(GUI)的系统,可能运用了.NET Framework的Windows Forms或WPF技术,或者是Java平台的Swing或JavaFX框架。在这样环境下,用户能够通过视觉元素与这些几何体进行互动,例如输入相关尺寸并观看到计算得出的面积值。 抽象类“几何体”内嵌了“计算面积”这一抽象函数。在代码层面,这可以被表述为: ```csharp public abstract class GeometricShape { public abstract double CalculateArea(); } ``` 随后,有三个派生类:圆(Circle)、矩形(Rectangle)和三角形(Triangle),它们各自提供了这个抽象函数的具体实现。比如,圆的面积是通过π乘以半径的平方得到的,矩形的面积是长和宽的乘积,而三角形的面积可能是底乘以高再除以2的结果。这些类将提供具体实现来计算它们各自的面积: ```csharp p...
内容概要:本文系统研究了移相控制全桥LLC谐振变换器的工作特性,深入分析其在不同工作模式下的运行机理与性能表现,重点探讨了软开关实现、高效率能量转换及宽范围电压调节等关键技术优势。通过Simulink搭建精确的仿真模型,对谐振腔参数、开关频率、电压增益、系统效率等关键指标进行仿真分析,验证了理论设计的正确性。同时,详细研究了移相控制策略对系统动态响应、稳定性和轻载/重载工况适应性的影响,揭示了控制参数与电路参数之间的耦合关系,为高频高效电源设计提供了理论依据和实践指导。; 适合人群:具备电力电子技术、模拟电路及自动控制理论基础,从事开关电源、新能源变换器、电动汽车充电模块或高频电源系统研发的工程师及高校研究生。; 使用场景及目标:①掌握全桥LLC谐振变换器的拓扑结构、工作原理与关键参数设计方法;②理解移相控制在实现零电压开通(ZVS)和零电流关断(ZCS)中的作用机制;③通过Simulink仿真掌握变换器建模、参数优化与性能评估流程,服务于实际产品开发与学术课题研究。; 阅读建议:建议读者结合提供的Simulink仿真模型进行同步操作,重点关注谐振网络(Lr, Lm, Cr)参数与移相角之间的匹配设计,深入理解软开关条件的形成过程,并通过调整负载和输入电压进行多工况仿真,以全面掌握系统动态特性。

137

社区成员

发帖
与我相关
我的任务
社区描述
2022福州大学软件工程K班
软件工程 高校 福建省·福州市
社区管理员
  • kevinkex
  • Forest_Onee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧