BUAA2024-播棋

结对项目:博客问题清单

Chapter.1 缠结的字节码(Bytecode Complex)

引入
→ 📖 Q1.1§ 请记录下目前的时间。

3/27 20:08

→ 📖 Q1.2§ 根据之前学习的专业课和各类开发经验,回答:为什么原生应用相较 Web app 更有快的印象?这样的“速度”又是如何达成的?

​ 原生应用相对于 Web 应用给人更快的印象,这主要是因为原生应用可以充分利用设备本身的性能,直接访问设备的硬件资源和功能,而无需经过网络请求。因此,原生应用的速度更快、响应更迅速,用户体验更加流畅。这种速度优势是通过直接访问本地资源、优化界面渲染、支持离线功能以及利用硬件加速等方式实现的,使得用户在使用原生应用时能够感受到更高效的操作和更快速的反馈。

→ 📖 Q1.3§ “要让 Web 生态、或者说一种雄心勃勃的软件运行环境的未来,受益于既有的‘原生’软件开发模式、技术栈和工具链,我们还缺少什么?”——你们的答案是?

​ 要让Web生态受益于原生软件开发模式、技术栈和工具链,我们仍然缺少更深层次的硬件级优化、更强大的离线支持以及更丰富的本地功能访问能力。这包括对Web浏览器和JavaScript引擎的性能进一步的优化,以及对离线功能的更深层次支持,同时提供更多访问本地设备和资源的能力,从而使Web应用能够更接近原生应用的性能和功能。

结对过程
→ 📖 Q1.4(I) 作为本项目的调查:请如实标注在开始项目之前对 Wasm 的熟悉程度分级,可以的话请细化具体的情况。

I. 没有听说过;

II. 仅限于听说过相关名词;

III. 听说过,且有一定了解;

IV. 听说过,且使用 Wasm 实际进行过开发(即便是玩具项目的开发)。

I,完全没有听说过

→ 📖 Q1.5§ 请在完成任务的同时记录,并在完成任务后整理完善:

完成编程任务期间,你和你的搭档依次做了什么,比如:

  1. 查阅了什么资料;
  2. 如何进行了开发;
  3. 遇到了什么问题,又通过什么方式解决。

首先开始准备工具链,考虑到c语言是一门泛用性极高的语言,于是开始寻找c语言到wasm的工具链。在网上找到了emcc的编译工具,于是进行尝试。经过emcc文档提供的编译过程,发现emcc生成的js文件没有办法引入,经过chatgpt、csdn上寻找解决办法未果。于是想到自己编写js胶水代码调用wasm文件,最后成功了。对于数组参数的传入传出,在网上寻找到了手动复制数组内容到c的内存中的方法,最后成功了。

编程语言选择

**以下问题根据你选择的编程语言回答:例如,如果你选择

→ 📖 Q1.6.X.1§ 选择该编程语言的原因是?

​ 对于C语言的熟练度更高

→ 📖 Q1.6.X.2§ 为了完成相关编程任务,进行了哪些操作、使用了怎样的工具链?简要描述相关工具做了什么。

使用emcc编译链,先通过命令emcc t3.c -o t3.js -s EXPORTED_FUNCTIONS="['_mancalaOperator']" -s EXPORTED_RUNTIME_METHODS='["cwrap"]'将c语言编译成wasm文件,并导出需要的函数

总结
→ 📖 Q1.7§ 请记录下目前的时间。

3/27 23:08

→ 📖 Q1.8(I) 请写下本部分的心得体会。

​ 在完成这个结对编程任务的过程中,我学到了一些重要的技能和经验。首先,理解问题的要求非常重要。在开始编写代码之前,我们必须确保对任务的要求有清晰的理解,包括函数的行为、参数的含义以及返回值的规定。其次,合理规划和组织代码结构可以帮助提高代码的可读性和可维护性。在结对编程中,与搭档共同讨论和设计代码结构是非常有益的。

