99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜AV-亚洲一级无码一区二区一-免费国产成高清人在线视频-中文字幕乱码免费观看-国产毛片精品妇女久久久

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營的一線實(shí)戰(zhàn)洞察。

C#推箱子小游戲源碼解析:地圖建模、移動判定與避坑指南

C#推箱子小游戲源碼解析:地圖建模、移動判定與避坑指南 簡介C#推箱子小游戲完整源代碼面向C#入門與游戲編程愛好者演示了Windows窗體應(yīng)用從界面搭建、鍵盤事件到游戲邏輯的完整寫法適合作為課程設(shè)計(jì)或練習(xí)項(xiàng)目參考。程序支持推箱子、撤銷CtrlZ、重復(fù)CtrlY、選關(guān)等核心操作通關(guān)后可將最佳步數(shù)保存為.way文件用于回放演示或分享通關(guān)過程同時支持自行設(shè)計(jì)關(guān)卡、當(dāng)前狀態(tài)存盤與讀盤方便反復(fù)挑戰(zhàn)和擴(kuò)展玩法。資源包共76個文件以10個.cs源碼為中心配以11張.bmp地圖與角色素材、15個.way路徑記錄、13個.dat數(shù)據(jù)存檔以及項(xiàng)目工程和可運(yùn)行exe整體僅135KB結(jié)構(gòu)緊湊、層次分明便于對照源碼逐模塊理解。目前已有960人學(xué)習(xí)下載適合想通過小游戲?qū)崙?zhàn)熟悉C#文件I/O、窗口控件與邏輯控制的讀者源碼中還預(yù)留了自動尋路深度優(yōu)先搜索與棧實(shí)現(xiàn)、鼠標(biāo)拖拽操作、通關(guān)光榮榜等未完成功能能引導(dǎo)進(jìn)階者進(jìn)一步練習(xí)算法和交互設(shè)計(jì)。1. C# 推箱子小游戲源代碼練手就該從這種能跑完的項(xiàng)目開始不少 C# 初學(xué)者手頭不缺語法書缺的是一個「能跑起來、讀得懂、改得動」的完整小游戲源碼。掃雷涉及遞歸展開貪吃蛇要處理隊(duì)列和定時刷新對剛摸到面向?qū)ο箝T檻的人都有點(diǎn)勸退推箱子剛好卡在那個舒服的位置上——二維數(shù)組管地圖、方向鍵管輸入、幾個 if 管碰撞判定整個游戲邏輯一晚上能讀完。C# 推箱子小游戲源代碼這個標(biāo)題背后你要找的其實(shí)就是一套地圖建模、角色移動、箱子推進(jìn)、勝負(fù)判定的完整實(shí)現(xiàn)外加一個能交互的界面。這套源碼解決的不只是「交作業(yè)」這一件事。對想轉(zhuǎn)上位機(jī)或 Unity 的開發(fā)者來說推箱子是把「狀態(tài)機(jī) 坐標(biāo)運(yùn)算 UI 刷新」串起來的最小可運(yùn)行樣本對老師或培訓(xùn)講師來說它是一個能讓學(xué)生照著改出幾十個變體的課程設(shè)計(jì)載體。本文按一條主線走先把地圖和移動邏輯講透再給出控制臺與 WinForms 兩種可運(yùn)行版本最后拆類、講坑、加悔棋。跟著走完你手上會有一套自己能二次開發(fā)的推箱子源碼而不是一個「跑完就刪」的黑匣子。2. 推箱子的核心邏輯地圖建模與移動判定先寫對這 3 個函數(shù)2.1 地圖建模用字符數(shù)組把關(guān)卡變成一張可以計(jì)算的網(wǎng)格所有推箱子源碼的第一步都是把「一張畫著墻、箱子、人的圖」變成程序能讀的數(shù)據(jù)。常見做法是用一個二維字符數(shù)組char[rows, cols]來存地圖每個格子是一個單字符字符的約定在推箱子圈子里基本是通用的# 表示墻$ 表示箱子. 表示目標(biāo)點(diǎn) 表示玩家。下面的解析函數(shù)把一組字符串?dāng)?shù)組轉(zhuǎn)換成一個二維數(shù)組同時記住玩家初始坐標(biāo)。public class GameMap { public char[,] Grid; public int Rows { get; private set; } public int Cols { get; private set; } public int PlayerX { get; private set; } public int PlayerY { get; private set; } public static GameMap Parse(string[] lines) { int rows lines.Length; int cols 0; foreach (var line in lines) cols Math.Max(cols, line.Length); var map new GameMap { Rows rows, Cols cols, Grid new char[rows, cols] }; for (int y 0; y rows; y) { for (int x 0; x cols; x) { char c x lines[y].Length ? lines[y][x] : ; if (c ) { map.PlayerX x; map.PlayerY y; } map.Grid[y, x] c; } } return map; } }邏輯說明GameMap把地圖數(shù)據(jù)和玩家位置打包在一起Parse先把所有行的最大長度取出來作為列數(shù)避免某個短行導(dǎo)致數(shù)組變成參差不齊的形狀。代碼里的x lines[y].Length是為了防止某一行比其他行短缺失的部分統(tǒng)一補(bǔ)成空格。這個健壯性處理很關(guān)鍵——你從文本文件讀關(guān)卡時最后一行很可能因?yàn)閾Q行符問題少一個字符。參數(shù)說明Rows 和 Cols 是地圖邊界TryMove里所有坐標(biāo)判斷都要先拿它們做越界檢查否則數(shù)組越界異常會在你按下方向鍵的瞬間噴出來。玩家坐標(biāo)的初始化放在解析階段是因?yàn)楹竺婷恳徊揭苿佣家馈溉爽F(xiàn)在在哪」。2.2 移動邏輯與碰撞檢測角色能不能走、箱子能不能推全在這一個函數(shù)里有了地圖數(shù)組接下來的問題是按下方向鍵后會發(fā)生什么。這里有個新手容易寫亂的判定順序——必須先把「人和箱子能不能動」全部探明再一次性更新坐標(biāo)先動人再判斷箱子就會出現(xiàn)主角瞬移穿墻的靈異事件。四個方向的移動本質(zhì)上是給坐標(biāo)加一組偏移量上(0, -1)、下(0, 1)、左(-1, 0)、右(1, 0)判斷邏輯對四個方向完全對稱。private static readonly (int dx, int dy)[] Dirs { (0, -1), // 上 (0, 1), // 下 (-1, 0), // 左 (1, 0) // 右 }; public bool TryMove(int dirIndex) { var (dx, dy) Dirs[dirIndex]; int nx PlayerX dx; int ny PlayerY dy; // 第一步目標(biāo)格越界或撞墻直接返回 if (nx 0 || nx Cols || ny 0 || ny Rows) return false; if (Grid[ny, nx] #) return false; // 第二步目標(biāo)格是箱子檢查箱子能不能再往前一步 if (Grid[ny, nx] $ || Grid[ny, nx] *) { int bx nx dx; int by ny dy; if (bx 0 || bx Cols || by 0 || by Rows) return false; if (Grid[by, bx] # || Grid[by, bx] $ || Grid[by, bx] *) return false; // 箱子移動目標(biāo)格若是 . 則變成 *,否則是 $ Grid[by, bx] Grid[by, bx] . ? * : $; Grid[ny, nx] (Grid[ny, nx] *) ? . : ; } // 第三步角色移動原位置恢復(fù)成 . 或空格 Grid[PlayerY, PlayerX] Grid[PlayerY, PlayerX] ? . : ; PlayerX nx; PlayerY ny; Grid[ny, nx] (Grid[ny, nx] . || Grid[ny, nx] *) ? : ; return true; }邏輯說明Dirs數(shù)組把四個方向映射為坐標(biāo)偏移避免在函數(shù)里寫四段幾乎相同的 if 分支。判斷的先后順序是重點(diǎn)——先檢查角色目標(biāo)格(nx, ny)能不能站如果站的是箱子再檢查箱子前方(bx, by)能不能落。兩步檢查全部通過之后才去改地圖數(shù)組這就是「先探測后更新」的防穿墻關(guān)鍵。參數(shù)說明這里用到了*和兩個特殊狀態(tài)*表示箱子站在目標(biāo)點(diǎn)上表示玩家站在目標(biāo)點(diǎn)上。很多人第一次寫字面量判斷漏掉這兩個狀態(tài)導(dǎo)致箱子推到目標(biāo)點(diǎn)上后地圖顯示變成空格勝利條件永遠(yuǎn)判不中。把這個狀態(tài)在注釋里寫清楚后面所有關(guān)卡顯示和勝負(fù)判定都會輕松很多。2.3 勝負(fù)判定箱子到?jīng)]到齊兩種計(jì)數(shù)方案任選推箱子的勝負(fù)條件很直白所有目標(biāo)點(diǎn)都被箱子占住。實(shí)現(xiàn)上有兩種思路。第一種是每次移動后遍歷整個地圖數(shù)一下*的數(shù)量是否等于目標(biāo)點(diǎn)總數(shù)第二種是提前記錄目標(biāo)點(diǎn)的坐標(biāo)集合每步移動后逐個檢查。小地圖上兩者性能差別可以忽略但我建議用第二種原因是它還能順帶告訴你「還差哪個點(diǎn)沒歸位」做關(guān)卡提示時不用再掃一遍地圖。public class GameMap { private readonly List(int x, int y) _targets new(); public int TargetCount _targets.Count; public bool IsWin() { foreach (var (x, y) in _targets) { if (Grid[y, x] ! * Grid[y, x] ! ) return false; } return true; } }邏輯說明_targets在Parse階段收集凡遇到.或都記錄坐標(biāo)。IsWin遍歷目標(biāo)點(diǎn)只要有一個點(diǎn)上不是*就說明箱子沒壓上去。判定時把也算通過是因?yàn)橥婕铱赡芮『谜驹谀硞€目標(biāo)點(diǎn)上如果玩家的位置和目標(biāo)點(diǎn)重疊了那個格子仍然算目標(biāo)已占用。參數(shù)說明這個實(shí)現(xiàn)不去數(shù)「箱子總數(shù)」因?yàn)榭赡艽嬖谙渥硬辉谌魏文繕?biāo)點(diǎn)上的死局狀態(tài)數(shù)箱子會誤判。實(shí)際調(diào)用IsWin的時機(jī)放在每次TryMove成功返回true之后移動失敗不用判。死局檢測箱子全卡墻角屬于求解算法范疇這個最小源碼里不做后面做關(guān)卡編輯器時可以通過「可解性」過濾關(guān)卡。3. 把源碼跑起來從控制臺最小版本到 WinForms 界面3.1 控制臺最小版本不碰 UI 線程先把游戲循環(huán)跑通邏輯寫完后第一步永遠(yuǎn)先做控制臺版本。它沒有窗體焦點(diǎn)的干擾沒有跨線程訪問控件的異常能讓你把注意力全放在游戲循環(huán)上讀按鍵、調(diào)TryMove、判斷勝負(fù)、重繪地圖。static void Main() { string[] lines { ##### , # # , # $ # , ### . ###, # $ #, # . #, ### . ###, # # , ##### }; var map GameMap.Parse(lines); while (true) { Console.Clear(); Render(map); if (map.IsWin()) { Console.WriteLine(你贏了); break; } var key Console.ReadKey(true).Key; int dir key switch { ConsoleKey.UpArrow 0, ConsoleKey.DownArrow 1, ConsoleKey.LeftArrow 2, ConsoleKey.RightArrow 3, ConsoleKey.Escape -1, _ -2 }; if (dir -1) break; if (dir 0) map.TryMove(dir); } } static void Render(GameMap map) { for (int y 0; y map.Rows; y) { for (int x 0; x map.Cols; x) Console.Write(map.Grid[y, x]); Console.WriteLine(); } }邏輯說明Console.ReadKey(true)的參數(shù)true表示按鍵不回顯否則你每按一次方向鍵控制臺窗口里會多出一個箭頭字符干擾地圖顯示。switch表達(dá)式把ConsoleKey枚舉映射成 0 到 3 的方向索引正好對上前一節(jié)Dirs數(shù)組的順序這是一處極容易踩的對不齊問題——方向枚舉寫錯了不會報(bào)錯只會表現(xiàn)為「按上鍵人往左跑」。參數(shù)說明Escape鍵單獨(dú)映射成-1退出循環(huán)其他無關(guān)按鍵映射成-2忽略掉避免按了個字母鍵導(dǎo)致程序直接把一個未知索引傳給TryMove??刂婆_版不用加延遲推箱子是回合制游戲天然等人輸入加Thread.Sleep只會讓按鍵體驗(yàn)變黏。3.2 WinForms 最小版本用 Label 數(shù)組當(dāng)瓦片邏輯與 UI 分離控制臺版能跑通后往 WinForms 遷移時最省事的方式是用Label[,]數(shù)組做地圖瓦片。每個Label顯示一個字符背景色區(qū)分墻和空地窗體的KeyDown事件接方向鍵。這樣地圖邏輯完全復(fù)用上一章的GameMapUI 層只做「把數(shù)組渲染成控件」這件事。public partial class MainForm : Form { private GameMap _map; private Label[,] _cells; private const int CellSize 24; public MainForm() { InitializeComponent(); KeyPreview true; DoubleBuffered true; FormBorderStyle FormBorderStyle.FixedSingle; MaximizeBox false; string[] lines { /* 與 Console 版相同的關(guān)卡字符串 */ }; _map GameMap.Parse(lines); BuildGrid(); Redraw(); } private void BuildGrid() { _cells new Label[_map.Rows, _map.Cols]; for (int y 0; y _map.Rows; y) { for (int x 0; x _map.Cols; x) { var cell new Label { Left x * CellSize, Top y * CellSize, Width CellSize, Height CellSize, TextAlign ContentAlignment.MiddleCenter, Font new Font(Consolas, 12F) }; _cells[y, x] cell; Controls.Add(cell); } } ClientSize new Size(_map.Cols * CellSize, _map.Rows * CellSize); } private void Redraw() { for (int y 0; y _map.Rows; y) { for (int x 0; x _map.Cols; x) { char c _map.Grid[y, x]; _cells[y, x].Text c.ToString(); _cells[y, x].BackColor c switch { # Color.Gray, $ or * Color.SandyBrown, . or Color.LightGreen, _ Color.White }; } } } }邏輯說明KeyPreview true讓窗體先于子控件收到鍵盤事件否則焦點(diǎn)落在某個 Label 上時方向鍵根本不會傳到窗體。BuildGrid按CellSize逐個擺控件ClientSize根據(jù)行列數(shù)算這樣窗口大小能嚴(yán)格罩住地圖不會出現(xiàn)地圖畫了一半被窗體邊緣切掉的局面。參數(shù)說明字體用Consolas是等寬字體否則每個字符寬度不一致貼了磚塊的墻畫出來會歪歪扭扭。Redraw用 switch 表達(dá)式做字符到背景色的映射后續(xù)想換皮膚比如把墻改成深灰色、箱子改成木紋色只改這一處不需要碰邏輯層。這就是邏輯與 UI 分離的第一個好處調(diào)樣式不碰判斷代碼。3.3 鍵盤輸入與刷新參數(shù)KeyDown 別寫成長按連發(fā)重繪用 InvalidateWinForms 里的方向鍵處理常見的翻車點(diǎn)是把邏輯寫在KeyPress事件里——方向鍵根本不是字符鍵KeyPress不會觸發(fā)還有人用Timer每秒輪詢鍵盤狀態(tài)產(chǎn)生連發(fā)和輸入黏滯。正確做法是重寫OnKeyDown或在KeyDown事件里處理。protected override void OnKeyDown(KeyEventArgs e) { int dir e.KeyCode switch { Keys.Up 0, Keys.Down 1, Keys.Left 2, Keys.Right 3, _ -1 }; if (dir 0 _map.TryMove(dir)) { Redraw(); if (_map.IsWin()) MessageBox.Show(過關(guān)); } base.OnKeyDown(e); }邏輯說明OnKeyDown是窗體的虛方法重寫它比掛事件委托更直觀也避免在InitializeComponent里額外登記一遍 handler。TryMove的返回值在這里還有一個額外價值只有這一步確實(shí)發(fā)生了移動時才重繪和判勝負(fù)按了方向鍵但撞墻時界面紋絲不動玩家從視覺上就知道「這條路走不通」。參數(shù)說明WinForms 的KeyDown在按鍵按住時會自動重復(fù)觸發(fā)這是系統(tǒng)行為回合制游戲不需要屏蔽它但如果要做「按住方向鍵連續(xù)移動」就得在Shift狀態(tài)的配合下自己加節(jié)流。Redraw內(nèi)部用的是 Label 控件的屬性修改本身會觸發(fā)重繪不需要手動調(diào)用Invalidate只有改成自定義Paint繪制時才需要Invalidate()通知窗體刷新。3.4 三種界面方案怎么選控制臺、WinForms 與 Unity 的取舍方案上手難度卡點(diǎn)適合場景控制臺最低字符渲染丑中文輸入法可能截獲方向鍵驗(yàn)證游戲邏輯、教學(xué)演示W(wǎng)inForms中等控件數(shù)量多大數(shù)據(jù)量地圖會卡課程設(shè)計(jì)、小型桌面游戲Unity較高引入了 Sprite、Input System 等新概念想繼續(xù)做游戲方向的人參數(shù)說明如果你只是要「C# 推箱子小游戲源代碼」?jié)M足課程要求WinForms 是性價比最高的終點(diǎn)如果目標(biāo)是學(xué) Unity 開發(fā)建議把這里的GameMap直接搬過去渲染層替換成 Sprite 渲染器邏輯層完全不用動。這也印證了拆類的價值——換界面不換腦子。4. 源碼怎么組織拆類、關(guān)卡文件與擴(kuò)展點(diǎn)決定這套代碼能走多遠(yuǎn)4.1 類怎么拆地圖數(shù)據(jù)、游戲引擎、UI 渲染三者各管一段很多初學(xué)者拿到別人的源碼第一反應(yīng)是把所有代碼塞進(jìn)Form1.cs結(jié)果一個窗體文件寫到六百行最后連自己都找不到箱子判定在哪。拆類的原則是地圖數(shù)據(jù)歸地圖、游戲規(guī)則歸規(guī)則、界面歸界面。下面是一個從實(shí)戰(zhàn)里沉淀出來的三分結(jié)構(gòu)按這個結(jié)構(gòu)組織源碼后面加悔棋、換皮膚都只需要動一個文件。類 / 文件職責(zé)關(guān)鍵成員GameMap地圖數(shù)據(jù)、解析、坐標(biāo)查詢Grid、PlayerX/Y、IsWin()GameEngine移動規(guī)則、步數(shù)統(tǒng)計(jì)、操作歷史TryMove()、StepCountMainForm渲染與輸入Redraw()、OnKeyDown()GameEngine可以看作GameMap的上層封裝GameMap知道地圖長什么樣但不知道「人能不能推箱子」GameEngine只調(diào)用GameMap暴露的Grid和玩家坐標(biāo)決定是否修改數(shù)據(jù)。這樣GameMap可以單獨(dú)做單元測試比如直接構(gòu)造一張地圖斷言TryMove的返回值。4.2 關(guān)卡文件格式把地圖存成文本換關(guān)不用改代碼地圖硬編碼在源碼里的缺點(diǎn)是換個關(guān)卡就要改代碼重新編譯。常見做法是把關(guān)卡放進(jìn)外部文本文件用純 ASCII 字符保存每行代表地圖的一行。標(biāo)準(zhǔn)格式約定#墻$箱子.目標(biāo)點(diǎn)玩家空格是空地其他字符一律視為非法。public static GameMap LoadFromFile(string path) { string[] lines File.ReadAllLines(path, Encoding.UTF8); if (lines.Length 0) throw new InvalidDataException(關(guān)卡文件為空); var map GameMap.Parse(lines); if (map.TargetCount 0) throw new InvalidDataException(關(guān)卡中沒有目標(biāo)點(diǎn)); if (map.PlayerX 0 map.PlayerY 0) throw new InvalidDataException(關(guān)卡中沒有玩家); return map; }邏輯說明File.ReadAllLines會自動按平臺換行符拆分行省去手工處理\r\n的麻煩但如果你在 Linux 上寫好關(guān)卡、拿到 Windows 上用要確認(rèn)文件沒有混入異常換行。校驗(yàn)放在Parse之后是因?yàn)镻arse只負(fù)責(zé)構(gòu)造數(shù)組不負(fù)責(zé)業(yè)務(wù)合法性目標(biāo)點(diǎn)為零或者玩家缺失的關(guān)卡運(yùn)行后會變成死圖提前拋異常比運(yùn)行到一半出錯直觀得多。參數(shù)說明編碼用Encoding.UTF8是防止文件里有 BOM 或中文注釋導(dǎo)致首字符解析異常。關(guān)卡文件的列數(shù)不必每行相等Parse里已經(jīng)做了補(bǔ)齊處理但建議還是保持矩形因?yàn)楹芏嚓P(guān)卡編輯器生成的文本都是嚴(yán)格矩形的非矩形文件在別人復(fù)用時容易閱讀錯位。4.3 擴(kuò)展點(diǎn)步數(shù)統(tǒng)計(jì)、關(guān)卡切換、操作歷史留好接口一個能交差的推箱子源碼通常還要有兩個數(shù)字步數(shù)和關(guān)卡號。步數(shù)統(tǒng)計(jì)最容易犯的錯是「移動失敗也算一步」。正確做法是在GameEngine里做增量計(jì)數(shù)只有TryMove返回true時才StepCount。這個細(xì)節(jié)直接決定成績統(tǒng)計(jì)準(zhǔn)不準(zhǔn)。關(guān)卡切換有兩種做法把所有關(guān)卡寫進(jìn)一個文本文件用空行分隔或者放在Levels目錄下按Level01.txt、Level02.txt命名。我一般推薦后者因?yàn)閱蝹€游戲文件不會膨脹到幾百行而且可以單獨(dú)替換某一關(guān)而不影響其他關(guān)卡。切換時至少要做一次越界保護(hù)——當(dāng)前關(guān)卡號超過文件數(shù)量時提示「沒有更多關(guān)卡了」。至于悔棋第六章詳細(xì)講這里只需要知道GameEngine里留一個StackSnapshot類型的字段未來的操作歷史全掛在GameEngineMainForm只負(fù)責(zé)把撤銷按鈕接到這個堆棧上。5. C# 推箱子小游戲開發(fā)避坑指南5 個最容易翻車的點(diǎn)與排查方法5.1 方向鍵按了沒反應(yīng)窗體焦點(diǎn)被控件搶走事件根本沒到你手里現(xiàn)象程序跑起來用鼠標(biāo)點(diǎn)了地圖上的某個格子或空白區(qū)域后再按方向鍵角色紋絲不動。原因是窗體上添加了大量Label控件其中某些.TabStop屬性默認(rèn)為true的控件會搶占焦點(diǎn)KeyDown事件被派發(fā)到那個控件而不是窗體。解決方法是兩行設(shè)置KeyPreview true讓窗體優(yōu)先于子控件處理鍵盤事件同時把地圖瓦片的TabStop全部設(shè)為false讓 Label 不參與 Tab 循環(huán)。如果問題依舊在OnKeyDown開頭加一個Console.WriteLine(e.KeyCode)先確認(rèn)事件到底有沒有進(jìn)來再往下排查。5.2 窗口瘋狂閃爍重繪整個 ClientArea但沒有開啟雙緩沖現(xiàn)象每次按鍵后整個窗體像在放幻燈片尤其地圖超過 10×10 后閃爍肉眼可見。原因是刷新地圖時把所有 Label 的Text和BackColor都改了一遍每個控件分別觸發(fā)布局和重繪高頻觸發(fā)時 GDI 忙不過來。解決方法是給窗體開雙緩沖DoubleBuffered true把繪制先寫進(jìn)內(nèi)存位圖再一次刷到屏幕如果用了自定義控件自繪地圖同樣在自定義控件的構(gòu)造函數(shù)里設(shè)DoubleBuffered true。這是 WinForms 圖形開發(fā)里最無腦也最有效的性能開關(guān)新手經(jīng)常把它當(dāng)成玄學(xué)忽略掉實(shí)際上它是微軟文檔明寫的原生屬性。5.3 跨線程訪問控件報(bào)錯別用 Timer 輪詢鍵盤狀態(tài)現(xiàn)象用Timer每隔 100ms 讀一次按鍵狀態(tài)來驅(qū)動移動運(yùn)行幾分鐘后彈出InvalidOperationException說某控件只能從創(chuàng)建它的線程訪問。原因是Timer事件的回調(diào)跑在 UI 線程之外直接修改 Label 屬性觸發(fā)了線程安全檢查。推箱子是回合制游戲根本不需要定時器——按鍵本身就是事件KeyDown天然在 UI 線程上執(zhí)行。如果你的確需要在特定時間點(diǎn)自動執(zhí)行動作比如做步數(shù)超時懲罰就該用Control.BeginInvoke把 UI 更新封送回主線線程private void TimerTick(object sender, EventArgs e) { BeginInvoke(new Action(() { // 在這里更新 UI 控件 })); }5.4 地圖數(shù)組越界換行符、全角空格、矩形不齊三個隱形兇手現(xiàn)象直接復(fù)制網(wǎng)上關(guān)卡文本貼到代碼里運(yùn)行時一進(jìn)入某一行就拋IndexOutOfRangeException。原因有三個復(fù)制文本時每行末尾帶了 Windows 的\rParse按字符處理時多出一個不可見字符字符串里混入了全角空格或制表符\t導(dǎo)致邊長計(jì)算錯誤行長短不一程序取了最長行的長度作為列數(shù)但短行訪問時越界。解決方法是統(tǒng)一讓關(guān)卡文件走LoadFromFile再在Parse里做一次防御char c x lines[y].Length ? lines[y][x] : ;。這樣即使某行短了一截也只會在視覺上多出一個空格不會產(chǎn)生異常。組裝關(guān)卡時可以用Debug.Assert(map.Cols expectedCols)把邊界約束寫死在代碼里。5.5 箱子穿墻瞬移狀態(tài)更新順序?qū)懛聪葎恿巳嗽賱拥南渥蝇F(xiàn)象面對墻角的箱子按下朝向墻角的方向鍵箱子直接穿透墻跑出去了。原因是移動邏輯里先把玩家坐標(biāo)更新了再判斷箱子能不能推結(jié)果TryMove用的是「新玩家位置」去取箱子坐標(biāo)全部偏移一格判定自然錯位。解決方法是嚴(yán)格按上一章的順序先取目標(biāo)格再判斷目標(biāo)格是箱子時取箱子前方所有越界和撞墻檢查通過后才統(tǒng)一改寫玩家和箱子的位置。這里有個把每個地圖存成char[,]快照放進(jìn)棧里的前提——你的GameMap必須支持深拷貝否則棧里存的是引用所有快照會在下一次移動時一起改變。6. 更進(jìn)一步給源碼加上悔棋和關(guān)卡校驗(yàn)增量改造不超過 20 行6.1 悔棋三步走快照、入棧、回退推箱子最常見的剛需是悔棋。地圖不大完整復(fù)制整個char[,]的開銷可以忽略所以最可靠的做法是「整圖快照」而不是記錄單步操作再反向推演。每一次移動前把當(dāng)前Grid、玩家坐標(biāo)、步數(shù)壓進(jìn)棧撤銷時彈出快照恢復(fù)原狀public class GameEngine { private readonly Stack(char[,] grid, int px, int py, int steps) _history new(); public bool TryMoveWithUndo(int dir) { _history.Push((CloneGrid(), PlayerX, PlayerY, StepCount)); return TryMove(dir); } public void Undo() { if (_history.Count 0) return; var (grid, px, py, steps) _history.Pop(); Grid grid; PlayerX px; PlayerY py; StepCount steps; } private char[,] CloneGrid() (char[,])Grid.Clone(); }參數(shù)說明棧里同時存了步數(shù)撤銷后步數(shù)回退統(tǒng)計(jì)數(shù)字不會虛高。Clone()對二維數(shù)組做的是淺拷貝但這里Grid的元素是char值類型淺拷貝恰好等效于深拷貝。這個方案的一個隱藏收益是撤銷不受「箱子經(jīng)過哪些路徑」影響哪怕關(guān)卡狀態(tài)再亂都能完整回退到上一步。6.2 關(guān)卡編輯器寫一個校驗(yàn)函數(shù)手工編關(guān)也能跑拿到源碼后想自己加關(guān)卡最省事的就是做文本編輯器。在Notepad或 VS Code 里按 ASCII 畫地圖保存成 txt再用LoadFromFile加載。校驗(yàn)函數(shù)至少查三件事玩家有且只有一個、至少存在一個目標(biāo)點(diǎn)、地圖四周閉合。四周閉合可以遍歷第一行、最后一行、第一列、最后一列確認(rèn)全是#public static void Validate(GameMap map) { int pCount 0, targetCount 0; for (int y 0; y map.Rows; y) for (int x 0; x map.Cols; x) { if (map.Grid[y, x] ) pCount; if (map.Grid[y, x] . || map.Grid[y, x] *) targetCount; if (y 0 || y map.Rows - 1 || x 0 || x map.Cols - 1) if (map.Grid[y, x] ! #) throw new InvalidDataException(地圖邊界未閉合); } if (pCount ! 1) throw new InvalidDataException(玩家數(shù)量必須為1); if (targetCount 0) throw new InvalidDataException(至少需要一個目標(biāo)點(diǎn)); }我第一次寫推箱子源碼時把地圖硬編碼在Form1.cs里加了三個關(guān)卡后代碼就亂成一團(tuán)。后來把地圖挪到外部文件、把邏輯拆成GameMap和GameEngine再回頭看真正難的部分根本不是界面而是移動判定里的狀態(tài)枚舉——*和這倆狀態(tài)一漏地圖顯示和勝負(fù)判定同時出錯。這也是我給所有拿這份源碼做二次開發(fā)的人唯一的建議遇到詭異 bug 先打印當(dāng)前地圖到控制臺把數(shù)組真實(shí)值看清楚再改代碼。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
8区视频在线| 五月婷婷片| 久久狠狠干| 色香欲综合| 九九久久五月天综合伊人| 香蕉五月婷婷| 日韩精品一区二区三区,四区,五区视频| 五月丁香欧美综合| 五月婷婷花| 丁香狠狠色婷婷| 91蜜桃婷婷狠狠久久综合9色| 激情五月天激情小说| 超碰91在线| 99操九九网| 玖玖资源在线视频| 久色网址| 五月婷婷影| 亚洲丁香五月美女| 亚洲人人96@| 五月天丁香综合在线| AV九九| 天天干夜夜谢| 激情五月天综合| 色色自拍视频网站| 丁香六月婷婷缴情欧美| 一区二区成人电影| 婷婷五月丁香久久| 欧美精品999| 91成人看| 91日精品| 亚洲人妻Av| 久久婷五月影院| 婷婷五月综合在线| 天天日天天插| 天天做天天爱天天爽| 九九热10| 五月丁香激情婷婷| 乱码操操| 99这里都是精品| 激情五月天婷婷| 性色视频| 丁香五月婷婷激情尤物| 久久免费操| 婷婷淫淫狠狠六月| 中文字幕精品在线观看| 日韩黄黄| 香蕉久久国产AV一区二区| 99re在线精品视频| 丁香六月综合激情| 国产熟妇乱子伦hd| 欧美69色| 五月丁香啪啪综合网| 色综合色色色色| 涩九九九九| 伊人五月天97| 五月花综合网| 九九视频精品在线免费| 怡红院视频| 婷婷五月天成人综合网| 婷婷五月天综合在线| WWW.夜夜| 色情久久久| www.91九色| 色婷婷综合影院| 综合久久高清| 99超级碰免费视频| 99re资源在线视频导航| 2020日日干| 99精品在线观看视频| 婷婷五月天激情综合| 9久热在线视频精品| 欧美激情VA永久在线播放| 五月丁香六月婷婷综合网站| 狠狠干夜夜干| 热久91| 亚洲色基地| 97色在线观看视频| 色五月婷婷狠狠撸| 亚洲视频图片婷婷五月| 日本色天堂| 色五月婷婷影院| 五月婷婷色五月| 无码人妻少妇色欲AV一区二区| 精品一区二区三区四区五区六区| 色五月色情| 密视AV综合在线| 天天综合久久| 午夜性爱影视一区77| 狠狠色 综合色区| 色激情五月| 久婷婷婷| 久久久9久| 超碰成人av| 欧美黑人大吊| 深爱综合网| 久久久精品AV| 五月丁香色停停啪啪啪| 伊九九三级区| 五月丁香综合网| 色色射| 色婷婷基地在线| 婷婷色丁香五月| 99这里都是精品6| 91碰碰碰| 97色色综合| .操區COm| 黄网免费观看| 丁香六月av| 日日噜噜夜夜狠狠久久丁香六月| 99这里只有精品视频| 五月天激情婷婷| 丁香五月 无码| 中文字幕av在线| 色婷婷狠狠色| 欧美激情综合色综合啪啪五月| 91人人妻人人操| www.五月天婷婷.com| 五月天婷婷激情综合| 天天插天天爱| 天天爽在线视频| WWW.色婷婷.COM| 中文字幕黄色片| 97碰 在线视频观看| 日韩综合久久| 精品爆操| 视频1区2区| 国产26uuu视频| 99九九热在线观看| 九月丁香婷婷综合| 久久久久久久97| 九九艹女| 激情五月丁香六月综合AVXXXX| 日本欧美成人片AAAA| 色欲丁香| 天天色播| 99热日韩这里只有精品| 五月天激情网图片| 五月花成人网| 亚洲无AV在线中文字幕 | 91岛国片| 热久国产| 在线五月婷婷小电影| 五月婷婷色播| 欧美日韩999| 丁香激情五月| 色99在线视频| 九九热精品视频| 日韩成人AV在线播放| 深爱婷婷丁香五月激情| 久久婷婷大香蕉| 色五月婷婷激情五月| 香蕉久久国产AV一区二区| 九九色综合| 九月婷婷久久久| 色综合九九色综合88| 五月天丁香| 久久丁香婷婷五月| 热久久91| 婷婷六月激情丁香| 伊人综合色干| 99操视频| 天天综合天天玩夜夜玩天天玩夜夜玩| 影音先锋91在线资源站| 97色色色色色| 色婷婷综合网站| 大香蕉久艹| 婷婷五月亚洲综合| 欧美成人AAA片一区国产精品| 久久精品爱爱| 色综合99无码 | 99国产精品久久久久久久久久久| 69激情小说| 另类婷婷五月天啪帕帕| 五月停停999| 婷婷五月天综合久久| 九月婷婷激情| 天色综合网站| 射久久丁香五月| 激情五月婷婷| 99在线视频免费| 国产一区二区av免费| 天天爽天天爽夜夜爽| 国产午夜伦鲁鲁| 九九色热视频| 另类天堂| 99精品网址| 亚洲天堂大香蕉| 91日本在线| 五月婷丁香| 天天开心AV色综合婷婷五月天| 色在线免费观看| 99色在线| 婷婷五月婷婷五月| 大香蕉综合| 538在线精品| 色XX综合网| caop在线| 香蕉五月婷婷| 青青久在线视频免费观看| 天天视频亚洲| 99热日韩这里只有精品| www.日本91| 久久婷婷五月天| 毛片色五月| 啊V视频在线观看| 成人综合网站| 五月天伊人网| 婷婷娌伦网| 99久久99视频只有精品| 一级二级色大片| 青青草免费公开视频| 五月丁香六月婷婷操操操| 99干日本| 久久天堂色| 丁香五月偷拍| 99久在线视频| 中文成人在线| 久草热视频在线观看| 色噜噜狠狠色综合伊人| 大香蕉久艹| 久久久宗合视频88| 色婷婷久久| 天天日天天爽| 夜夜爽天天爽| 99精品视频网站| 婷婷久久视频| 狠狠色五月激情| 99热性色| 停停综合色色| 婷婷九月在线| 人人叉久| 欧美性交一区二区三区| 99在线免费视频播放| 婷婷五月婷婷| 五月婷婷影院| 五月综合久久| 丁香六月婷婷综合| 久热久| 97干免费视频| 97久久视频| 色婷婷小说网| 激情久久久久久久久久久| 五月婷婷六月婷| 六月欧美综合色情| 99热这里只有精品21| 97视频.干com| 久操人妻| 亚洲日本激情| 99久久成人| 色五月之第四色| 激情黄色小说色五月| 天堂综合久| 五月婷婷六月丁香激情| 欧美狠狠色| 国产精品香蕉| 激情五月天 婷婷| 丁香五月亚洲天堂| 天天做好综合色| 玖玖资源站视频| 国产精品成人av在线观看春天| 最新五月天婷婷影| 五月色色激情网| 狠狠插日日干撸| 色丁香久久久| 久久视频婷婷| 99色视频在线| 亚洲12p| 国产亚洲精品久久久久久久久动漫| 婷婷伊人綜合中文字幕| www.色色色com| 成人性生活免费观看。| 五月天天综合| 久热只有这里有精品| 久久三级视频| 无码G高清天| 婷婷涩涩网| 色爱综合视频| 婷婷涩涩五月天| 91精品婷婷国产综合| 五月丁香婷草| 深爱网深爱综合网| 色综合久久88色综合天天99| www.丁香五月| 亚洲九九99精品视频在线播放| 99热黄| 天天综合久久| 五月婷婷色丁香| 丁香五月天激情小说| 久久久精品人妻录| 久久婷综合| 五月丁香影院| 五月天怕怕| 五月天综合激情网| AV79| 久久这里只有精品99| 色五月情| 操操人人| 91九色中文字幕女在线观看| 九九sese| 一月婷婷色色| 婷婷影院A成人| www.久久婷婷| 色婷婷五月网| 99视频自拍| 伊人在线大香蕉网| 久久久久久草黄色片AV在线观看| 五月婷婷丁香网| 久久草大香蕉| 亚洲操B视频| 丁香婷婷人妻| 天天插天天插| 20253AV| 一逼色综合| 欧美婷| 久久久久久激情| 久久性爱网| 日韩不卡DvD| 久久这里99| 久久久久亚洲AV无码网影音先锋| 婷婷丁香五月婷婷| 亚洲99热| 激情婷婷五月天伊人在线观看| 激情五月丁香亭亭 | 99热999| 五月情丁香色| 激情www| 色婷婷丁香AV综合| 婷婷五月天亚洲图片| 人人摸人人搞| 高清不卡一区| 欧美色宗和激情| 国产免费一区二区三州老师F1……| 色10月婷婷视频| 久久99网| 久久天堂女人| 99re这里只有精品视频了| 婷婷五月花| 丁香五月自拍| 久99视频| 色婷婷久久综合| 熟女激情五月天| 丰满少妇乱A片无码| 天天干天天操天天爽| 99热欧美精品| 五月婷婷丁香六月| 五月婷婷综合影院| 99热在线观看| 亚洲午夜电影| 欧美精产国品一二三区| 色女人久久| 开心激情五月天网| av线电影| 99久久99视频| 九九黄色网| 五月丁香大相交| 丁香久久久| 久久区区一二三av| A1片久久久| 激情丁香五月天图片| 五月激情六月婷婷| 久9热视频| 婷婷五月天网| 久久免费9| 色婷婷成人| 综合狠狠伊人| 99在线精品免费视频| 日日操,日日爽| 丁香五月av| 婷婷免费成人视频| 香蕉视频性爱BB做爱| 五月丁香六月婷婷a v| 桃色五月天| 97色伦另类图片小说视频 | 99精品国产乱码久久久人妻| 婷婷五月天影视| 久久精品A片777777| 思思综合热| 老司机视频lsj爱就色| 色五婷婷| 六月丁香av| 大香蕉五月丁香| 九九热在线观看6| 玖玖色综合| 久久婷婷五月综合色播| 天堂网色婷婷| 噜噜视频| 午夜激情五月| 久久精品99久久久久久| 国产又爽又猛又粗的视频A片| 天天天添天天操| 精品自拍99| 五月综合视频| 在线视频色五月| 超碰v| 国产成人+亚洲+欧洲| 三级99热| 丁香六月天| 狠色色狠网| 色婷婷狠| 99热综合在线观看| 久久伊人五月天| 亚州婷婷五月激情综合| 玖玖婷婷五月天| 色婷婷综合中心| 人操人| 婷婷亚洲综合| 99免费热视频| 五月婷婷内射网| 操97在线观看| 五月婷久久| 五月丁香龟婷婷| 五月天综合久久| 国产精产国品一二三在观看| 久久久激情视频| 丁香六月 人妻| 亚洲色图日韩网址| 亚洲亚洲人成综合网络| 免费AV播放| 五月开心啪啪| 六月丁香视频网站| 久久狼人天堂| 免费啪啪啪网站| 日本欧美成人片AAAA| 五月丁香六月综合激情无码软件亮点| 五月激情婷婷开心五月| 99啪| 色哟哟性爱av| 亚洲一级 片内射网站在线观看| 五月激情啪啪啪| 激情5月天天天| 91美女被操| 日韩熟女啪啪视频| 亚洲欧美在线观看| 99精品在线观看| 99热9999| 日本婷婷在线| 99热亚洲| 性色天| 激情五月天色婷婷综合| 色小说婷婷五月天天天| 五月婷婷色| 亚洲婷婷久久综合| avv在线| 丁香久久在线| 亚洲国产精品VA在线看黑人| 噜噜在线| 婷婷激情五月| 婷婷丁香六月天| 天天色播| 夜夜干夜夜操| 色婷婷婷婷| 91丁香五月| 思思热视频| 骚货艹网站视频| 丁香五月激情站| 婷婷在线播放av| 色伊人婷婷| 大香蕉狠狠爱主页| 91婷婷色 | 五月丁香六月合| 香蕉婷婷色五月| 久综合网| 丁香五月婷婷深爱综合激情| 丁香五月网络网络| 丁香五月婷婷色五月| 激情色中文| 婷婷九月色| 久久草中文日韩欧美| 91热视频色网站| 五月天停停日日| 71在线精品视频一区| 一起草av在线观看| 亲子乱AV一区二区三区下载| 综合激情伊人影视在线| 婷婷丁香77777| 这里只有精品,日韩视频| 人妻综合网| 色人久久| 六月丁香深深爱| 青青福利网| 在线成人网站| 五月花免费视频| 欧美内射AA| 丁香五月天堂网| 天天干天天干天天| 日本成人内射| 九热免费视频| 久热这里这里有精品| 婷久看人爽| 99在线视频在线观看| 久久九九在线视频| 丁香色色网| 色频玖玖五月天| 夜夜操夜夜姧| 夜色综合网| 日本三级日本三级99| 亚洲九九视频| 97超碰99热99| 久久久这里都是精品| 另类图片激情五月天| 婷婷丁香五月天亚洲| 色99网站| 99综合| 超碰免费人人肏| av在线激情| 婷婷五月综合婷婷| 五月天六月婷婷| 五月婷婷中文| 久久综合55| 五月丁香精品| 26uuuuuuuu国产| 久久婷婷综合基地| 成人婷婷色综合| 婷婷久久免费| 69er小视频| 国产成人在线精品| 超碰人人妻| 人妻中文在线| 色婷婷综合网| 超碰97在线观看免费| 亚洲国产成人在线| 欧州色色| 免费观看全黄做爰的视频| 吊色AV男人的天堂| 天天搞天天色综合| 九九热经典视频在线观看| 九九久久99精品免费观看www| 亚洲V国产V欧美V久久久久久| 欧美精品A片一区在线观看| 99久久国产宗和精品1上映| 日韩AAAAAAAAAAA片| 99视频精品| 亚洲AV成人无码电影| 草操网| 婷婷色五月开心五月| 91中文狠狠综合| 、激情六月天| 五月婷婷天| 97婷婷狠狠久久综合9色| 色狠狠999综合网| 超碰91人人操| 婷婷五月大香蕉| 亚洲色情网站| 日韩aⅴ视频| 亚洲婷婷五月草久| 综合色播| 天天色·欧美| 啊v视频在线观看| 无码区婷婷五月花开| 欧美3AaAa大片| 国色天香成人网| 婷婷五月天最新综合你懂的 | 第四色在线观看| 五月丁香色色网| 欧美日韩成人高清在线| 久久九九99桃花视频| 激情综合婷婷久久| 亚洲五月色| 九九精品大香蕉| 五月丁香亚洲综合网| 国产99久久久国产精品免费看| 丁香激情网| 9久热在线视频精品| 久久婷婷草| 《蜘蛛女》梁铮1995| www.丁香黄色五月天人与| 日日干综合| 搡BBBB搡BBB搡18 | 六月婷婷国产| WWW、日本色丁香、co m| 五月婷视屏在线观看| 色婷婷亚洲综合av| 五月婷婷AV| 欧美图片丁香五月天| 久草狼人| 深爱激情中文五月天av| 国产乱子轮XXX农村| 99热www.| 综合在线观看99| 色久天| 日韩成人电影av| 永久的网站AAAA| 狠狠爱综合网| 99久久精品网| 久久久久婷 | 久久XX| 婷婷丁香77777| 九九av| 色色99色色| 色香蕉精品五夜婷| 亚洲 六月 综合| 99综合视频| 性爱在线播放av| 国产精品久久久久久久久久久久| 狠狠狠狠狠草| 5五月综合网亚洲| 丁香五月另类色婷婷麻豆| 五月天激情图片| 色五月超碰| 五月天久久久| 丁香网站| 综合色播| 成人色五月天婷婷| 色婷婷精| 人妻九九九九| 日本婷婷网| 久久婷婷的综合色丁香五月| 丁香五月综合| 337午夜福利| 色色婷婷丁香五月天| 日韩久久色| 激情五月天天| 丁香五月婷婷偷拍| oVV4WIB3vFi8D| 超碰A V在线| 狠狠爱婷婷丁香| 婷婷综合五月天激情| 天天日日| 久久99久久99久久99人受| 岛国av电影网站| 亚洲成人av在线播放| 一起草av| 开心激情站| 开心五月婷婷激情网| 9 9 9色色| 天天综合网站| 日本久久人| 婷婷丁香成人在线视频| 色九月婷婷综合| 久久在线视频免费观看| 伊人干综合| 丁香五月冃欧美| 欧美大香蕉视频| 99色在线观看视频者| 婷婷五月丁香综合| 五月丁香婷婷AV| 亚洲久久视频| 天天色丁香| 二区成人视频| 成人国产欧美大片一区| 综合激情视频| 99无码视频| 激情五月六月丁香| 综合丁香婷婷五月天| 色色色五月天激情资源| 青青久久五月| 午夜性做爰电影| 99久久99久久综合| 五月色综合| 亚洲丁香五月综合| 色婷婷丁香网| 五月婷婷偷拍| 99在线观看精品| 99碰碰碰| 婷婷情色五月| 99ER热精品视频| 99热综合| 九九热精品| 99综合一区| 五月色综合网欧美网| 丁香久久九九99| 九月色婷婷婷| 96丁香婷婷九月蜜桃综合久久| 91超碰人人操| 五月婷婷啪啪| 综合网天天| 四色99久久| 大香线蕉伊人| 色综合综合色| 激情四射网| 情趣视频66| 婷婷丁香五月天亚洲| 狠狠 婷婷| 激情婷婷人妻| 天天操天天操| 就爱射中文字幕资源网| 天天干天天操天天上| 97婷婷丁香五月天激情图片| 欧洲亚洲免费视频9| 婷婷五月情色| 五月婷婷深爱六月| 五月婷婷丁香网| 五月丁香六月婷婷综合网站| 五月六月播婷婷| 天天玩天天摸| 狠狠88综合久久久久噜噜噜| 天天日天天操天天干| 免费久久这里只有精品99| 婷婷五月丁香久久| 欧美色爱五月天| 女人被男人吃奶到高潮| 五月天婷婷色综合| 91狠狠综合久久久| 亚洲天堂婷婷| 一本九九色| 日韩久久日| 九九热在线视频观看免费10| 91日日日| 亚洲avjiujiur91| 亚洲五月天综合| 成人视频婷婷| 伊人狠狠丁香婷婷综合尤物| 久久九九99| 黄色国久久| 9伊人网| 日韩999| 另类激情五月| 99热骚货| 91人碰| 色综合久| 日本英国美国欧美亚洲国产精亚洲日韩精品在线观看 | 午夜一区| 五月天丁香看婷婷| 噜噜噜狠狠色综| 亚洲婷婷开心五月| 人人草人| 五月色综合| 色吊操色妞| 久久视这里只有精品| 色情激情五月| 9月色婷婷| 成人无码髙潮喷水A片| 五月丁香A∨在线| 99热在线爱| 婷婷五月深深爱| 久草五月| 久久3级片| 久久久人妻不卡| 婷婷五月天99| 99精色| 无语停婷丁香网| 超碰国产av| 亚洲熟妇AV综合网五月丁香伊人 | 26UUU欧美激情一区二区| 五月天激情小说婷婷| 亚洲热综合| 久久五月婷| 秋霞AV美国| 99区视频| 久99| www.综合久久| 日韩AAA| 婷婷黄色| 亚洲综合成人网站| 另类国产综合| www.狠狠操| 99热99极品观看| 欧美婷| 噜噜噜狠狠色综合| 亚洲小电影在线观看黄999| 性99网站| 99热在线观看| 激情五月天婷婷免费观看| 婷婷五月六月丁香| 免费在线观看av网站| 国产噜一噜天天噜| 九九av| 婷婷五月天午夜激情影院| 激情五月婷婷综合色播小说| 99精品在线| 99 热国产在| 婷婷五月丁香欧洲| 99热精品10| 999影院成人在线影院| 久久99久久99精品,久国产,久久精品免费,99久在线,久久久久国产精品免费网站,9 | 婷婷丁香六月天| 任你艹| 九月色婷婷综合| 亚洲殴洲精品Av在线| 99热这里只有精品23| 免费观看的av| 婷婷五月天AV网| 色域五月婷婷丁香| 婷婷综合精品| 99玖玖在线视频| 九九热99熟女| 天天色天天操天天射| 成人AV网站在线| 日韩精品二三区| 欧美日韩国产一二区| 五月婷婷色情| 亚洲综合视频八| 天天夜天天色天天| 97人人操人人拍| 亚洲综合五月天综合| 亚洲国产精品VA在线看黑人| 五月激情婷婷开心五月| 国产精品天天狠天天看| 狠狠久久婷五月综合色| 99热在线观看| 美国天天日天天操| 欧美日韩日韩成人| 99这里只有精品视频| 色99色| 日本久久性| 日本综合久久| 久久这里只精品| 婷婷热婷婷色| 欧美婷婷丁香社区在线播放| 99热成人在线观看| 停停六月 综合| 波多野结衣AV无码Porn| 久久精品五月天| 99热碰碰热| 狠狠爱综合网| 桃色五月天| 亚洲性爱日韩无码| 草榴成人影片| 婷婷97碰碰| 男女99免费视频| 中文字幕按摩做爰| 狠狠干综合网| 丁香五月激情网| 99ri在线视频| 丁香五月冃欧美| 九月色婷婷综合| 亚韩在线视频| 国产精品色色色色| 99热www| 九九热在线观看视频| 色婷婷丁香五月高清在线| 丁香色色五月| 99热精品中文字幕| 久久丁香五月综合六月激情红杏视频 | 江苏少妇性BBB搡BBB爽爽爽 | 一级二级色大片| 超碰在线99| 亚洲AV影片在线观看| 丁香六月久久| 热99视频精品| 一级无码作爱片| 天天干天天干天天干天天干天天干| 婷婷五月天在线综合导航| 97性高潮久久久| 日本色色网| 婷婷五月另类网站| 99热日本| 9久热在线精品| 丁香五月天啪啪| 开心婷婷五月天激情网| 久久久97| 人妻中文av| 色久天| 天天摸人人摸| 99丁香五月婷| 一操久久| 精品一二三区久久AAA片| 一区二区免费看| 激情亚洲婷婷六月| 99色在线视频| 超碰啪啪网| 色婷婷影院| 婷婷五月天成人| 午夜精品777| 亚洲啪啪视频| 啪啪五月综合| 97超碰免费超级在线观看| 97精品欧美91久久久久久久| 开心五月婷婷在线| 亚洲精品网站色视频| 97碰碰九九视频| 热久久这里只有精品| 性视频久久| 日日夜夜综合| 99色热视频| 日本精品在线噜噜噜| 亚洲色色五月天| 丁香六月丁香婷婷激情| 五月婷婷激情| 91色涩| 天天做天天爱天天玩| 久久成人天| 日操五月婷| 99操碰| 欧美色久| 97爱综合| 超碰精品国产首页| 骚逼视频一区2区| 成人中文网| 九月婷婷激情| 久久性刺激| 五月天综合网| 99热这里只有精品青草| 婷婷五月天精品| 日韩综合大黄| 热99精品视频| 久久99这里只有精品视频| 婷婷五月丁香六月伊人网| 操操天堂| 依人大香蕉| 色婷婷www| 99在线观看| 99人人干人人操| 五月天婷婷色综合| 亲子乱av一区二区三区的| 精品人妻在线免费观看| 伊人久久婷婷五月综合97色| 亚洲妇女熟BBW| 五月开心播播网| 国产亚洲精品久久久久久牛牛| 99精品偷自拍| 丁香六月激情| 婷婷香草网| 久久精彩视频| 思思re最新视频| 丁香99| 婷婷久久天堂网| 97色色综合| 五月婷婷亚洲| 天天搞夜夜爽夜夜爽| 91超级碰碰| 狠狠擼综合| 亚洲另类婷婷五月综合| www色中色综合| www.26uuu.com亚洲电影| 五月天婷婷视频| 97干免费视频| 国产精品色| 婷婷大香焦| 99热欲| 五月综合激情| 免费国产VA国产免费| 婷婷六月激情丁香| 久久色这里只有精品| 亚洲综合视频网| 五月天com| 久久er99热精品一区二区 | 五月婷婷这里都是精品| 国产乱妇乱子伦| 五月天色丁香| 五月丁香| 在线看的免费网站| 婷婷激情四射五月天| 99re视频在线播放| 26uuu亚洲欧美另类| 久热这里只有精品6| 激情图片婷婷| 五月综合激情| 在线免费观看激情视频| 97人人操人人干| 另类图片 五月激情| 久久激情五月婷婷| 婷婷91| 婷婷色综合中心站| 色欲婷婷五月天| 无码G高清天| 综合啪啪| 色情综合网| 午夜日韩久久久网站| 9九热视频| 这里只有精品免费观看网占| 五月天另类小说| 天天躁日日躁狠狠躁日日躁2022年5月9日 | 婷婷五月天在线看| 欧美色小说婷婷| 9久久久久久久久久久| 曰韩少妇内射免费播放| 九艹在线| 综合亚洲色色| www.99热| 极骚大香蕉伊人| 日本色99| 婷婷五月天电影区小说区| 狠狠色丁香| 亚洲av午夜精品一区二区| 天天爽天天日人人爱 | 色欲色天天香综合| 日日操日日爽| 婷婷色婷婷| 亚洲视频国产一区| 婷婷激情丁五月| 综合网色| 99久re热| 丁香五月Av| 免费无码毛片一区二区A片| 五月丁香操婷逼| 99国产小视频| 人妻熟女一区二区AV| 日韩九九视频| 天天做天天爱天天高潮| 9999热免费视频视频| 99惹在线精品免费观看| 9久久婷婷国产综合精品性色| 婷婷五月天天| 久久激情综合| 99热都是精品| www.97碰碰com| 九九久久网| 国产精品久久久久9999小说| 再綫Av免费視品| 婷婷久久久| 综合精品99| 色婷婷综合网站| 中文字幕网伦射乱中文| 色欲人妻综合aaaaaaaa网| 欧美激情五月天| www五月天com| 天天综合中文| 国产黄色在线观看| 婷婷五月天影视| 九九激情| 亚洲激情综合色站| 这里只有精彩视频| 99在线观看视频| 丁香伊人网| 日本 色综合| 五月婷综合| 国产婷婷久久| 日日插日日干| 狠狠狠狠青草| 看国产探花操逼三级片| 超91热| 99热这里只有精品最新网址| 五月美女婷婷风骚| www.丁香五月| www,99视频| 五月丁香六月婷婷的女人| 北条麻妃伊人 | 天天干狠狠操| 少妇人妻偷人精品无码视频新浪| 婷婷激情六月综合| 亚洲综合五月天婷婷丁香| 婷婷六月激情啪啪| 亚洲无AV在线中文字幕| 久久久五月激| 色婷婷色丁香色欲av| 色五狠狠| 色婷久| 九九re精品视频在线观看| 国产免费AV网站| 99色视频| 思思99精品视频在线观看| 9色91视频| 久久激情视频| 国产精品美女久久久久AV超清| 欧美五月丁香在线观看| 日日操夜夜擼| 九九热这里| 婷婷综合网| 五月天伊人| 华人在线免费| 日本三日本三级少妇三级66| 伊人婷婷大香蕉| 99热99ai| 色吧婷婷五月亚洲| 丁香婷婷成人网站| 美欧日韩国产成人在战| 噜噜在线| 色视频五月天| 五月婷婷啪啪啪| 一点色成人网| 婷婷丁香小说| 色色色色色色色色五月先| 八戒青柠影视剧在线观看| 婷婷五月精品中文字幕| 久久大香蕉视频| 五月天婷婷成人网| 97婷婷五月| 婷色五月| 91精品91久久久久77777| 亚洲丁香婷婷丁香五月天激情| 色情五月综合婷婷| 情欲禁地| 在线观看欧美| 人人操超踫| www.久久9| 桃色五月天| 俺去也婷婷| www。狠狠干。com| 婷婷99丁香| 精品一二三区久久AAA片| 涩涩涩五月天| 777久久精品| www,久久久人人| 天天色播| 五月丁香六月婷婷色日| 成人 在线 日韩| 五月天色小说| 武则天精品久久| 天天做 天天爱| 2021日韩无码| 99国产精品久久久久久久久久久 | 99热在线观看精品| 99亚州综合精品成人网| 插插插丁香五月婷婷| 天堂久久婷婷| 热99精品视频| 国产精品久久在线观看技巧| 中文字幕人妻AV| 九九在线精品| 五月丁香999| 天天插天天插天天插| 99视频精品视频| www婷婷| 在线亚洲综合| 成人无码精品1区2区3区免费看| 九九热精品| 丁香五月亚洲天堂| 538久久| 91尤物九色在线| 无码色综合| 91嫩草国产线观看亚洲一区二区| 99热日韩| 免费看欧美成人A片无码| 色五月激情五月丁香五月婷婷啪啪综合| 人妻少妇色综合| 亚洲综合另类| 久久久噜噜噜久久人妻| 婷婷深爱五月亚洲综合| 激情五月伊人婷婷| 日本va欧美va欧美va精品| 大香蕉伊在| 夜色.cnm| 婷婷五月天国产性感美女演员久久久久| 欧美色婷婷| 欧美日本黄色| 天堂综合久| 五月丁香婷婷AV| 日本va视频| 国产美女精品| 久久婷婷色丁香| 深爱婷婷基地| 人妻狠狠操| 五月丁香六月色婷婷综合五月天| 黄网在线观看免费| 99色在线观看视频| 精品人妻在线| 天天操精品| 九九中文字幕九| 伊人综合婷婷| 色色热日| 超碰99热在线观看| 黄色99热| 激情五月天色色色| 国产精品岛国片在线观看免费| 久色大香蕉| 欧美A片在线视频免费观看| seuuu婷婷| 丁香婷婷六月| 欧美五月婷婷综合| 国产精品黑丝| 性爱五月婷婷| 97操| 免费啪啪亚州视频| 亚洲AV网站| VA色婷婷| 婷婷五月丁香六月伊人网| 久热这里只有精品在线观看 | 久草xx性爱视频| 亚洲天堂aaa| 激情综合五月天| 五月丁香六月情| 日韩AAAAAAAAAAA片| av在线激情| 日韩成人免费电影| 婷婷激情四射| 欧美S码亚洲码精品M码| 九九色网专区| Y11111111111少妇电影院| 久久综合色五月| 九九亚洲视频| www色婷婷久久综合久色 | 亚洲五月婷婷| 午夜天天精品视频| 激情久久婷婷| 欧美大香蕉视频| 色五月激情问网站| 新精品99| 色播五月综合网| 97久久久| 日本久碰| 欧美性爱五月天| 婷婷六月婷婷| 天天色视频| 色色性爱视频| 97超碰免费超级在线观看| 4399精品一区二区| 五月天激情四射| 激情五月天网页| 狠狠狠狠狠狠色| www99在线观看视频| 亚洲乱码日产精品BD在线观看| 久久ri精品视频| 综合激情五月天| 日本九九热| 激情五月综合网最新| 色色99| 99久久新视频| 南京搡BBBB搡BBBB| 丁香午夜天| 婷婷色网| 玖玖激情五月天| caopeng97日韩| 天天舔天天摸| 亚洲国产精品VA在线看黑人| 亚洲操B视频| 思思热99er在线视频| 99热97| 搡BBBB搡BBB搡18| 69久久久| 国产精品久久在线观看技巧| 中文字幕 中文字幕明步| 久久婷五月天| 看逼中文字幕| 五月丁香综合伦理片| 大香蕉婷婷五月天| 男人大jjc女人免费视频| 新97人人上人人| 五月天狠狠网| 99人妻碰碰久久久禁片| 一本色道久久88加勒比—| 超碰AAAAAAV| 五月叮香啪| 特黄三级又爽又粗又大| 色99亚洲| 激情九月婷婷| 影音先锋偷偷色男人站| 深爱激情AV| 五月婷婷天| 美国不卡视频| 色五月成人| 先锋资源婷婷| 五月婷婷精品视频| 操嫩逼电影| 超碰久热| 五月天色色婷婷| 99久在线精品99re8| 婷婷丁香激情五月天色色色| 狠狠综合| 人妻激情综合| 影音先锋91资源站| 色婷婷激情视频| 亚洲亚洲人成综合网络| 五月天激情小说| 激情九月婷婷| 天堂五月婷婷| 五月天久久婷婷| 31色区视频免费看| 区区欧美你爱| 免费观看18视频网站| 性色欲情 网站| 色色丁香| 日韩操逼大片| 99人妻碰碰碰久久久久视| 3DAV亚洲香蕉久久 一区二区| 天天五月天综合网址| 天天插天天日天天爽| 亚洲综合色婷婷| 日韩啪啪网| 丁香五月色| 久操福利| 色婷婷免费观看| 婷婷综合精品| 婷婷天堂综合| 七七九色| 九九re精品视频在线观看| 五月天丁香婷| 91视频精品99| 91色吧网| 五月丁香婷婷综合久久| 粉嫩av蜜桃av蜜臀av| 久久久久9| 超碰在线免费| 丁香五月激情综合| 99色区| 另类在线|