最新_人工智能课程设计报告(数独游戏).docx

上传人:b****1 文档编号:270052 上传时间:2022-10-08 格式:DOCX 页数:15 大小:146.76KB
下载 相关 举报
最新_人工智能课程设计报告(数独游戏).docx_第1页
第1页 / 共15页
最新_人工智能课程设计报告(数独游戏).docx_第2页
第2页 / 共15页
最新_人工智能课程设计报告(数独游戏).docx_第3页
第3页 / 共15页
最新_人工智能课程设计报告(数独游戏).docx_第4页
第4页 / 共15页
最新_人工智能课程设计报告(数独游戏).docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

最新_人工智能课程设计报告(数独游戏).docx

《最新_人工智能课程设计报告(数独游戏).docx》由会员分享,可在线阅读,更多相关《最新_人工智能课程设计报告(数独游戏).docx(15页珍藏版)》请在冰豆网上搜索。

最新_人工智能课程设计报告(数独游戏).docx

人工智能课程设计报告

数独游戏

一、游戏介绍:

在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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 法学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1