Chapter.2 石子翻滚,晨光降临你身(Rock’n Roll, Morning Light Falls on You)

结对过程
→ 📖 Q2.1§ 请记录下目前的时间。

04/01 19:00

→ 📖 Q2.2§ 请在完成任务的同时记录,并在完成任务后整理完善:
  1. 浏览任务要求,参照 附录A:基于 PSP 2.1 修改的 PSP 表格,估计任务预计耗时;
  2. 完成编程任务期间,依次做了什么(比如查阅了什么资料,随后如何进行了开发,遇到了什么问题,又通过什么方式解决);
Personal Software Process Stages个人软件开发流程预估耗时(分钟)实际耗时(分钟)
PLANNING计划
- Estimate- 估计这个任务需要多少时间55
DEVELOPMENT开发
- Analysis & Design Spec- 需求分析 & 生成设计规格(确定要实现什么)1010
- Technical Background- 了解技术背景(包括学习新技术)2030
- Coding Standard- 代码规范55
- Design- 具体设计(确定怎么实现)55
- Coding- 具体编码3530
- Code Review- 代码复审57
- Test Design- 测试设计(确定怎么测,比如要测试哪些情景、设计哪些种类的测试用例)1015
- Test Implement- 测试实现(设计/生成具体的测试用例、编码实现测试)55
REPORTING报告
- Quality Report- 质量报告(评估设计、实现、测试的有效性)55
- Size Measurement- 计算工作量55
- Postmortem & Process Improvement Plan- 事后总结和过程改进计划(总结过程中的问题和改进点)55
TOTAL合计115127

查询了如何进行数组的传参,最后由chatgpt给出了将数组内容复制到c语言代码的内存中,再将对应的指针当作参数传递给c语言的数组

测试
→ 📖 Q2.3§ 请说明针对该任务,你们设计和实现测试的方法及过程,包括但不限于:出于对需求的哪些考虑设计了哪些测试用例、如何评估所设计测试的有效性 等等。
  1. 正常情况下的游戏结束:输入一个符合规则并且游戏结束的序列,验证返回结果是否正确。
    • 输入:flag = 1, seq = [11, 12, ...], size = n,其中 seq 符合规则且游戏结束。
    • 预期输出:15000 + 先手的净胜棋数。
  2. 游戏未结束:输入一个符合规则但是游戏未结束的序列,验证返回结果是否正确。
    • 输入:flag = 1, seq = [11, 12, ...], size = n,其中 seq 符合规则但游戏未结束。
    • 预期输出:20000 + 先手的计分洞中的棋数。
  3. 非法操作:输入一个非法的序列,验证返回结果是否正确。
    • 输入:flag = 1, seq = [11, 11, ...], size = n,其中 seq 中存在非法操作。
    • 预期输出:30000 + 第一个非法操作所在的步数。
  4. 先手为2的情况:测试先手为2时的情况。
    • 输入:flag = 2, seq = [...], size = n,其中 seq 符合规则且游戏结束。
    • 预期输出:15000 + 先手的净胜棋数。
  5. 部分情况下游戏未结束:测试部分情况下游戏未结束的情况。
    • 输入:flag = 1, seq = [11, 12, 22, ...], size = n,其中 seq 符合规则但游戏未结束。
    • 预期输出:20000 + 先手的计分洞中的棋数。
  6. 序列长度为1:测试序列长度为1的情况。
    • 输入:flag = 1, seq = [11], size = 1
    • 预期输出:30001。
→ 📖 Q2.4(I) 请说明单元测试对软件开发的作用。

​ 单元测试在软件开发中扮演着至关重要的角色。它们不仅可以帮助开发者及早发现代码中的错误和bug,确保代码的质量,还能提高代码的可维护性。通过编写针对每个单元(函数、方法、类等)的测试用例,开发者可以验证代码的正确性和稳定性,减少因为修改代码而引入新错误的可能性。同时,单元测试也促进了团队合作,作为代码的文档,它们可以作为团队间沟通的桥梁,帮助团队成员理解彼此编写的代码和测试用例,从而更好地协作开发和维护软件。

