数独结对项目ohazyi

数独的空格自由度,指除掉空格本身,空格所在行、列、九宫内的空格数总和。

因此,当只剩一个空格时,此时的自由度为0;当数独全为时,空格数为81,空间自由度为81*24=1944达到最大。

自由度越大代表数独越难,但自由度和空格数不完全程正比。因此那篇博主进行了自由度的阶段区分,并在后文中验证了模型的合理性。

我们关于自由度的定义和他略有不同,主要在于他在算同一行同一列的自由度时,算入了自己。而我们没有。他最终分了10个等级,我们要求的是3个。因此我们最终的难度设定如下:

流程图如下:

具体的Core类的所有函数即功能如下:

例如我测试求解一个数独是不是有唯一解这个函数,我就通过来填入一个有多个解的数独来进行求解其解数,来进行判断。之后我也对有唯一解的数独进行了测试。

TEST_METHOD(TestMethod7){//testsolve_uniqueCores;intppp[M]={6,1,0,3,0,0,0,0,9,0,4,0,7,0,0,0,2,0,0,8,9,1,2,0,0,0,0,0,2,3,0,0,7,0,9,0,4,5,6,0,9,1,2,3,7,0,0,7,0,0,3,0,5,0,0,0,0,0,0,8,0,6,0,5,6,0,0,0,0,0,0,3,9,0,0,6,3,0,0,0,0};intuni=s.solve_unique(ppp);s.out=fopen("unit_out_7.txt","w");fprintf(s.out,"%d\n",uni);Assert::AreEqual((uni>1),true);}测试的原函数代码如下:

intCore::solve_unique(inttmp[M]){hasAnswer=0;//falsememcpy(x,tmp,sizeof(x));memset(a,0,sizeof(a));rep(i,0,80){if(x[i]>0)modifyElement(i,x[i]);}dfs2(1,0);returnhasAnswer;}再例如测试-n-r,并且r1>r2的例子,我是通过在generate里捕获异常把一个布尔变量hasException置为true来判断的:

TEST_METHOD(TestMethod10){//Test-nwith-rCores;s.generate(1,50,40,true,lll);Assert::AreEqual(s.hasException,true);}而我的generate函数的代码如下:

voidCore::generate(intnumber,intlower,intupper,boolunique,intresult[][M]){try{if(number<1||number>10000){throwexception("-nnumbershouldbein[1,10000]");}if(lower<20||upper>55){throwexception("loweranduppershouldbein[20,55]");}if(lower>upper){throwexception("lowercannotbebiggerthanupper");}init_gen(50000,0);generate_single(number,lower,upper-lower+1,0,9999,unique,result);}catch(constexception&e){hasException=true;puts(e.what());}}单元测试覆盖率截图一共测试了20个例子,最终总的覆盖率为94%,主要的函数实现的cpp文件达到了98%,如下图:

我主要采用了在函数里直接catch住异常并打印错误信息到控制台的方法。常见的代码如下:

try{if(situation...){throwexception("...........");}catch(constexception&e){hasException=true;puts(e.what());}}现选取sudoku.cpp中捕获异常的情形和单元测试的例子如下表:

令选取主程序中捕获异常的情形和单元测试的例子如下表:

核心代码如下:

voidsudokuGUI::sudokuButtonClicked(){QPushButton*btn=qobject_cast(sender());inttemp=btn->objectName().toInt();intj=temp%10;inti=temp/10;if(empty[i][j]==0)return;if(btnTarget!=NULL){inttemp=btnTarget->objectName().toInt();intj=temp%10;inti=temp/10;setRowStyleSheet(i,btnNotEmptyStyle,0);setColumnStyleSheet(j,btnNotEmptyStyle,0);setJiugongStyleSheet(i,j,btnNotEmptyStyle,0);setRowStyleSheet(i,btnEmptyStyle,1);setColumnStyleSheet(j,btnEmptyStyle,1);setJiugongStyleSheet(i,j,btnEmptyStyle,1);btnTarget->setStyleSheet(btnEmptyStyle);}btnTarget=btn;setRowStyleSheet(i,btnNumberStyle,0);setColumnStyleSheet(j,btnNumberStyle,0);setJiugongStyleSheet(i,j,btnNumberStyle,0);setRowStyleSheet(i,btnNumberStyle,1);setColumnStyleSheet(j,btnNumberStyle,1);setJiugongStyleSheet(i,j,btnNumberStyle,1);btnTarget->setStyleSheet(btnTargetStyle);}数独矩阵上按钮对点击事件的相应

voidsudokuGUI::update(){for(inti=0;ifinishTime)res[difficultyChosen]=to_string(finishTime);writeRecordFile(res);}else{result.setText("Wrong!");}QMessageBox::about(&gameWindow,"Result",result.text());}检查用户提交答案的正确性

voidsudokuGUI::setBtnZoomAction(QPushButton&btn){QObject::connect(&btn,SIGNAL(pressed()),this,SLOT(setBtnZoomOut()));QObject::connect(&btn,SIGNAL(released()),this,SLOT(setBtnZoomIn()));}voidsudokuGUI::setBtnZoomOut(){QPushButton*btn=qobject_cast(sender());intcx=btn->x()+btn->width()/2;intcy=btn->y()+btn->height()/2;intnw=btn->width()*ZOOM_OUT_RATIO;intnh=btn->height()*ZOOM_OUT_RATIO;btn->setGeometry(cx-nw/2,cy-nh/2,nw,nh);QFontf=btn->font();f.setPixelSize(f.pixelSize()+2);btn->setFont(f);}voidsudokuGUI::setBtnZoomIn(){QPushButton*btn=qobject_cast(sender());intcx=btn->x()+btn->width()/2;intcy=btn->y()+btn->height()/2;intnw=btn->width()/ZOOM_OUT_RATIO;intnh=btn->height()/ZOOM_OUT_RATIO;btn->setGeometry(cx-nw/2,cy-nh/2,nw,nh);QFontf=btn->font();f.setPixelSize(f.pixelSize()-2);btn->setFont(f);}为按钮添加缩放动画

实现对接的代码,调用generate生成数独初局:

voidsudokuGUI::initMatrix(){intres[1][M]={0};core.generate(1,difficultyChosen+1,res);for(inti=0;i

boolok=core.solve(puzzle,solution);if(ok){btnTarget->setText(QString::number(solution[i*matrixLen+j],10));}else{QMessageBox::critical(&gameWindow,"warning","Nosolution!");}第四阶段互测我们是三个小组进行互相测试的,我测试的是15061186安万贺,测试我们的是由15061187窦鑫泽来完成的。

首先我们测试安万贺小组的情况如下,我们先把他们的Core.dll和Core.lib拷贝到了我们的sudokuGUI工程下进行测试,发现他们的生成有这样的问题,就是不管怎么开始,终盘的第一行总是1..9,即如下效果:

然后我就给他们提出了issue,后来通过交流发现他们的随机化放在了GUI里而不是generate里进行随机,因此导致我们用的时候总是1..9。

另外是关于命令行的调用。我发现不管是调用generate(1,1,53,false,a);还是c.generate(1,54,53,false,a);或者c.generate(1,20,500000,false,a);

反馈的错误都是:

Thenumberafter-risnotintherange.

然后我希望能够他们区分这些错误,就提了issue.

一个可能的测试代码如下:

try{Corec;c.generate(1,20,5000,false,a);}catch(NumberOutOfBoundException&e){cout<

如果solve函数的puzzle函数是一个本身就非法的数独,例如一行有两个数是一样的情况,没有捕捉到异常或者返回false,而是也求了一个解。

一个可能的测试代码如下.这个矩阵的第一行有两个9,显然是无解的:

intpuzzle[81]={0,0,0,0,0,5,9,0,9,3,0,5,0,0,9,0,0,6,7,8,0,0,2,0,0,0,0,1,0,0,4,0,7,6,0,0,4,5,0,0,0,1,0,0,7,8,0,0,0,0,3,0,0,0,0,0,1,0,7,0,5,0,4,0,6,4,0,0,2,8,7,3,5,7,8,6,3,4,9,1,2};intsolution[81];Corec;c.solve(puzzle,solution);rep(j,0,80){cout<

612345989345789126789126345123457698456891237897263451231978564964512873578634912然后是别人给我们的测试进行的修正。最初始的改正就是把generate的数组的参数从83改成了81,即宏定义的M值。(之前写成83是害怕溢出)因为发现如果参数不同是无法调用别人的函数的。

根据窦哥给我们组的issue如下,是几个比较中肯与实际的测试问题:

然后第三点,关于sudoku.exe-cabc,其中abc是个不存在的文件,此时我们的是不能识别这个异常的。相当于直接闷声过去了。然后增加的修改如下:

FILE*fp=NULL;fp=fopen(argv[2],"r");if(fp==NULL){throwstd::exception("-sfiledoesn'texist");}用fopen判断是不是NULL就可以增加捕捉了这个异常。

用户的反馈:用户1:按钮有动态效果,界面很好看。用户2:支持键盘输入数字,很方便。用户3:NoSolution的意义不是很明确。用户4:成功求解数独弹出right之后点击ok能返回主界面就好了。用户5:没有音效。用户6:没有暂停功能。用户7:点击黑色按钮最好不要有动画,因为不能填数字。用户8:不太明白record保存的是什么,如果可以让玩家自己输入文件名就好了。用户9:可以提示哪些数字是填错的就好了。用户10:游戏介绍是中文的就好了。

voidsudokuGUI::timerSwitch(){if(timer.isActive())timer.stop();else{timer.start();}}7.有动画也挺好看的啊,而且改起来没想象中的简单,就不改了。9.填一个数字按一下hint就可以直到当前填的这个数字是不是错的了10.中文有的字会变为乱码,还是英文比较保险。

考虑的优化如下:我们可以不是对一个确定的数独终盘进行一直来挖空,而是当一个数独终盘一直挖空不出唯一解时,跳到下一个进行执行。优化的代码如下:

if(times>1000){//执行了这个数独终盘1000次还没有解,就做后一个数独终盘来生成。id++;times=0;}阅读作业看DesignbyContract,CodeContract的内容,描述这些做法的优缺点,说明你是如何把它们融入结对作业中的。首先引用一段契约的概念:

契约作用于两方,每一方都会完成一些任务,从而促成契约的达成,但同时,每一方也会接受一些义务,作为制定契约的前提,有任意一方无视了必尽义的义务,则契约失败

契约式编程,我们在面向对象时曾经常用这个概念。我们当时在在设计程序的时候,需要明确地规定一个类的实例,在调用某个操作前后应当属于何种状态。我们当时需要在所有的类和方法前协商了前置条件,后置条件,不变式等等。

优点:代码规范,有利于实现者、设计者、使用者进行协作。缺点:实现起来有困难,而是契约双方都需要履行责任。在一个大的项目里,一旦有人违反契约,后果不堪设想。

我在第二阶段处理异常时,就遇到了『遇到异常,是由我的Core程序catch住保证不crash还是throw给外面catch』的问题。当时弄的很头疼。最后我和我的partner约定了调用Core的要求,保证他调用时的参数是正确的,而另一方面,作为Core核心的编写者,对于预料范围内的参数错误,进行输出错误信息到控制台反馈给了调用者。

说明结对编程的优点和缺点。结对的每一个人的优点和缺点在哪里(要列出至少三个优点和一个缺点)。(5')

partner优缺点

我的优缺点:

InformationHiding就类似面向对象的封装的概念,把一些不能共享或者需要考虑安全的信息封装到内部,不让其他的使用者来修改这部分的内容。最明显的例子就是类里的private成员变量和函数。

InterfaceDesign接口是在一定粒度视图上同类事物的抽象表示。设计一套共用的interface来供多个对象来使用。对象的交互只需要通过接口来完成。

LooseCoupling上计组时高小鹏老师曾经多次强调的代码设计应该保持的风格就是高内聚低耦合,而低耦合的概念就是模块和模块间的联系要少。这样有利于代码移植和互相测试。

具体地在我们的程序中最明显的一点就是,我们用Core模块来包装核心的实现generate等功能,然后生成动态链接库给其它的地方直接调用就好,这样既保证了别人无法修改你的generate函数实现信息隐藏,又非常便于调用和移植。然后互测也只要交换dll就好了,很是方便。

人生第一次这种体验,我们采用的分工的方式,总体上我负责后端Core接口的编写、测试,他负责前端。界面的设计我也参与了其中,提供了一些美工和游戏的玩法设置上的建议,主要是颜色还有Button的颜色啊图片啊等等。形成了现在这种以黑色和红色为主色调的界面(和我最近穿的一件格子衬衫颜色几乎一样.-.)如果你们觉得设计的很土我背锅

然后感觉最大的收获就在于Git操作吧。虽然我们是双线并发作战,但仍然存在着两人一起改的冲突这样的局面,因此也算积累了一些协作编程写仓库的经验吧。下图是我们的Git信息的部分截图。

THE END
1.在线数独技巧,数独卡点直观隐性数对(DirectHiddenPair),题ID数独游戏规则 在空格内填入1~9的任意一个数,使得盘面内,每一行、每一列、每一个正方形粗线九宫格区域内的数字,均包含1到9,不含有重复的数字。 下面这数独题目卡点可能会需要用到直观隐性数对(Direct Hidden Pair)数独解题技巧或宫区块摒除法(Locked Candidates Type 1 (Pointing))等技巧解答!由于数独题目解法很https://m.12634.com/learning/direct-hidden-pair/x0967
2.数独第10版:开心部落 本版新闻 ·全能王肉鸡 ·数独 ·找不同 讽刺与幽默 2024年11月29日 星期五 01版:要闻 02版:社会走笔 03版:人生百态 04版:外国幽默 05版:漫画生活 06版:漫画生活 07版:四格漫画 08版:漫画生活 09版:校园漫画 10版:开心部落 11版:众生相 12版:水墨天地 13版:http://paper.people.com.cn/fcyym/html/2024-11/29/content_26093053.htm
3.数独挑战:烧脑对决谁与争锋在数字的奇妙世界里,有一种游戏被誉为“思维的体操”,那便是数独。它犹如一场烧脑对决,吸引着无数智慧之士投身其中,展开一场场激烈的角逐,究竟谁能在这数独的舞台上脱颖而出,成为当之无愧的王者? 数独,这个看似简单却蕴含着无尽奥秘的游戏,从它诞生的那一刻起,就注定了要引发一场场智力的风暴。简单的 9×http://m.gongxiaomao.com/xdyxgl/43259515dd.html
4.免费数独手游排行榜前十名2021趣味数独游戏推荐!《数独谜题》以其精妙的关卡设计和难度逐步提升的特点,深受数独爱好者的青睐。游戏内有数百个独特的数独题目,每一关卡的设计都巧妙地结合了传统数独和一些创新元素,使得游戏既具有挑战性,又充满了乐趣。无论是新手还是高手,都能够在这款游戏中找到自己的位置。 http://m.lao-sun.com/texe/55503.html
5.杀手数独#u17705困难数独是一种有趣的日本迷题游戏。数独游戏使用数字,但不需要数学,这也是它为什么如此受欢迎的原因。如果您正在寻找免费的数独游戏,无需辛苦搜索。在www.sudoku.name,您能够找到数千种在线数独迷题游戏,可供您免费体验。您只需了解规则,花一点时间,便能开始享受数独游戏的乐趣。 https://www.sudoku.name/mobile.php?ln=cn&direct_id=u17705&direct_hash_code=394868456436dbe743e4380554c0493a&killer_sudoku=1
6.在线数独在线数独。四个级别的难度。打印数独谜题。免费数独游戏的乐趣。https://sudoku-cn.com/
7.数独2020年11月22日 在线解题 入门 初级 中级 高级 骨灰级 2020年11月21日 在线解题 入门 初级 中级 高级 骨灰级 2020年11月20日 在线解题 入门 初级 中级 高级 骨灰级 2020年11月19日 在线解题 入门 初级 中级 高级 骨灰级 2020年11月18日 在线解题 入门 初级 中级 高级 骨灰级 2020年11月17日 在线解题 http://cn.sudokupuzzle.org/archive.php?y=2020&m=10
8.在线数独游戏数独技巧数独PK,数独录像,每日数独scavy 15'49'' 完成了数独PK:杀手数独(骨灰级) , 查看录像。1分钟前 伟全12'2'' 完成了数独PK:数独(高级) , 查看录像。1分钟前 gaozhangcha 54'56'' 完成了数独PK:数比数独(骨灰级) , 查看录像。1分钟前 njrobin 7'37'' 完成了每日数独:数独(中级) , 查看录像。1分钟前 游客56'23'' 完成了https://www.360doc.cn/article/14111167_368762446.html
9.数独700题可打印★窗口数独 - 骨灰级对角线数独 - 骨灰级17数数独 - 骨灰级VX数独 - 骨灰级5 连续数独 - 骨灰级 1摩天楼数独 - 骨灰级 6 杀手对角数独 - 骨灰级 2 杀手数独 - 骨灰级 5 数比杀手数独 - 骨灰级 2 数比数独 - 骨灰级 1 数比对角杀手数独 - 骨灰级 3 数比对角数独 - 骨灰级 6外提示数独 - https://m.360docs.net/doc/7011408661.html
10.数独题2015骨灰级.pdf免费在线预览全文 日 骨灰级 日 骨灰级 9 3 3 4 6 4 1 1 2 8 6 5 2 8 7 6 7 9 2 6 5 4 3 9 2 1 5 2 6 7 5 4 4 4 8 3 9 2 3 8 5 日 骨灰级 日 骨灰级 4 3 1 2 5 7 2 3 7 1 日 骨灰级 日 骨灰级 5 7 4 5 4 3 6 9 5 3 2 6 9 4 6 9 5 4 1 2https://m.book118.com/html/2023/1105/6152044132010003.shtm
11.917每日一题:Leetcode36.有效的数独每日骨灰级17题1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47https://blog.csdn.net/MATLAB2020ab/article/details/120346645
12.骨灰级相关小说骨灰级黑道言情最新骨灰级17数独骨灰级相关小说,骨灰级黑道言情,最新骨灰级17数独,骨灰级推荐高质量小说,骨灰级难度数独题目,上演骨灰级诱惑,骨灰级书虫推荐小说https://288819.com/html/xs_tag/54/8688.html
13.最受青少年喜爱的1000个创意思维游戏第七章玩转数独在线免费阅读玩转数独 1000 Puzzles for Creative Thinking ★ 菜鸟级 ★数独(1) 解析 ★数独(2) 解析 ★数独(3) 解析 ★数独(4) 解析 ★数独(5) 解析 ★数独(6) 解析 ★数独(7) 解析 ★数独(8) 解析 ★数独(9) 解析 ★数独(10) 解析 ★数独(11) https://fanqienovel.com/reader/7329815847101271091
14.推荐个在线的数独PK网站。我也经常去玩,通常都玩杀手数独。 我也很喜欢这个站的输入方式,因为我用一些标记的,比如?和!,这里都可以输 另外秒杀了比我等级高的人很有成就感 哈哈 赞 回应 azalea (一山放出一山拦) 2010-05-06 07:29:45 另外我觉得那里的难度级别有问题,通常初级和高级都很难,中级和骨灰级倒是一般 = = 赞 回https://www.douban.com/group/topic/8305536/
15.精选数独:骨灰级¥ 32 精选数独:骨灰级 分享配送 至 选择地区查看预计配送信息 快递:免运费 服务收货后结算 参数 ISBN编号; 出版社名称 商品评价 暂无评价文轩九月图书旗舰店 进店逛逛 企业认证 6年有赞店 品牌认证商品说明 更多精选商品 快吧一年级上和大人一起读全4册 本店销量榜第1 ¥68 文城 余华 著 ¥https://h5.youzan.com/v2/showcase/goods?alias=272tohlrg17ty27
16.数独技巧9宫格视频在线观看数独:越玩越聪明的四宫格数独游戏第一百零三题-提高! 发布时间: 2019-05-26 上传者: 豌豆一家 04:17 连续数独技巧分析,数独竞赛常考题型,例题详解简介: 高级骨灰级数独技巧之二链列呀 01:38 数独:越玩越聪明的四宫格数独游戏第九十六题-入门! 发布时间: 2019-05-15 上传者: 豌豆一家 06http://client.so.pps.tv/so/q_%E6%95%B0%E7%8B%AC%E6%8A%80%E5%B7%A79%E5%AE%AB%E6%A0%BC_ctg__t_0_page_4_p_1_qc_0_rd__site__m_1_bitrate_
17.数独17数最高记录70秒,浅谈个人游戏心得和思路数独17数最高记录70秒,浅谈个人游戏心得和思路如下: 一、游戏体验经历: 新手期:2022年夏天开始接触此软件,在此之前就做过一些简单的标准数独。最快记录三十分钟,正常速度在三十五到四十分钟左右。 此时的游戏思路:先根据每行、每列、每九宫格的数字数量排序,优先填补最多的行列或九宫格,直无法继续后换第二多的行https://www.7723.cn/strategy/275161.html
18.数独解题程序出题方法数独112 0 数独爱好者 0 4篇 文章 发表于 十月9, 2017 · 检举文章 数独爱好者写的程序,可以快速解答数独,即使是骨灰级的题目,也只需要猜测3-4次候选数,加上输入已知数也只耗时几分钟,就能解出答案,非常好用。联系QQ:396041260 可发送试用版和教程。无需安装直接运行即可。 数独大师使用说明.doc sdhttp://www.sudokufans.org.cn/forums/index.php?showtopic=3392
19.九宫格数独游戏大全2023数独游戏下载推荐4、《数独九宫》 燃烧吧,各位的大脑。大家会在一个9×9的方格中填入数字,使得每一行、每一列和每个3×3的小方格都包含1到9这九个数字,而且不能重复。游戏开始时,会有一些方格已经给出了数字,要根据这些线索来推理出其他方格的数字。游戏的难度分为四种,分别是四宫格、六宫格、九宫格和骨灰级。四宫格和六https://m.wandoujia.com/strategy/10545720978328746587.html