第二次作业 结对编程(组员:张先锋 孙吉晨)

1.在文章开头给出代码仓库中项目地址。

https://gitee.com/sun_ji_chen/mine

2.给出PSP表格,分析估计值与真实值的区别。

 

估算用时低于实际用时,主要是因为在编码过程中,刚开始应C,然后用C#,最后再回到C,耗时较多

 3.建立每日软件工程学习日志,格式自定,但要体现学习时段、学习内容、收获体会、自我效率评价等。

学习时段:2019/10/27 上午8:00-10:00
学习内容:老师在博客上布置作业,查看作业并开始构思
收获体会:确定的项目要不同于其他组,最好有新意
自我效率评价:一般
学习时段:2019/10/28 上午8:00-10:00
学习内容:和组员进行沟通,确定好要做的项目,对项目进行分工
收获体会:找组员的时候要学会互补,比如个人编程能力较差的,可以找编程能力强的组员,而后确定好结对编程项目为“扫雷小游戏”
自我效率评价:一般
学习时段:2019/10/29 上午9:00-11:00
学习内容:在网上查找类似的项目的编程代码
收获内容:用C#有利于实现更多的功能,但是对我们来说,C#编程语言不易掌握
自我效率评价:较差
学习时段:2019/10/30 晚上9:00-11:00
学习内容:对扫雷游戏的整体进行设计,采用一个二维数组表示扫雷的棋盘
收获内容:在数组之中数字1代表该位置周围存在一个地雷,以此类推,数字0代表该位置不存在地雷。玩家通过选取数组的元素来进行扫雷的操作。如果选取的元素是数字1则游戏结束,如果经过多次选取之后如果棋盘上显示的剩余地雷(未展开区域)数目等于游戏设置的地雷数目时,判定游戏完成,并存储游戏成绩(所耗费的时间)。
自我效率评价:较高
学习时段:2019/11/01 晚上7:00-11:00
学习内容:具体代码的编写,完成扫雷的基本功能,例如扫雷函数,打印初始化扫雷数组函数,扫雷的棋盘,随即设置雷的位置,设置布雷函数,编写空白区域展开函数,位置四周地雷数目统计函数,避免第一次选取失败函数。
收获内容:编写参考网络上的能够实现基本扫雷功能的代码
自我效率评价:一般
学习时段:2019/11/02 上午8:00-10:00
学习内容:对编写的代码进行完善
收获内容:增加一些自己要实现的新功能,引用头文件time.h,调用clock()函数计时,成功完成游戏时输出所花费的时间。
自我效率评价:一般
学习时段:2019/11/03 上午8:00-10:00
学习内容:开始撰写博客
收获内容:由于掌握的知识不够全面,有些老师提出的撰写博客的要求可能没达到
自我效率评价:一般
4.解题思路描述。即刚开始拿到题目后,如何思考,如何找资料的过程。
在老师布置作业后,我们为了异于其他小组,选了扫雷这个游戏,我们首先是玩了一下电脑上自带的扫雷游戏,在使用者的角度去考虑自己还需要一些什么功能,然后一起商议,上课的时候老师还教我们进行了需求分析,排除一些对我们这个项目没有实际意义的功能,并且我们上网查找了实现基本扫雷功能的代码,然后再经过自己努力,增加代码来实现自己所需要实现的新的功能。
5.设计实现过程。设计包括代码如何组织,比如会有几个类,几个函数,他们之间关系如何,关键函数是否需要画出流程图?单元测试是怎么设计的?分析单元测试的合理性与充分性
1. 打印玩家棋盘函数,通过两层for循环对设定的二维数组中的元素进行选取,并x坐标y坐标进行打印,打印设计者所需棋盘与玩家棋盘类似。
 2. 布雷函数的编写采用while循环,首先设置棋盘之中雷的总数,之后通过rand()函数随机生成一对x,y坐标,并对预设的real_mine数组之中的[x][y]进行赋值,将该元素赋值为1,表示在该位置进行布雷。完成一次while循环执行一次count--直到最后跳出循环为止。
 3. 检测四周位置的地雷总数函数,对周围八个区域也就是二维数组该元素周围的八个元素利用if条件判断进行遍历,一个位置存在地雷就运行自增运算符使得count加1,如果最后运行结果是count=7即为该点周围有七个地雷。
 4. 坐标展开函数,对设计者棋盘数组该点周围的八个元素进行遍历,利用if条件判断对该点周围八个位置进行条件判断,同时调用检查四周位置地雷总数的count函数,将count函数的输出结果赋值到玩家数组的相应元素处。
 5. 避免第一次被炸死函数,根据输入的坐标对应的设计者棋盘数组中的元素,如果为地雷,采取补救措施,将该元素更改为“0”也就是出去该店的地雷,随后在利用随机数生成函数,在一个没有地雷的位置进行布雷,之后跳出函数。如果第一次输入的坐标对应设计者棋盘数组中的元素不是地雷,则继续执行函数。
 6. 判断未知区域地雷个数函数,通过对整个玩家棋盘数组进行遍历,对地雷位置进行计数,如果技术结果等于预先设定地雷个数则判定玩家胜利。
 7. 扫雷函数,首先判断输入的坐标是否符合预设要求,如果符合进行下一步操作,如果输入坐标对应设计者棋盘数组之中元素为0,则为踩到雷,之后将玩家数组的对应元素变为“0”,随后调用坐标展开函数,调用坐标展开函数后判断未知区域的地雷个数,如果等于预设的地雷个数,则判定为玩家胜利
