人工智能课程设计报告数独游戏Word文档下载推荐.docx
- 文档编号:20880891
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:18
- 大小:420.73KB
人工智能课程设计报告数独游戏Word文档下载推荐.docx
《人工智能课程设计报告数独游戏Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《人工智能课程设计报告数独游戏Word文档下载推荐.docx(18页珍藏版)》请在冰豆网上搜索。
点击“开始游戏”可以开始新一盘游戏。
4、算法设计
1、算法思想:
本算法采用“挖洞”思想。
经过以下两步生成数独题:
1)运用拉斯维加斯随机算法生成一个终盘;
2)采用以下3个操作“抹去”一部分数字来生成数独题:
①根据所需要的难度等级选取一种挖洞顺序;
②通过深度优先搜索来求解,从而保证“挖去”一个数字后该数独题仍有唯一解③引入剪枝技术来避免无效的“挖洞”尝试。
伪代码:
start生成一个完整的终盘;
if(true)生成成功;
else进行循环,直到终盘为true,即可解;
then按照难易成都,随机去掉几个数,进行检测;
if(检测成功){输出};
else{重新“挖洞”},直到成功;
2、问题的分析
要能保证算法生成的数独题具有可变化的难度和唯一解,该算法内部应该包含有对数独题的求解和评级功能。
在此将该算法的设计工作分为生成、求解2部分工作(均在类KSudokuCaculate中):
(1)先生成一个终盘,存在一个二维数组中。
(2)根据游戏者需求的难度等级,我们从已知格的总数和分布来确定“挖去”的个数。
3、生成终盘(算法如下)
建立一个新类KSudokuCaculate,在类里面编写下面源代码
boolKSudokuCaculate:
:
MakeSudokuData(SUDOKUMATRIXnGameData)
{
boolbRet=false;
//PROCESS_ERROR(NULL!
=nGameData);
//判断指针是否为空
bRet=true;
//先随机生成中间g_nSmallSize×
方格_nSmallSize方格的个数字
RandomCenter();
//先后产生其他g_nSmallSize×
CacMiddleUpAndDown();
CacMiddleLeftAndRight();
CacCorner();
//将生成的矩阵复制输出到参数中
for(intnRow=0;
nRow<
g_nSize;
nRow++)
{
for(intnCol=0;
nCol<
nCol++)
{
nGameData[nRow][nCol]=nMatrix[nRow][nCol];
}
}
Exit0:
returnbRet;
}
/**
*&
brief用于随机生成中间×
方格的个数字
return若成功生成则返回true,否则返回false
*/
RandomCenter(void)
//nHasAssign[i]标志数字i+1是否已经被分配
intnHasAssign[g_nSize]={0};
intnRow,nCol,nNum;
srand(time(0));
for(nRow=g_nSmallSize;
g_nSmallSize*2;
for(nCol=g_nSmallSize;
{
nNum=rand()%g_nSize;
//随机生成-9中的一个数字
while(0!
=nHasAssign[nNum])//选择一个没有分配的数字
nNum=rand()%g_nSize;
nMatrix[nRow][nCol]=nNum+1;
nHasAssign[nNum]=1;
returntrue;
//根据中间的方格数字经过列变换计算出中间上面和下面×
方格内的数字
//若成功生成则返回true,否则返回false
CacMiddleUpAndDown(void)
intnUp;
//上面方格的x坐标差
intnDown;
//下面方格的x坐标差
intnRow,nCol;
//交换中间第一列
nCol=g_nSmallSize;
nUp=1;
nDown=2;
//复制数字
nMatrix[nRow-g_nSmallSize][nCol+nUp]=nMatrix[nRow][nCol];
nMatrix[nRow+g_nSmallSize][nCol+nDown]=nMatrix[nRow][nCol];
//交换中间第二列
nCol++;
nDown=-1;
//交换中间第三列
nUp=-2;
brief根据中间的方格数字经过列变换计算出中间左边和右边×
CacMiddleLeftAndRight(void)
intnLeft;
//左边方格的y坐标差
intnRight;
//右边方格的y坐标差
//交换中间第一行
nRow=g_nSmallSize;
nLeft=1;
nRight=2;
for(nCol=g_nSmallSize;
nMatrix[nRow+nLeft][nCol-g_nSmallSize]=nMatrix[nRow][nCol];
nMatrix[nRow+nRight][nCol+g_nSmallSize]=nMatrix[nRow][nCol];
//交换中间第二行
nRow++;
nRight=-1;
//交换中间第三行
nLeft=-2;
brief计算出四个角上的×
方格内的个数字
CacCorner(void)
//通过列变换计算左边角上的×
//交换第一列
nCol=0;
nUp=1;
nDown=2;
for(nRow=g_nSmallSize;
//复制数字
nMatrix[nRow-g_nSmallSize][nCol+nUp]=nMatrix[nRow][nCol];
nMatrix[nRow+g_nSmallSize][nCol+nDown]=nMatrix[nRow][nCol];
//交换第二列
nCol++;
nDown=-1;
//交换第三列
nUp=-2;
//通过列变换计算右边角上的×
nCol=g_nSmallSize*2;
4、“挖洞”(源代码如下)
RemoveSomeNumbers(void)
intNumberRemain[9];
for(inti=0;
i<
i++)
NumberRemain[i]=0;
srand(GetTickCount());
intnCountDelete;
//根据游戏级别设置要去除数字的个数
if(EASY==GameLevel)
nCountDelete=g_nEasyLevelNum;
elseif(MIDDLE==GameLevel)
nCountDelete=g_nMiddleLevelNum;
else
nCountDelete=g_nHardLevelNum;
intnSum=0;
//记录已经去掉的数字个数
//随机去除一定数目的数字
while(true)
intnRow=rand()%g_nSize;
intnCol=rand()%g_nSize;
intnNum=nGameData[nRow][nCol];
if(nNum!
=0)
nGameData[nRow][nCol]=0;
NumberRemain[nNum-1]++;
nSum++;
if(nSum>
=nCountDelete)//如果数字删除够了则退出循环
break;
4、
开始
大致流程图:
调用函数,生成终盘
循环成功
得到终盘
不成功
得到难度等级
进行“挖洞”
不成功
检验输出
成功
结束
5、在基于对话框的MFC上设计,显示(结果如图)
1、初始状态:
2、点击“开始游戏”
(1)难度为“简单”时,显示图
点击显示答案时,显示图
(2)难度为“普通”时,显示图
点击“显示答案”,显示图
(3)难度为“困难”时,显示图
(4)玩家自己填时,显示图(以“简单级”为例)
如果我想在“左上角”的九宫格里面的空白填,可以直接点击空白格,会出现如图效果(多了一个编辑框)
在编辑框里面输入要填的数
按“回车键”后,如图
点击“关闭”,结束,关闭游戏。
6、总结
这次课程设计用到了MFC,对话框,以及一些控件,让我加深了对MFC的认识,掌握了一些对话框的背景改变,文字显示,按钮的动态建立等重要知识,提高了我的编程实践能力。
同时,发现了一些结论,比如:
为了生成多难度等级的数独题。
我们建立了数独题难度评定准则,并借用“挖涧”思想设计了数独生成算法。
现将所提出的“挖洞”新机制总结如下:
从左到右、至顶向下的“挖洞”顺序有助于生成高难度等级的数独题;
而全盘随机“挖洞”有利于生成低难度等级的题目。
总之,这次设计让我受益匪浅。
参考文献
[1]Wei—MengLee.ProgrammingSudoku(TechnologyinAction)[M].Apress,2006.
[2]ThornasHCormen.CharlesELeiserson.RoHaIdLRivestandCliffordStein.IntroducTionToAlgorithms(SeceondFAition)[M].Cambridge,USA:
TheMITPress,2002.
[3]TimoMantere,JanneKoljonen.Solving,ratingandgeneratingsudokupuzzlewithGA[c]
[4]EvolutionaryComputation。
2007,25—28,1382-1389.Aamulehti:
Sudokuonline
[5]精通MFC程序技术姚领田编著人民邮电出版社.
[6]人工智能及其应用,第二版.蔡自兴,徐光祐.北京:
清华大学出版社,1996
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 人工智能 课程设计 报告 游戏