最新_人工智能课程设计报告(数独游戏).docx
- 文档编号:270052
- 上传时间:2022-10-08
- 格式:DOCX
- 页数:15
- 大小:146.76KB
最新_人工智能课程设计报告(数独游戏).docx
《最新_人工智能课程设计报告(数独游戏).docx》由会员分享,可在线阅读,更多相关《最新_人工智能课程设计报告(数独游戏).docx(15页珍藏版)》请在冰豆网上搜索。
人工智能课程设计报告
数独游戏
一、游戏介绍:
在9×9的格子中,用1到9共9个阿拉伯数字填满整个格子。
要求:
1.每一行都用到1到9,位置不限
2.每一列都用到1到9,位置不限
3.每3×3的格子都用到1到9,位置不限
开始时:
填完后:
二、程序实现的功能
1、玩家可以选择游戏的难易程度
2、玩家可以自己填数字
3、电脑直接显示答案
4、玩家如果不想玩可以开始新游戏
三、使用说明
运行Sudoku.exe程序,初始选择为简单模式,玩家可以自己选择,然后点击“开始游戏”,上面显示玩家用的时间,如果玩家想自己填数字,直接点要填的空格会出现一个编辑框,在里面输入要填的数字,按回车键。
想直接显示结果,点击“显示答案”。
点击“开始游戏”可以开始新一盘游戏。
四、算法设计
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×方格_nSmallSize方格的个数字
CacMiddleUpAndDown();
CacMiddleLeftAndRight();CacCorner();
//将生成的矩阵复制输出到参数中
for(intnRow=0;nRow { for(intnCol=0;nCol { nGameData[nRow][nCol]=nMatrix[nRow][nCol]; } } Exit0: returnbRet; } /** *&brief 用于随机生成中间×方格的个数字 *&return若成功生成则返回true,否则返回false */ boolKSudokuCaculate: : RandomCenter(void) { //nHasAssign[i]标志数字i+1是否已经被分配intnHasAssign[g_nSize]={0}; intnRow,nCol,nNum; srand(time(0)); for(nRow=g_nSmallSize;nRow { nNum=rand()%g_nSize; //随机生成-9中的一个数字 while(0! =nHasAssign[nNum]) //选择一个没有分配的数字 nNum=rand()%g_nSize;nMatrix[nRow][nCol]=nNum+1;nHasAssign[nNum]=1; } returntrue; } //根据中间的方格数字经过列变换计算出中间上面和下面×方格内的数字 //若成功生成则返回true,否则返回false bool KSudokuCaculate: : CacMiddleUpAndDown(void) { intnUp; //上面方格的x坐标差 intnDown; //下面方格的x坐标差 intnRow,nCol; //交换中间第一列 nCol=g_nSmallSize; nUp=1; nDown=2; for(nRow=g_nSmallSize;nRow { //复制数字 nMatrix[nRow-g_nSmallSize][nCol+nUp]=nMatrix[nRow][nCol]; nMatrix[nRow+g_nSmallSize][nCol+nDown]=nMatrix[nRow][nCol]; } //交换中间第二列 nCol++; nUp=1; nDown=-1; for(nRow=g_nSmallSize;nRow { //复制数字 nMatrix[nRow-g_nSmallSize][nCol+nUp]=nMatrix[nRow][nCol]; nMatrix[nRow+g_nSmallSize][nCol+nDown]=nMatrix[nRow][nCol]; } //交换中间第三列 nCol++; nUp=-2; nDown=-1; for(nRow=g_nSmallSize;nRow { //复制数字 nMatrix[nRow-g_nSmallSize][nCol+nUp]=nMatrix[nRow][nCol]; nMatrix[nRow+g_nSmallSize][nCol+nDown]=nMatrix[nRow][nCol]; } returntrue; } /** *&brief 根据中间的方格数字经过列变换计算出中间左边和右边×方格内的数字 *&return若成功生成则返回true,否则返回false */ bool KSudokuCaculate: : CacMiddleLeftAndRight(void) { intnLeft; //左边方格的y坐标差 intnRight; //右边方格的y坐标差 intnRow,nCol; //交换中间第一行 nRow=g_nSmallSize; nLeft=1; nRight=2; for(nCol=g_nSmallSize;nCol { //复制数字 nMatrix[nRow+nLeft][nCol-g_nSmallSize]=nMatrix[nRow][nCol]; nMatrix[nRow+nRight][nCol+g_nSmallSize]=nMatrix[nRow][nCol]; } //交换中间第二行 nRow++; nLeft=1; nRight=-1; for(nCol=g_nSmallSize;nCol { //复制数字 nMatrix[nRow+nLeft][nCol-g_nSmallSize]=nMatrix[nRow][nCol]; nMatrix[nRow+nRight][nCol+g_nSmallSize]=nMatrix[nRow][nCol]; } //交换中间第三行 nRow++; nLeft=-2; nRight=-1; for(nCol=g_nSmallSize;nCol { //复制数字 nMatrix[nRow+nLeft][nCol-g_nSmallSize]=nMatrix[nRow][nCol]; nMatrix[nRow+nRight][nCol+g_nSmallSize]=nMatrix[nRow][nCol]; } returntrue; } /** *&brief 计算出四个角上的×方格内的个数字 *&return若成功生成则返回true,否则返回false */ boolKSudokuCaculate: : CacCorner(void) { intnUp; //上面方格的x坐标差 intnDown; //下面方格的x坐标差 intnRow,nCol; //通过列变换计算左边角上的×方格内的数字 { //交换第一列 nCol=0; nUp=1; nDown=2; for(nRow=g_nSmallSize;nRow { //复制数字 nMatrix[nRow-g_nSmallSize][nCol+nUp]=nMatrix[nRow][nCol]; nMatrix[nRow+g_nSmallSize][nCol+nDown]=nMatrix[nRow][nCol]; } //交换第二列 nCol++; nUp=1; nDown=-1; for(nRow=g_nSmallSize;nRow { //复制数字 nMatrix[nRow-g_nSmallSize][nCol+nUp]=nMatrix[nRow][nCol]; nMatrix[nRow+g_nSmallSize][nCol+nDown]=nMatrix[nRow][nCol]; } //交换第三列 nCol++;nUp=-2; nDown=-1; for(nRow=g_nSmallSize;nRow { //复制数字 nMatrix[nRow-g_nSmallSize][nCol+nUp]=nMatrix[nRow][nCol];nMatrix[nRow+g_nSmallSize][nCol+nDown]=nMatrix[nRow][nCol]; } } //通过列变换计算右边角上的×方格内的数字 { //交换第一列 nCol=g_nSmallSize*2; nUp=1; nDown=2; for(nRow=g_nSmallSize;nRow { //复制数字 nMatrix[nRow-g_nSmallSize][nCol+nUp]=n
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 最新 人工智能 课程设计 报告 游戏