6.记录在改进程序性能上所花费的时间,描述你改进的思路,并展示一张性能分析图(由性能分析工具自动生成),并展示你程序中消耗最大的函数。
改进思路主要是在实现现有扫雷基础上增加一个计时功能,并且能够存储,同时游戏进行时第一次踩雷保证自己不会被炸死
性能分析图如下:
7.代码说明。展示出项目关键代码,并解释思路与注释说明
保证第一次不被炸死,代码如下:
void safe_mine()//避免第一次炸死
{
 int x = 0;
 int y = 0;
 char ch = 0;
 int count = 0;
 int ret = 1;
 printf("输入坐标扫雷\n");
 while (1)
 {
  scanf("%d%d", &x, &y);//只能输入1到10,输入错误重新输入
  if ((x >= 1 && x <= 10) && (y >= 1 && y <= 10))//判断输入坐标是否有误
  {
   if (real_mine[x][y] == '1')//第一次踩到雷后补救
   {
    real_mine[x][y] = '0';
    char ch = count_mine(x, y);
    show_mine[x][y] = ch + '0';//数字对应的ASCII值和数字字符对应的ASCII值相差48,即'0'的ASCII值
    open_mine(x, y);
    while (ret)//在其余有空的地方设置一个雷
    {
     int x = rand() % 10 + 1;//产生1到10的随机数,在数组下标为1到10的范围内布雷
     int y = rand() % 10 + 1;//产生1到10的随机数,在数组下标为1到10的范围内布雷
     if (real_mine[x][y] == '0')//找不是雷的地方布雷
     {
      real_mine[x][y] = '1';
      ret--;
      break;
     }
    }break;//跳出此函数 
   }
   if (real_mine[x][y] == '0')
   {
    char ch = count_mine(x, y);
    show_mine[x][y] = ch + '0';//数字对应的ASCII值和数字字符对应的ASCII值相差48,即'0'的ASCII值
    open_mine(x, y);
    break;
   }
  }
  else//坐标错误
  {
   printf("输入错误重新输入\n");
  }
 }
}
 }
将扫雷成功后所用时间存储进data.txt文件之中。具体代码如下:
int fileopen()
{
 FILE* fp;//文件指针
 /*文件的打开*/
 fp = fopen("data.txt", "a");//fopen打开文件,这个文件可以是当前不存在的。“a”以写入的形式打开,“r”以读的形式打开
 if (fp == NULL) //判断如果文件指针为空
 {
  printf("File cannot open! ");
  exit(0);//在以0的形式退出,必须在文件开头有#include <stdlib.h>,stdlib 头文件即standard library标准库头文件
 }
 //写入东西
 fprintf(fp, "用时:%u 秒\n", clock() / CLOCKS_PER_SEC);//写入指针fp,写入的东西就是刚才的用户输入的d,注意这里的fp和d没有引号
 //关闭文件
 fclose(fp);
 return 0;
}
8.结合在构建之法中学习到的相关内容与个人项目的实践经历,撰写解决项目的心路历程与收获。
在这几天的学习过程之中,采用了许多方案,曾经想要采取c#语言编写扫雷项目,但是重新学习一门语言的成本太高,加上自己本身对编程并不是太擅长,就沿用旧方案采用C语言编程,开始一天根据扫雷的功能构思所需要的函数。接下来四天都在编码的过程之中,学习实现相应功能所需要的知识,所以效率并不是很高。
具体学习的内容是循环与数组相关的知识,在编写随机布雷的函数过程之中也学习了随机数函数的用法。在存储游戏成绩的模块之中我也自学了文件打开与关闭、文件读写相关的C语言知识。
在这段实践的过程中,第一次对编码与软件工程有了比较系统的认识,最珍贵不是学习到的编程知识,而是动手去做的勇气,就在一周以前编一个可以运行的游戏对我来讲难如登天,更别说加上自己设想的功能了。在编码的过程之中,总是会因为一个小小的问题没法解决,就卡在原地好几个小时,比如在编写游戏成绩记录相关函数的时候,文件存储模式选取为"w"模式这就导致每次的成绩写入都会覆盖上一次的成绩,后来在搜索引擎的帮助下,在百度知道上得知需要将“w”更改为"a",没想到简简单单的一个字母就可以使程序功能有天翻地覆的改变。
posted @ 2019-11-05 13:08  mofeng123  阅读(183)  评论(0)    收藏  举报