<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      xingd.net

      .net related techonology

      導(dǎo)航

      Minesweeper: 代碼結(jié)構(gòu)改進(jìn)

      Posted on 2008-03-19 22:09  xingd  閱讀(3212)  評論(0)    收藏  舉報
      接著前一篇文章,Minesweeper: GDI+ 初步實現(xiàn),本文在代碼結(jié)構(gòu)上做一些改進(jìn),不涉及新的功能。

      首先我們來看MineBoard類的Init方法:

      public void Init(int rows, int columns, int mines)
      {
          
      if (rows <= 0 || columns <= 0 || mines >= columns * rows)
          {
              
      throw new ArgumentException();
          }

          cells 
      = new MineCell[rows, columns];
          totalMines 
      = mines;
          makedMines 
      = 0;
          status 
      = GameStatus.NotStarted;

          PlaceRandomMines();
          UpdateNearbyMinesCount();
      }


      實際的游戲開發(fā)中,隨機(jī)布局整個游戲區(qū)域的情況并不多,更為常見的還是從地圖中讀取。同時,為了實現(xiàn)游戲過程中保存當(dāng)前的游戲進(jìn)展,然后讀取后繼續(xù),或者支持從網(wǎng)絡(luò)上下載布局,以及同其他人分享等,需要將布局的功能移到MineBoard在之外。

      調(diào)整后的代碼如下:

      public interface IMineBoardBuilder
      {
          
      int TotalMines { get; }
          
      int MarkedMines { get; }

          MineCell[,] BuildMineCells();
      }

      public class RandomBoardBuilder : IMineBoardBuilder
      {
          
      private int rows;
          
      private int columns;
          
      private int totalMines;

          
      public RandomBoardBuilder(int rows, int columns, int mines)
          {
              
      if (rows <= 0 || columns <= 0 || mines >= columns * rows)
              {
                  
      throw new ArgumentException();
              }
              
              
      this.rows = rows;
              
      this.columns = columns;
              
      this.totalMines = mines;
          }

          
      public int TotalMines { get { return totalMines; } }
          
      public int MarkedMines { get { return 0; } }
          
          
      public MineCell[,] BuildMineCells()
          {
              MineCell[,] cells 
      = new MineCell[rows, columns];

              PlaceRandomMines(cells);
              UpdateNearbyMinesCount(cells);

              
      return cells;
          }
      }

      PlaceRandomMines和UpdateNearbyMinesCount實現(xiàn)跟上一篇文章中一樣,就不給出了。

      MineBoard的Init方法則重構(gòu)為:

      public void Init(IMineBoardBuilder builder)
      {
          cells 
      = builder.BuildMineCells();
          totalMines 
      = builder.TotalMines;
          makedMines 
      = builder.MarkedMines;
          status 
      = GameStatus.NotStarted;
      }

      下面的這個類可以很容易的實現(xiàn)二進(jìn)制地圖文件的讀取。文本/XML格式的地圖讀取,也可以很容易的實現(xiàn)。
      [Serializable]
      public class BoardFileLoader : IMineBoardBuilder
      {
          
      private MineCell[,] cells;
          
      private int totalMines;
          
      private int markedMines;

          
      public int TotalMines { get { return totalMines; } }
          
      public int MarkedMines { get { return markedMines; } }

          
      public MineCell[,] BuildMineCells()
          {
              
      return cells;
          }
      }

      相應(yīng)的,可以為MineBoard類添加保存游戲進(jìn)展的功能。

      在交互方面,也可作如下改進(jìn):

      public void WalkNearByCells(int row, int col, MineWalkCallback callback, Predicate<MineCell> match)
      {
          
      if (IsValidCell(row, col))
          {
              callback(
      ref cells[row, col]);

              
      if (match(cells[row, col]))
              {
                  
      for (int i = -1; i < 2; i++)
                  {
                      
      for (int j = -1; j < 2; j++)
                      {
                          
      if (i != 0 || j != 0)
                          {
                              WalkNearByCells(row 
      + i, j + i, callback, match);
                          }
                      }
                  }
              }
          }
      }

      public void DoAction(IMineBoardAction action)
      {
          action.Run(
      this);
      }

      這兩個新增的方法可以將連續(xù)揭開一片區(qū)域、計算相鄰雷數(shù)等操作實現(xiàn)移到MineBoard類外實現(xiàn),這樣就可以進(jìn)一步引入腳本引擎,將一些邏輯實現(xiàn)在腳本中。

      項目文件下載:20080319.zip
      系列索引:Minesweeper: 索引

      主站蜘蛛池模板: 日本福利一区二区精品| 西西午夜无码大胆啪啪国模| 蜜臀av日韩精品一区二区| 中国老太婆video| 久久久久人妻精品一区三寸| 亚洲精品无码高潮喷水A| 日韩高清不卡一区二区三区| 久热这里只有精品12| 四虎成人精品无码| 国产综合视频精品一区二区| 亚洲色最新高清AV网站| 国内精品久久人妻无码妲| 国产精品第一区亚洲精品| 性无码一区二区三区在线观看| 国产精品无码专区| 亚洲成人资源在线观看| 日韩人妻无码一区二区三区久久| 国产在线一区二区在线视频| 日本午夜精品一区二区三区电影| 日本强好片久久久久久aaa| 亚洲无av中文字幕在线| 日本道精品一区二区三区| 精品一区二区三区自拍图片区| 日韩加勒比一本无码精品| 色狠狠色噜噜AV一区| 通榆县| 免费黄色大全一区二区三区| 日韩欧美亚洲综合久久| 亚洲男女羞羞无遮挡久久丫| 99久久亚洲综合精品成人网| 精品国产福利一区二区在线| 精品无码国产日韩制服丝袜| 亚洲成av人片天堂网无码| 波多野无码中文字幕av专区| 天堂V亚洲国产V第一次| 视频一区二区三区高清在线| 国产精品久久久久久福利69堂| 国产一精品一av一免费爽爽| 亚洲色欲色欱WWW在线| 循化| 永久免费在线观看蜜桃视频 |