第二次做業 結對編程(組員:張先鋒 孫吉晨)

1.在文章開頭給出代碼倉庫中項目地址。git

https://gitee.com/sun_ji_chen/mine編程

2.給出PSP表格,分析估計值與真實值的區別。c#

 

估算用時低於實際用時,主要是由於在編碼過程當中,剛開始應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",沒想到簡簡單單的一個字母就可使程序功能有天翻地覆的改變。
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息