2023秋软件实践 第二次结对编程作业
这个作业属于哪个课程 | 2023秋-福州大学软件工程 |
---|---|
这个作业要求在哪里 | 2023秋软工实践 第二次结对编程作业 |
个人学号 | 102101112 |
结对成员学号 | 102101327 |
GitHub 仓库地址 | GitHub仓库 |
背景
在并发生成9个九宫格数独,每一个九宫格数独都是串行生成的基础上,进行九个数独求解,必须实现并发求解
一、需求分析(NABCD模型)
1. NEED:
并发生成9个数独谜题,并求解
2.Approach:
设计一个生成数独的网页,用户可自选难度,并给出答案
3.Benefit:
页面简洁直观,便于操作
并发生成数独,减少用户等待时间
可显示标准答案,方便用户参考
4.Competition:
功能基本齐全,增加了背景音乐,以及一个用户提交之后的小彩蛋
5.Delivery:
可向家人,朋友进行宣传
二、原型设计
原型使用Figma进行设计 这是链接
三、代码实现
求解数独
// 开始解数独
solveSudoku(0, 0);
localStorage.setItem('solution' + a, JSON.stringify(board));
while (emptyCellsCount < emptyCells) {
const row = Math.floor(Math.random() * 9);
const col = Math.floor(Math.random() * 9);
if (board[row][col] !== 0) {
board[row][col] = 0;
emptyCellsCount++;
}
}
return board;
}
// 生成数独的函数
function generateSudoku(i)
{
// 检查本地存储中是否存在数独数据
const storedSudoku = localStorage.getItem('sudoku' + i);
if (storedSudoku) {
return JSON.parse(storedSudoku); // 使用存储的数独数据
}
// 生成新的数独
const sudoku = generateNewSudoku(i);
// 存储数独数据到本地存储
localStorage.setItem('sudoku' + i, JSON.stringify(sudoku));
return sudoku;
}
// 将数独输出到页面上
function displaySudoku(sudoku, container) {
var sudokuElement = document.createElement("div");
sudokuElement.className = "sudoku";
// 创建数独格子
for (var i = 0; i < 9; i++) {
for (var j = 0; j < 9; j++) {
var cell = document.createElement("div");
cell.className = "sudoku-cell";
cell.textContent = sudoku[i][j] !== 0 ? sudoku[i][j] : "";
if (sudoku[i][j] !== 0) {
cell.classList.add("filled");
}
sudokuElement.appendChild(cell);
}
}
container.appendChild(sudokuElement);
}
并发实现
function generateAndDisplayNineSudokus() {
var container = document.getElementById("sudoku-container");
// 使用Promise.all来并发生成九个数独
var promises = [];
for (var i = 0; i < 9; i++) {
var promise = new Promise(function(resolve) {
var sudoku = generateSudoku(i);
resolve(sudoku);
});
promises.push(promise);
}
Promise.all(promises).then(function(results) {
// 显示生成的九个数独
for (let i = 0; i < results.length; i++) {
displaySudoku(results[i], container);
}
console.log("九个数独生成并显示完成");
});
}
generateAndDisplayNineSudokus();
四、PSP
任务 | 耗时 |
---|---|
分析 | 2.5h |
设计 | 3h |
新技术学习 | 3h |
代码调试 | 5h |
博客 | 1h |
五、重点功能及思考
1.并发求解
2.清除本地副本以更新数据
3.更新界面UI以区分数独题目与答案
六、总结
这次是结对作业,要求团队合作,这样既能互帮互助,也能学习技能。我们两人在初期也商讨了很多,我也跟我的搭子学了技能。很有收获,学会了多线程或多进程、并发数据结构、调优和性能测试等技术。