亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? env.cs

?? 手機軟件開發..手機軟件開發..手機軟件開發..手機軟件開發..
?? CS
?? 第 1 頁 / 共 2 頁
字號:
    /// 保存設計數據
    /// </summary>
    public void SaveDesign()
    {
      if (HasError) return;
      try
      {
        db.SaveDesign(active == Action.Create, Level);
      }
      catch (Exception ex)
      {
        SetExceptionMessage(ex);
      }
    }

    /// <summary>
    /// 刪除最后一關
    /// </summary>
    public void DeleteLastLevel()
    {
      if (HasError) return;
      try
      {
        db.DeleteLastLevel(Level);
      }
      catch (Exception ex)
      {
        SetExceptionMessage(ex);
      }
    }

    /// <summary>
    /// 更新主窗體客戶區
    /// </summary>
    /// <param name="dc">畫布</param>
    /// <param name="rectangle">要在其中繪畫的矩形</param>
    public void Draw(Graphics dc, Rectangle rectangle)
    {
      if (HasError) return;
      Rectangle box = PixelToBox(rectangle);
      Rectangle box2 = new Rectangle(box.Left, box.Top, box.Width + 1, box.Height + 1);
      for (int i = 1; i <= LevelSize.Height; i++)
      {
        for (int j = 1; j <= LevelSize.Width; j++)
        {
          if (!box2.Contains(j, i)) continue;
          DrawBox(dc, j, i);
        }
      }
    }

    /// <summary>
    /// 繪制一個單元格
    /// </summary>
    /// <param name="dc">畫布</param>
    /// <param name="x">單元格的橫坐標</param>
    /// <param name="y">單元格的縱坐標</param>
    void DrawBox(Graphics dc, int x, int y)
    {
      DrawBox(dc, db.Map[y, x], (x - 1) * boxSize.Width, (y - 1) * boxSize.Height);
    }

    /// <summary>
    /// 繪制一個單元格
    /// </summary>
    /// <param name="dc">畫布</param>
    /// <param name="idx">單元格的類型: 地 槽 墻 磚 箱子 工人</param>
    /// <param name="x">單元格的橫坐標</param>
    /// <param name="y">單元格的縱坐標</param>
    void DrawBox(Graphics dc, int idx, int x, int y)
    {
      dc.DrawImage(img, x, y, new Rectangle(idx * boxSize.Width, 0, boxSize.Width, boxSize.Height), GraphicsUnit.Pixel);
    }

    /// <summary>
    /// 將單元格換算為像素
    /// </summary>
    /// <param name="box">單元格矩形</param>
    /// <returns>像素矩形</returns>
    Rectangle BoxToPixel(Rectangle box)
    {
      return new Rectangle((box.Left - 1) * boxSize.Width, (box.Top - 1) * boxSize.Height,
        (box.Width + 1) * boxSize.Width, (box.Height + 1) * boxSize.Height);
    }

    /// <summary>
    /// 將像素換算為單元格
    /// </summary>
    /// <param name="pixel">像素矩形</param>
    /// <returns>單元格矩形</returns>
    Rectangle PixelToBox(Rectangle pixel)
    {
      int x0 = pixel.Left / boxSize.Width + 1;
      int y0 = pixel.Top / boxSize.Height + 1;
      int x1 = (pixel.Right - 1) / boxSize.Width + 1;
      int y1 = (pixel.Bottom - 1) / boxSize.Height + 1;
      return new Rectangle(x0, y0, x1 - x0, y1 - y0);
    }

    /// <summary>
    /// 根據指定的對角頂點創建矩形
    /// </summary>
    /// <param name="a">頂點</param>
    /// <param name="b">對角的頂點</param>
    /// <returns>所需要的矩形</returns>
    Rectangle GetRectangle(Point a, Point b)
    {
      return Rectangle.FromLTRB(Math.Min(a.X, b.X), Math.Min(a.Y, b.Y), Math.Max(a.X, b.X), Math.Max(a.Y, b.Y));
    }

    /// <summary>
    /// 設計模式下,當鼠標點擊時要采取的動作
    /// </summary>
    /// <param name="invalid">輸出:要重繪的區域</param>
    /// <returns>是否發生動作</returns>
    public bool Design(out Rectangle invalid)
    {
      invalid = Rectangle.Empty;
      Point to;
      if (!ValidClick(out to)) return false;
      db.UpdateCounts(to.X, to.Y, false);
      Block.Update(ref db.Map[to.Y, to.X], pen);
      db.UpdateCounts(to.X, to.Y, true);
      if (pen == Block.Man0 && HasWorker) pen = Block.Box0;
      invalid = BoxToPixel(GetRectangle(to, to));
      return true;
    }

    /// <summary>
    /// 工人往指定方向前進一步(可能推著箱子)
    /// </summary>
    /// <param name="dir">前進的方向</param>
    /// <param name="isStop">“撤銷”時是否停留</param>
    /// <param name="invalid">輸出:要重繪的區域</param>
    /// <returns>是否成功</returns>
    public bool StepIt(Direction dir, bool isStop, out Rectangle invalid)
    {
      invalid = Rectangle.Empty;
      if (HasError) return false;
      if (Direction.None == dir) return false;
      Point p1 = worker; // 工人前進方向一步的位置
      Point p2 = worker; // 箱子前進方向一步的位置
      switch (dir)
      {
        case Direction.East: p1.X++; p2.X += 2; break;
        case Direction.South: p1.Y++; p2.Y += 2; break;
        case Direction.West: p1.X--; p2.X -= 2; break;
        case Direction.North: p1.Y--; p2.Y -= 2; break;
      }
      byte b1 = db.Map[p1.Y, p1.X]; // 工人前進方向一步位置上的東西
      bool isBox = Block.IsBox(b1); // 是否推著箱子前進
      if (!isBox && !Block.IsBlank(b1)) return false; // 如果沒有推著箱子且前方不是空地則失敗
      if (isBox && !Block.IsBlank(db.Map[p2.Y, p2.X])) return false; // 如果推著箱子且箱子前方不是空地則失敗
      invalid = BoxToPixel(GetRectangle(worker, isBox ? p2 : p1)); // 要重繪的區域
      stack.Push(new Step(dir, isBox, isStop)); // 記錄走法步驟
      Block.ManOut(ref db.Map[worker.Y, worker.X]); // 工人離開當前位置
      Block.ManIn(ref db.Map[p1.Y, p1.X]); // 工人進入前方位置
      if (isBox)
      {
        pushSteps++; // 更新推箱子步數
        db.Boths += (db.Map[p2.Y, p2.X] - Block.Land) - (b1 - Block.Box0); // 更新已完成任務數
        Block.BoxOut(ref db.Map[p1.Y, p1.X]); // 箱子離開當前位置
        Block.BoxIn(ref db.Map[p2.Y, p2.X]); // 箱子進入前方位置
      }
      worker = p1; // 更新工人位置
      return true; // 工人成功前進一步(可能推著條子)
    }

    /// <summary>
    /// 工人后退一步(可能連帶箱子一起后退)
    /// </summary>
    /// <param name="invalid">輸出:要重繪的區域</param>
    /// <returns>是否完成“撤消”</returns>
    public bool Back(out Rectangle invalid)
    {
      invalid = Rectangle.Empty;
      if (HasError) return true;
      if (stack.Count == 0) return true;
      Step step = stack.Pop(); // 當前步驟
      Point p1 = worker; // 工人后退方向一步的位置
      Point p2 = worker; // 箱子的當前位置
      switch (step.Direct)
      {
        case Direction.East: p1.X--; p2.X++; break;
        case Direction.South: p1.Y--; p2.Y++; break;
        case Direction.West: p1.X++; p2.X--; break;
        case Direction.North: p1.Y++; p2.Y--; break;
      }
      invalid = BoxToPixel(GetRectangle(p1, step.IsBox ? p2 : worker)); // 要重繪的區域
      Block.ManOut(ref db.Map[worker.Y, worker.X]); // 工人離開當前位置
      Block.ManIn(ref db.Map[p1.Y, p1.X]); // 工人進入后退方向一步的位置
      if (step.IsBox)
      {
        Block.BoxOut(ref db.Map[p2.Y, p2.X]); // 箱子離開當前位置
        Block.BoxIn(ref db.Map[worker.Y, worker.X]); // 箱子進入工人原來的位置
        db.Boths += (db.Map[worker.Y, worker.X] - Block.Box0) - (db.Map[p2.Y, p2.X] - Block.Land); // 更新已完成任務數
        pushSteps--; // 更新推箱子步數
      }
      worker = p1; // 更新工人位置
      return step.IsStop; // 是否完成“撤消”
    }

    /// <summary>
    /// 尋找一條將工人移動到鼠標點擊的位置的路線
    /// </summary>
    /// <returns>移動的路線</returns>
    public Queue<Direction> GetMoveInfo()
    {
      Point to;
      if (!CanTo(out to)) return null;
      return FindPath.Seek(db.Map, worker, to);
    }

    /// <summary>
    /// 給出將箱子推動到鼠標點擊的位置所需的信息
    /// </summary>
    /// <param name="dir">輸出:工人移動的方向</param>
    /// <returns>工人移動的步數</returns>
    public int GetPushInfo(out Direction dir)
    {
      dir = Direction.None;
      if (HasError) return 0;
      Point to; // 目的地
      if (!CanTo(out to)) return 0; // 無效的目的地
      if (to.Y != worker.Y && to.X != worker.X) return 0; // 目的地和工人不在同一條直線上
      int z0 = (to.Y == worker.Y) ? worker.X : worker.Y;
      int z9 = (to.Y == worker.Y) ? to.X : to.Y;
      if (to.Y == worker.Y) dir = (z9 > z0) ? Direction.East : Direction.West;
      else dir = (z9 > z0) ? Direction.South : Direction.North;
      int i0 = Math.Min(z9, z0);
      int i9 = Math.Max(z9, z0);
      int steps = i9 - i0; // 目的地和工人之間的距離
      int boxs = 0;
      for (int i = i0 + 1; i < i9; i++)
      {
        byte bi = (to.Y == worker.Y) ? db.Map[worker.Y, i] : db.Map[i, worker.X];
        if (Block.IsBox(bi)) boxs++; // 計算工人和目的地之間的箱子的個數
        else if (!Block.IsBlank(bi)) boxs += 2; // “墻”和“磚”折算為兩個箱子
      }
      if (boxs > 1) return 0; // 最多只能推著一個箱子前進
      return steps - boxs; // 工人移動的步數
    }

    /// <summary>
    /// 檢查鼠標點擊位置是否可達, 并將像素換算為單元格
    /// </summary>
    /// <param name="to">輸出:換算后的位置</param>
    /// <returns>是否可達</returns>
    bool CanTo(out Point to)
    {
      if (!ValidClick(out to)) return false;
      if (!Block.IsMan(db.Map[worker.Y, worker.X])) throw new Exception("內部錯誤:工人的位置上不是工人");
      if (!Block.IsBlank(db.Map[to.Y, to.X])) return false; // 目的地必須是“地”或“槽”
      if (to.Y == worker.Y && to.X == worker.X) return false; // 目的地不能是工人當前的位置
      return true; // 目的地可達
    }

    /// <summary>
    /// 檢查鼠標點擊位置是否有效, 并將像素換算為單元格
    /// </summary>
    /// <param name="to">輸出:換算后的位置</param>
    /// <returns>是否有效位置</returns>
    bool ValidClick(out Point to)
    {
      to = Point.Empty;
      if (HasError) return false;
      to.Y = toPixel.Y / boxSize.Height + 1;
      to.X = toPixel.X / boxSize.Width + 1;
      if (toPixel.X >= boxSize.Width * LevelSize.Width || toPixel.Y >= boxSize.Height * LevelSize.Height)
        return false; // 目的地超出當前關的有效范圍
      return true; // 目的地有效
    }
  }
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91蜜桃网址入口| 国产麻豆成人传媒免费观看| 国产精品传媒入口麻豆| 久久久久久久久久电影| 国产人妖乱国产精品人妖| 亚洲国产成人在线| 国产精品国产自产拍高清av| 欧美韩国日本不卡| 亚洲资源在线观看| 美国十次综合导航| 不卡一区二区在线| 精品噜噜噜噜久久久久久久久试看| 欧美日韩国产系列| 久久免费偷拍视频| 国产精品国产精品国产专区不片| 亚洲精品日韩专区silk| 人人超碰91尤物精品国产| 国产精品一区在线观看你懂的| 91免费在线播放| 精品久久久久香蕉网| 99re这里只有精品首页| 亚洲一本大道在线| 日本一区中文字幕| 91久久奴性调教| 精品对白一区国产伦| 一区二区三区中文字幕| 国产激情一区二区三区四区| 欧美亚洲国产一卡| 亚洲欧洲日产国码二区| 奇米在线7777在线精品| 欧美在线免费播放| 亚洲男人电影天堂| 丁香婷婷综合色啪| 久久久久久久久一| 老司机免费视频一区二区 | 99国产精品久久久久| 精品国产青草久久久久福利| 亚洲国产sm捆绑调教视频| 99国产精品一区| 亚洲欧洲av一区二区三区久久| 国产成人亚洲综合a∨婷婷 | 天天综合日日夜夜精品| 色综合一个色综合| 亚洲午夜在线电影| 欧美精品免费视频| 免费成人美女在线观看| 欧美白人最猛性xxxxx69交| 日韩电影在线一区二区三区| 欧美一卡二卡在线观看| 六月丁香综合在线视频| 欧美在线一二三四区| 性做久久久久久免费观看| 日韩一级片在线观看| 激情综合五月婷婷| 国产精品青草久久| 在线观看视频91| 免费久久精品视频| 国产精品第一页第二页第三页 | 久久久精品蜜桃| 色婷婷久久久亚洲一区二区三区| 丝袜美腿亚洲一区| 国产情人综合久久777777| 91色.com| 国产电影一区在线| 视频一区中文字幕| 亚洲国产高清aⅴ视频| 欧美日韩久久久久久| 成人免费黄色大片| 蜜臀av性久久久久蜜臀aⅴ| 中文字幕日本乱码精品影院| 欧美一级午夜免费电影| 色综合天天狠狠| 风间由美一区二区av101| 石原莉奈在线亚洲三区| 尤物av一区二区| 亚洲欧美视频一区| 国产精品美女www爽爽爽| wwwwxxxxx欧美| 日韩三级视频在线看| 欧美一区二区三区四区久久| 色老汉一区二区三区| 99天天综合性| a亚洲天堂av| 91免费视频观看| 91福利在线看| 欧美日韩高清一区二区不卡| 欧美老人xxxx18| 欧美高清一级片在线| 欧美一级欧美一级在线播放| 91精品国产全国免费观看| 欧美日韩国产精品成人| 69堂亚洲精品首页| 精品久久久久久综合日本欧美 | 日韩av一区二| 日本欧美韩国一区三区| 日韩国产在线观看| 久久影视一区二区| 欧美主播一区二区三区美女| 91成人看片片| 日韩欧美亚洲国产另类| 亚洲国产精品精华液ab| 亚洲色大成网站www久久九九| 亚洲视频狠狠干| 日本在线不卡视频| 成a人片国产精品| 欧美精品第1页| 国产精品人人做人人爽人人添| 亚洲精品国产一区二区精华液| 强制捆绑调教一区二区| 不卡av电影在线播放| 日韩免费电影一区| 亚洲女人的天堂| 粉嫩13p一区二区三区| 91精品国产综合久久香蕉麻豆| 久久精品人人做人人爽人人| 亚洲高清免费在线| 色综合 综合色| 国产精品美女久久久久av爽李琼 | av一本久道久久综合久久鬼色| 日韩欧美国产一二三区| 亚洲国产成人va在线观看天堂| 国产乱人伦偷精品视频不卡| 欧美情侣在线播放| 午夜精品一区二区三区免费视频| 成人黄色软件下载| 欧美国产激情二区三区| 丰满亚洲少妇av| 久久综合资源网| 国内精品国产三级国产a久久| 欧美日韩国产成人在线91| 一区二区三区四区激情| 色综合久久66| 亚洲国产乱码最新视频| 欧美高清性hdvideosex| 亚洲成人动漫在线观看| 欧美日韩国产不卡| 精品一区二区在线观看| 国产精品人成在线观看免费| 久久er99热精品一区二区| 久久久精品国产免费观看同学| 国产一区在线不卡| 亚洲欧洲精品一区二区精品久久久| aaa亚洲精品| 五月天激情综合| 久久色.com| 欧美日韩一区二区三区四区五区| 亚洲福利国产精品| 欧美成人一级视频| 一本到高清视频免费精品| 日韩成人dvd| 日韩理论电影院| 日韩欧美一区在线观看| 99在线精品观看| 精品一区二区三区的国产在线播放 | 欧美日本乱大交xxxxx| 国产一区二区三区最好精华液| 亚洲精品国产a| 亚洲国产高清aⅴ视频| 欧美一区二区福利视频| 91日韩在线专区| 国产精品伊人色| 看电影不卡的网站| 亚洲综合一二区| 亚洲欧美日韩久久| 国产亚洲一二三区| 久久综合九色综合久久久精品综合| 一本大道久久a久久精二百| 国产一区二区免费在线| 蜜桃av一区二区三区电影| 婷婷国产v国产偷v亚洲高清| 一区二区免费在线| 一区二区三区四区av| 一区二区三区高清| 亚洲国产婷婷综合在线精品| 亚洲大片免费看| 亚洲国产日韩a在线播放 | 91久久精品网| 色先锋aa成人| 在线电影一区二区三区| 欧美一级理论片| 337p日本欧洲亚洲大胆精品 | 高清久久久久久| 色综合视频一区二区三区高清| 99久久精品免费看| 国产黄色精品视频| 一本色道亚洲精品aⅴ| 欧美一级片在线观看| 在线欧美日韩国产| 欧美日韩精品一二三区| 欧美精品视频www在线观看| 欧美不卡一二三| 自拍偷拍亚洲激情| 久久超碰97中文字幕| 国产精品一卡二卡| 欧美日韩亚洲另类| 欧美激情一区二区三区蜜桃视频| 亚洲精品中文在线| 国模一区二区三区白浆| 欧洲亚洲精品在线| 久久精品男人的天堂|