孙吉晨 张先锋 作业

 

在文章开头给出代码仓库中项目地址。
https://gitee.com/sun_ji_chen/mine
psp表格如下:
 

 

 


3.建立每日软件工程学习日志,格式自定,但要体现学习时段、学习内容、收获体会、自我效率评价等。
学习时段:2019/10/27 上午8:00-10:00
学习内容:老师在博客上布置作业,查看作业并开始构思
收获体会:确定的项目要不同于其他组,最好有新意
自我效率评价:一般
学习时段:2019/10/28 上午8:00-10:00
学习内容:和组员进行沟通,确定好要做的项目,对项目进行分工
收获体会:找组员的时候要学会互补,比如个人编程能力较差的,可以找编程能力强的组员,而后确定好结对编程项目为“扫雷小游戏”
自我效率评价:一版
学习时段:2019/10/29 上午9:00-11:00
学习内容:在网上查找类似的项目的编程代码
 
(1)当开始一个项目时,一定要首先分析项目的重难点,时间节点等内容,将项目分为一个个小项目,并根据PSP表对自己的完成情况进行较为精确的管理
(2)在项目过程中,要和别人多讨论交流,善于借鉴、学习、吸收他人的想法,学会利用已有的一些代码程序,可以达到事半功倍的效果
(3)编写完程序后不代表结束,应该对程序进行合理和充分的检验,还应不断完善代码,去除冗余程序,不断提高程序的运行效率
(4)此次作业虽然是结对编程,但大部分内容是由孙吉晨同学完成,个人编程能力十分有待提升

软件工程学习日志
10.27-10.31完成扫雷的基本功能
10.27 
对扫雷游戏的整体进行设计,采用一个二维数组表示扫雷的棋盘。在数组之中数字1代表该位置周围存在一个地雷,以此类推,数字0代表该位置不存在地雷。玩家通过选取数组的元素来进行扫雷的操作。如果选取的元素是数字1则游戏结束,如果经过多次选取之后如果棋盘上显示的剩余地雷(未展开区域)数目等于游戏设置的地雷数目时,判定游戏完成,并存储游戏成绩(所耗费的时间)。
10.28-10.31 
具体代码的编写,完成扫雷的基本功能,例如扫雷函数,打印初始化扫雷数组函数,扫雷的棋盘,随即设置雷的位置,设置布雷函数,编写空白区域展开函数,位置四周地雷数目统计函数,避免第一次选取失败函数。
 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”也就是出去该店的地雷,随后在利用随机数生成函数,在一个没有地雷的位置进行布雷,之后跳出函数。如果第一次输入的坐标对应设计者棋盘数组中的元素不是地雷,则继续执行函数。具体代码如下
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");
  }
 }
}
 6. 判断未知区域地雷个数函数,通过对整个玩家棋盘数组进行遍历,对地雷位置进行计数,如果技术结果等于预先设定地雷个数则判定玩家胜利。
 7. 扫雷函数,首先判断输入的坐标是否符合预设要求,如果符合进行下一步操作,如果输入坐标对应设计者棋盘数组之中元素为0,则为踩到雷,之后将玩家数组的对应元素变为“0”,随后调用坐标展开函数,调用坐标展开函数后判断未知区域的地雷个数,如果等于预设的地雷个数,则判定为玩家胜利。具体代码如下
int sweep_mine()//扫雷函数,踩到雷返回1,没有踩到雷返回0
{
 int x = 0;
 int y = 0;
 int count = 0;
 printf("输入坐标扫雷\n");
 scanf("%d%d", &x, &y);//只能输入1到10
 if ((x >= 1 && x <= 10) && (y >= 1 && y <= 10))//判断输入坐标是否有误,输入错误重新输入
 {
  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);
   if (count_show_mine() == COUNT)//判断剩余未知区域的个数,个数为雷数时玩家赢
   {
    print_mine();
    printf("玩家赢!\n\n");
    return 0;
   }
  }
  else if (real_mine[x][y] == '1')//踩到雷
  {
   return 1;
  }
 }
 else
 {
  printf("输入错误重新输入\n");
 }
 return 0;//没踩到雷
}

11.1完成扫雷计时功能
引用头文件time.h,调用clock()函数计时,成功完成游戏时输出所花费的时间。
11.2-11.3完成扫雷成绩存储功能
学习文件的打开与关闭、文件的读写相关知识,编写成绩存储函数,将扫雷成功后所用时间存储进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;
}
在这几天的学习过程之中,采用了许多方案,曾经想要采取c#语言编写扫雷项目,但是重新学习一门语言的成本太高,加上自己本身对编程并不是太擅长,就沿用旧方案采用C语言编程,开始一天根据扫雷的功能构思所需要的函数。接下来四天都在编码的过程之中,学习实现相应功能所需要的知识,所以效率并不是很高。
具体学习的内容是循环与数组相关的知识,在编写随机布雷的函数过程之中也学习了随机数函数的用法。在存储游戏成绩的模块之中我也自学了文件打开与关闭、文件读写相关的C语言知识。
在这段实践的过程中,第一次对编码与软件工程有了比较系统的认识,最珍贵不是学习到的编程知识,而是动手去做的勇气,就在一周以前编一个可以运行的游戏对我来讲难如登天,更别说加上自己设想的功能了。在编码的过程之中,总是会因为一个小小的问题没法解决,就卡在原地好几个小时,比如在编写游戏成绩记录相关函数的时候,文件存储模式选取为"w"模式这就导致每次的成绩写入都会覆盖上一次的成绩,后来在搜索引擎的帮助下,在百度知道上得知需要将“w”更改为"a",没想到简简单单的一个字母就可以使程序功能有天翻地覆的改变。
 
 
 

 

posted @ 2019-11-05 10:55  sunjichen  阅读(165)  评论(0编辑  收藏  举报