总结
→ 📖 Q2.5§ 请记录下目前的时间,并根据实际情况填写 附录A:基于 PSP 2.1 修改的 PSP 表格 的“实际耗时”栏目。

04/01 20:00

→ 📖 Q2.6(I) 请写下本部分的心得体会。

​ 在本部分的结对编程中我明白了测试是保证代码质量的关键步骤。我们必须编写有效的测试用例,覆盖各种情况,以确保代码的正确性和稳定性。通过结对编程,我不仅学到了如何解决问题,还学到了如何与搭档合作、沟通和协作,这对我今后的软件开发工作都将非常有帮助。

Chapter.3 十二进制的黄昏(Dusk of the Duodecimal System)

结对过程
→ 📖 Q3.1§ 请记录下目前的时间。

04/02 20:00

→ 📖 Q3.2§ 请在完成任务的同时记录,并在完成任务后整理完善:
  1. 浏览任务要求,参照 附录A:基于 PSP 2.1 修改的 PSP 表格,估计任务预计耗时;
  2. 完成编程任务期间,依次做了什么(比如查阅了什么资料,随后如何进行了开发,遇到了什么问题,又通过什么方式解决);
Personal Software Process Stages个人软件开发流程预估耗时(分钟)实际耗时(分钟)
PLANNING计划
- Estimate- 估计这个任务需要多少时间55
DEVELOPMENT开发
- Analysis & Design Spec- 需求分析 & 生成设计规格(确定要实现什么)1010
- Technical Background- 了解技术背景(包括学习新技术)55
- Coding Standard- 代码规范55
- Design- 具体设计(确定怎么实现)1510
- Coding- 具体编码3530
- Code Review- 代码复审57
- Test Design- 测试设计(确定怎么测,比如要测试哪些情景、设计哪些种类的测试用例)1015
- Test Implement- 测试实现(设计/生成具体的测试用例、编码实现测试)55
REPORTING报告
- Quality Report- 质量报告(评估设计、实现、测试的有效性)55
- Size Measurement- 计算工作量55
- Postmortem & Process Improvement Plan- 事后总结和过程改进计划(总结过程中的问题和改进点)55
TOTAL合计110107

简单讨论了一下下棋策略之后便开始书写代码。由于之前的基础,在编码方面基本没有遇到什么难题。在数组外传参数这一方面做出了一些取巧的设计,直接将要传回来的数组内容放在了传参进来的数组里面,然后再通过js胶水代码分拣

代码可复用性与需求变更
→ 📖 Q3.3§ 请说明针对该任务,你们对 🧑‍💻 T2 中已实现的代码进行了哪些复用和修改。

​ 对T2实现的结构体ChessBoard进行复用,用于储存棋盘信息;对operate()函数进行了复用,该函数的作用是进行一次播棋操作;对checkFinished()函数进行复用,判断此时是否有人胜利。

→ 📖 Q3.4(I) 请说明在编码实现时,可以采取哪些设计思想、考虑哪些设计冗余,来提高既存代码适应需求变更的能力。

​ 在编码实现时,可以采取模块化设计思想,将代码分解为多个独立的模块或组件,每个模块专注于解决特定的问题。同时,考虑引入接口抽象和依赖注入等设计冗余,以降低模块之间的耦合度,提高代码的灵活性和可维护性。另外,灵活的配置和参数化设计也是重要的,通过将常量、参数和配置项提取出来,可以在需求变更时更轻松地进行调整和修改。

需求建模和算法设计
→ 📖 Q3.5§ 请说明你们如何建模这一需求。

​ 首先需要将棋盘状态进行抽象化,建立结构体,如下代码所示:

typedef struct CHESSBOARD {
    int hole1[7];
    int hole2[7];
    int player1Score;
    int player2Score;
    int curPlayer;
}ChessBoard;

​ 其中hole1[7]和hole2[7]代表11-16和21-16这12个棋洞,player1Score和
player2Score代表二者目前的得分,curPlayer代表当前进行操作的是哪位棋手。

​ 其次需要一个评估函数来判断当前棋手在当前棋盘状态下,若想获得最大净胜棋数,应当选择哪个棋洞。

→ 📖 Q3.6§ 请说明针对该任务,你们采取了哪些策略来取得更大的净胜棋数,如何编程实现这些策略。

​ 对选手的每一步进行打分,通过优先吃对方棋洞、优先获取额外行动机会、优先清空最右槽、尽量不让对方有机会吃子、尽量将棋子放进洞里等一系列方式进行打分,最后选取分数最高的一个策略来返回。

软件度量
→ 📖 Q3.7§ 请说明你们如何量度所实现的程序模块的有效性,例如:“如何说明我们的程序模块对弈能力很强?”,尝试提出一些可能的定量分析方式。

​ 将程序与不同选手进行对弈,并记录其胜利的次数和失败的次数和子数,从而计算其胜率。强大的对弈能力表现为高胜率以及胜子数量更多。

总结
→ 📖 Q3.8§ 请记录下目前的时间,并根据实际情况填写 附录A:基于 PSP 2.1 修改的 PSP 表格 的“实际耗时”栏目。

04/02 24:00

→ 📖 Q3.9(I) 请写下本部分的心得体会。

​ 在完成这个函数的编写过程中,我学到了如何根据给定的棋盘状态和规则来设计一个有效的决策算法。首先,我需要理解棋盘的布局和规则,以便能够正确地评估每个棋洞中的棋子对游戏结果的影响。其次,我需要考虑如何编写代码来模拟不同的决策情景,并评估每个决策的优劣。最后,我需要确保代码的逻辑正确并且能够高效地执行,以便在实际游戏中能够快速作出最佳决策。通过这个练习,我加深了对游戏规则的理解,并提升了编写决策算法的能力。

结对项目总结

结对过程回顾和反思
→ 📖 Q4.1§ 提供两人在讨论的结对图像资料。

在这里插入图片描述

→ 📖 Q4.2§ 回顾结对的过程,反思有哪些可以提升和改进的地方。

​ 在回顾结对编程的过程中,我认识到我们可以在沟通和协作方面进一步提升。虽然我们在解决问题时能够相互交流和讨论,但有时候沟通不够清晰,导致理解上的偏差或者任务分配上的混乱。因此,我们可以尝试更频繁地进行沟通,明确任务分工和目标,确保团队的工作方向和进展都是清晰的。此外,我们也可以在技术水平上互相学习和支持,共同提高我们的编程技能。

→ 📖 Q4.3(I) 锐评一下你的搭档!并请至少列出三个优点和一个缺点。

​ 优点1:思维缜密,对于代码中各个细节部分处理十分周密。

​ 优点2:具有扎实的编程技能和丰富的经验,能够快速理解和解决复杂的问题。

​ 优点3:善于沟通和协作,能够与我有效地交流和合作,促进任务的顺利进行。

​ 缺点:有时候可能会过于专注于细节,导致在解决问题时花费过多的时间。

对结对编程的理解
→ 📖 Q4.4(I) 说明结对编程的优缺点、你对结对编程的理解。

​ 结对编程的优点在于能够提高代码质量、促进知识分享与学习、减少孤岛效应并提高工作效率;然而,其缺点包括成本增加、不适用于所有情况以及不同步骤的效率差异。总体而言,结对编程是一种有价值的开发方法,适用于需要高质量代码和团队合作的项目。

代码仓库
→ 📖 Q4.5§ 请提供你们完成代码实现的代码仓库链接。

WhiteJonas/BUAA2024-bocchi (github.com)

  • 26
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值