2020软件工程作业03

||||
|:--|:--|
|这个作业属于哪个课程|https://edu.cnblogs.com/campus/zswxy/software-engineering-2017-1|
|这个作业要求在哪里|https://edu.cnblogs.com/campus/zswxy/software-engineering-2017-1/homework/10494|
|这个作业的目标|要求个人编写程序。|
|作业正文|本文|
|其他参考文献|www.baidu.com|

项目地址:https://github.com/lianna1111/text3
表格:
||||
|:--|:--|
|PSP2.1 Personal Software Process Stages |预估耗时(分钟) |实际耗时(分钟)|
|Planning 计划 |120 | 120|
|Estimate 估计这个任务需要多少时间 | 3600 |7200|
|Development 开发 |60 | 180|
|Analysis 需求分析 (包括学习新技术) | 60 | 60|
|Design Spec 生成设计文档| 60 | |
|Design Review 设计复审 | 60 | |
|Coding Standard 代码规范 (为目前的开发制定合适的规范)| 60 | |
|Design 具体设计| 120 | |
|Coding 具体编码| 120 | |
|Code Review 代码复审 | 120 | |
|Test 测试(自我测试,修改代码,提交修改)| 80 | |
|Reporting 报告 |180 | |
|Test Repor 测试报告 |30 | |
|Size Measurement 计算工作量 |30 | |
|Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 | 60 | |
|合计 |4620||

需求分析:
数独游戏作为一个休闲小游戏,在当代确实有很多人使用,而试做这个软件对于我们来说也是一种很好的学习方式。

思路描述:
数独游戏的游戏方式是:通过使横排竖排几个数由1~9组成。所以必须要使横排竖排的数能够得到有效的计算,在开始之前必须要做好相应的模拟。
其次,图形的大小和速度也是非常之相关。
如果说我们需要在数独游戏中让游戏变得更加有趣味性,那么图形的大小也非常重要。
所以做这个程序首先需要让他能够有很好的实现,使之成为一个正确的程序,同时也需要能够在各种图形之间变化,增加游戏的难度和趣味性。

具体操作:
1.产生符合数独规则的初始矩阵
第一行是随机生成的1~9的排列,第2到9行就要通过搜索来产生了。对于第2到9行的每一个空格,要从1到9逐个尝试放入,看同一列、同一行、同一个3×3的小方阵中是否出现过相同的数字,若没有就尝试放入,然后递归地搜索下一个位置的数字,若1到9都不行就返回上一个位置尝试下一个数字。直到找到一组解就返回。
2. 获胜条件
还有一点要注意的是检查用户的解正确与否的标准不是比较用户输入得到的矩阵与我们开始产生的初试矩阵是否相同,而是判断用户的矩阵是否满足数独的游戏规则。
这是因为一个初始矩阵被挖掉一些空格后,可能会有不止一种正确解。

通过以上两种判断,我做出了初步的程序设计,做出了以下代码。

include

include

include

using namespace std;

int Initial_State [ 10 ] [ 10 ] ;

bool get_Initial_State( int i , int j ) //搜索第( i , j )位置处可以存储的数字,找到解则返回true,否则返回false
{
if( i > 9 || j > 9 )
return true;

for( int k = 1 ; k <= 9 ; ++k ) 
{
    bool can = true;                // can 变量用于记录数字k能否放在 ( i , j ) 处 
    for( int m = 1 ; m < i ; ++m ) 
        if( Initial_State[m][j] == k )  // 检查同一列是否出现过数字k
        {
            can = false ;
            break ;
        }
    if ( can ) 
        for( int n = 1 ; n < j ; ++n ) 
            if( Initial_State[i][n] == k )  // 检查同一行是否出现过数字k
            {
                can = false ;
                break; 
            }
    if( can ) 
    {
        int up1 = ( i/3 ) * 3 + 3 ; // (i,j)方格所在的3×3小方格i坐标的上限
        int up2 = ( j/3 ) *3 + 3;   // (i,j)方格所在的3×3小方格在j坐标的上限

        if( i % 3 == 0 )    //这是针对特殊情况的处理
            up1 = i ; 
        if( j % 3 == 0 ) 
            up2 = j ;

        for( int p = up1-2 ; p <= up1 ; ++p  )  /* 检查在3×3的小方格中是否出现了同一个数字 */
        {
            if( can == false )   /* 跳出外层循环 */
                break ;
            for( int q = up2-2 ; q <= up2 ; ++q ) 
                if( Initial_State[p][q] == k ) 
                {
                    can = false ;
                    break ;
                }
        }
    }
    if( can ) 
    {
        Initial_State[i][j] = k ; 
        if( j<9 ) 
        {
            if( get_Initial_State( i  , j +1 ) )   /* 到同一行的下一位置开始搜索 */
                return true ;  
        }
        else
        {
            if( i < 9 )  
            {
                if( get_Initial_State( i + 1 , 1 ) )    /* 到下一行的第一个空格开始搜索 */
                    return true ;
            }
            else
                return true ;  /* i >= 9  && j >= 9  , 搜索结束 */

        }
        Initial_State[i][j] = 0 ;   /* 关键这一步:找不到解就要回复原状,否则会对下面的搜索造成影响 */
    }
}
return false ;  /*  1到9都尝试过都不行,则返回递归的上一步 */

}

void start()
{
srand ( unsigned ( time (NULL) ) ); /* 产生random_shuffle的随机数种子 */
for( int i = 1 ; i <= 9 ; ++i )
for( int j = 1 ; j <= 9 ; ++j )
Initial_State[i][j] = 0 ;

for( int i = 1 ; i <= 9 ; ++i ) 
    Initial_State[1][i] = i ; 

random_shuffle( &( Initial_State[1][1]) , &( Initial_State[1][10])  ) ;  /* 第一行随机排列产生 */

get_Initial_State( 2 , 1 ) ;  /* 从第二行开始搜索 */

}

int main()
{
start( ) ;
for( int i = 1 ; i <= 9 ; ++ i )
{
for( int j = 1 ; j <= 9 ; ++j )
cout<< Initial_State [i][j] <<" " ;
cout<<endl;
}
getchar() ;
return 0 ;
}

改进程序性能:
在改进技能方面,我首先确定的程序的正确性找出了自己的几个小错误做出了解决。
其次关于程序的性能优化方面,我暂时还没有找到更好的解决办法。
正在进行当中……

原文地址:https://www.cnblogs.com/wantwoseeyou/p/12594386.html