免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

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
返回資訊列表
国产 亚洲 在线| 大香蕉啪啪网| 五月天婷五月天综合网小说首页-五月天激激婷婷大综合,婷婷亚洲综合五月天小说 | 国产色香蕉精品五夜婷| 丁香六月婷婷缴情欧美| 亚洲五月婷婷| 色婷婷97| 五月天婷婷基地综合网| 九九热在线99| 182tv992tv人之初午夜免费观看| 色婷婷五月综合| 亚洲婷婷免费| 这里只有精品免费观看网占| 亚洲丁香网| 久久99久久久久久| 91一起操| 乱码操操| 色五月婷婷久久| 欧美三级大片AA在线看| www.夜夜爱.com| 丁香五月香蕉| 天天爽天天干| 免费看欧美成人A片无码| 天天草天天爽| 七七九色| 色婷婷电影网| 99热这里只有精品22| 五月五婷婷| 婷婷综合五月天激情| www.婷婷,com| 九九精品综合| 91精品久久久久久| 噜噜噜噜噜在线| 日本视频欧美观看免费| 超碰无码318604| 99热亚洲只有色| 日本精品久久久久中文字幕| 色狠狠色噜噜AV天堂五区| 99精色| 天天色噜| 91色五月| 激情五月天色播| 大香网伊人久久综合| 激情久久久久久久久久久| 丁香婷婷伊人| 综合在线色婷婷| 99热的无码| 五月天综合区| 79精品视频在线观看,| 狠狠狠夜夜夜| 99精品热视频| 国外亚洲成AV人片在线观看| 五月刺激丁香月综合| 丁香五月婷婷av影院| 成人 在线观看国产| 午夜无码熟熟妇丰满人妻 | 九九视频这里只有精品| 久久婷婷亚洲| 六月丁香啪啪| 亚洲a片免费观看| 色涩视频久久| 99热在线资源| 亚洲俩性性爱图片久久第六页| 天天操夜夜夜夜爽| 久久丁香久久| 99热色精品| 色五月婷婷中文字幕| 国产欧美性成人精品午夜| 国产99久久久国产精品免费看| 成人做爰高潮A片免费视频| 狠狠爱综合网| 色婷亚洲五月丁香| 五月婷婷丁香伦理网| 开心五月婷婷激情网| 亚洲第一视频 久久| 五月婷婷之综合激情| 丁香五月中文字幕色播| 国产精品人成A片一区二区| 亚洲视频在线网站| 丁香五月综合| 天天色综网| 狠狠操狠狠操| 麻豆AV一区二区三区| 色播激情| 亚洲另类婷婷五月丁香在线播放| 色五月婷婷在线观看| 91色五月| 久久网婷婷| 另类激情四射| 91大屁股| 天天操夜夜操| 99碰超| 99热日本| 五月丁香啪啪网| 无码 av电影| 五月深情久久| 影音先锋 91工厂| 色导航色婷婷五月天在线观看| 久久婷婷视频| 久99热在线观看| 九九热在线亚洲免费视频| 五月天婷婷青青| AV人人操| 操婷婷久久| 97碰在线| 久久人视频| 亚洲激情视频在线观看| 日日撸夜夜操| 丁香五月天堂亚洲社区| 色婷五月丁香久亚洲| 123草逼网| 国产精品久久久爽爽爽麻豆色哟哟| 99热久久日本| 婷婷五月天激情基地| 五月婷婷久久综合| 亭亭色色五月天| 五月开心深爱激情网| 天天射影院| 九九激情视频| 99热.com| 亚洲人人操| 五月社区婷婷激情| 亚洲日本韩国| 婷婷五月永远18免费久久久| 精品一二三区久久AAA片| 九热精品| 99久久9| 97成人在线视频精品| 日本成人噜噜噜噜噜| 久久综合五月天| 丁香综合久久| 综合99综合久久久久久久| 日韩AAA| 久久九色| 日本五月丁香| 中文字幕丰满孑伦无码专区| 天天综合天天玩夜夜玩天天玩夜夜玩| 无码免费人妻A片AAA毛片西瓜| 91色久| 欧美天堂久久| 99在线观看视频免费| WWW,五月| 久久性爱视频| 婷婷九月色| 欧美三级欧美一级| 青青草成人网| 婷婷五月天激情视频| 99精品在线观看| 99视频色在线观看| 日韩精品视频中文字幕| 久热网站| 123草逼网| 91碰超| 日本一毛片| 这里只有精品久久| 九九久久99| 99re思思久久| 丁香欧美| 天天操加勒比| 五月天婷婷色在线视频免费观看| 欧美99| 欧美日韓成人亚洲精品另类| 久久XX日本综合| 丁香综合网| 九九九九九九热| 激情五月天伊人影院| 久久九九99.www| 99er热精品视频| 色欧美日| 久久婷婷伊人| 五月婷婷激情综合网 | 生活片五区| 婷婷五月香蕉| 深爱丁香激情| 一区二区乱码视频| 久久久久亚洲AV综合| 第四色26uuu| 在线综合91| 色五月成人| 五月丁香激情啪啪网| 人人操人人爱丁香五月| 综合色影| 婷婷99视频在线| 婷婷五月天小说网| 国产中文亚洲欧美日韩性交| 4399在线观看免费高清毛片| 亭亭丁香aV| 国产精产国品一二三在观看| 五月天丁香综合久久国产| 9色在线视频| 色99在线| 色婷婷五月综合| 97碰碰人人| 国产成人一区二区三区在线观看| 夜夜操狠狠操| 五月丁香六月婷婷手机无线| 这里有精品99| 操日视频| 五月婷婷综合色啪首页| 九月色婷婷| 久久精彩免费视频| 亚洲色综久久五月| 欧美狠狠一在草| 天天视频精品9| 日本精品99| 日 日干 日日做| 色射7856五月天激情四射| www久| 婷婷丁香五月天小说| 色色色综合色| 丁香五月天天| 国产精品黑丝| 99热个人在线| 三男玩一女三A片| 深爱五月天| 色综合五月在线| 五月丁香好婷婷A片网| 五月天丁香色色| 久久五月天婷婷| 激情五月天天| 黄桃AV无码免费一区二区三区| 开心激情婷婷| 久久五月丁香| 日本成人噜噜噜| 丁香五月婷婷六月婷| 久久99视频| 色色色色色色色色色色色色色五月天 | 色五月综合网站| 色色a| 天天操电影院色狼性av| 99re在线这里只有精品视频首页| 69er小视频| 婷婷色在线观看| 久久婷婷五| 亚洲精品无码99热| 日韩人妻白浆视频系列| 综合色色五月| 丁香五月天AV在线| 97人人妻人人艹| 国产毛片精品一区二区色欲黄A片| 狼人婷婷久久| 99热精品在线播放| 久久婷婷视频| 国自产拍偷拍精品啪啪一区二区| 色色色热| 怎么样可以看免费的一级av| 色婷婷五月综合激情中文字幕| 在线观看熟女少妇| 亚洲日本激情| 五月天a婷婷伊人| 丁香五月综合色婷婷| 综合久久婷婷| 五月丁香六月欧美综合| 婷婷丁香午夜综合影视| 夜夜操夜夜姧| 天天干天天爽天天操| 天天操夜夜爽| 色综合色| 亚州色色色| 九九av| 色五月婷婷av| 亚洲无码色| 久热91| 欧美性色A片免费免费观看的| 五月婷婷综合网| 婷婷久久网| 色五月五月婷婷| 激情五月天婷婷五月天| 一区二区三区四日本| 91色色五月天| av操一操| 五月6香色婷婷视频| www.99久久久| 伊人国产婷婷五月天| 99热精这里只有精品| 五月丁香六月婷婷综合网| 国产高清av黄色看片| 免费视频在线观看的网站| 风流少妇A片一区二区蜜桃| 国产人妻人伦精品一区二区| 色婷狠狠| 婷婷丁香人妻天久久| Av狠狠色丁香婷| 99热精品10| 五月婷伊人| 激情激情激情网| 四色AVwww| 狠狠色五月天| 国产午夜精品一区二区三区嫩草| 婷香狠狠爱五月| 亚洲成人网站在线播放| 最新激情五月天| 色情五月天A片| 天天插天天射| 久久精品99国产精品日本| 黄色AAAA韩国guochansanji| 97色干| 五月丁香六月婷婷综合网| 婷婷五月天激情丁香| 伊人久久大香线蕉av最新| 婷婷爱五月| 91精选国| 九九视频这里只有精品在线播放 | 四月婷婷五月色综合| 嫩BBB槡BBBB搡BBBB视频| 亚洲精品大片| 少妇高潮呻吟A片免费看软件| 人人97操| 激情婷婷另类| 色99在线| 日本一级特黄大片AAAAA级| 亚洲色情一区二区三区四区| 日本综合色色| 国产精品成人网站| 日韩激情人伦人| 色呦呦美女| 亚洲综合五月天综合| 91婷婷色 | 能看的av| 亚洲色色色色色色色色色| 91精品国产综合久久密臀| 五月婷婷成人| 伊人久久大香线蕉亚洲五月天,| 久久久久久激情| 欧美α√| 五月丁香久久久| 五月色综合| 几激情五月婷婷色五月色天堂| 五月激情小说| 丁香婷婷大香蕉| 五月婷婷综合在线视频小说| 99在线视频操999| 婷婷五月天AV| 久久九九网| 五月黄色婷婷| 99色 色| 99在线精品免费视频| 亚洲网视屏| 婷婷丁香五月色| 色欲色欲久久宗合网| 激情婷婷丁香五月天小说| 婷婷五月天天爽| 亚洲无码性爱| 五月婷婷丁香在线| 亚洲成人精品三区| 激情婷婷22月间| 五月 丁香 欧美| 99亚洲视频| 婷婷五月天丁香花| 五月天色影院| 丁香婷婷五月天色综合| 777精品久无码人妻蜜桃| 日韩黄黄| 六月丁香网| 99国产小视频2013| 伊人久久婷婷| 五月婷婷色丁香| 丁香六月啪| 另类激情五月天。| www.婷婷六月天| 丁香五月大香蕉| 色婷婷电影网| 五月综合激情图片 | 色综合久久综合中文综合网| 色色色免费视频| www,五月天com| 久久丁香| 婷婷爱综合| 中国女人做爰A片| 99精品视频在线6| 91超级碰碰碰| 色色色欧美色色| 99热香港| 婷婷内射视频在线| 人人干天天舔| 1024国产在线| 另类 在线| 婷婷综合激情| 五月天婷婷丁香蜜桃91| 91人人看| 99久久6| 狠狠擼综合| 五月J香蕉婷婷| 深爱1激情网| 免费99色| www.五月丁香| 天天爽夜夜爽夜爽精品| 国产精品国产| 久久性视频| 丁香五月久久综合| 182TV亚洲| 五月丁香六月在线| 99综合激情久久精品久久| 伊人激情网| 女同激情久久av久久| 人人干天天舔| 99热99| 国产无套精品一区二区| 九九热国产| 97香蕉久久超级碰碰高清版| 九八Av| 久久机热/这里只有精品| 97干免费视频| 色婷婷AV久久| 五月天社区| 99精品免费欧美小视频| 久久无码激情视频| 综合激情肏逼网| 爱射综合| 婷婷六月激情| 久久激情五月天| 91久久99久久91熟女精品| 婷婷综合在线| 人妻激情在线| 五月天婷婷丁香社区| 色婷精品91| 色色丁香婷婷五月天| 色999;丁香五月| 色婷五月| 888精品福利地址| 色色色天堂网| 夜色五月天| 久色网| 亚洲六月色| 五月丁了香蕉综合| 亚洲成人在线免费| 色99无码| 99在线免费视频播放| 99热在线只有精品| 久久激情五月婷婷| 五月婷婷中文字幕| 天天操夜夜爱| 开心五月综合激情综合五月| 26uuu.| 九九99精品视频| 婷婷五月综合中文字幕| 九九综合九| 丁香五月天激情视频| 思思久久精品| 五月天涩涩| 日在线V视频在线播放| 操一区| 婷婷欧美激情| 婷婷天堂视频| 超碰9在| 黄色网址五月婷婷| 亚洲九九99精品视频在线播放| 大香蕉啪啪啪| 九九99久久| 国产精品日日躁夜夜躁| 国产美女视频久| 国产精品久久7777777精品无码| 亚洲激情图文小说| 79精品在线视频| 激情深爱五月婷婷| 丁香六月婷婷五月天| 色啪影院| 亚洲激情综合色站| 久一这里有精品国产| 五月婷婷干干干| 天天色丁香| 色婷婷19| 五月婷婷激情综合在线| 天天色一道本综合婷婷| 99在线观看视频蜜臀| 色综久久AV| 久久久久久xxxxx| 五月天婷五月天综合网小说首页-五月天激激婷婷大综合,婷婷亚洲综合五月天小说 | 激情五月丁香五月综合| 婷婷五月天av小说| 婷婷五月天首页激情| 久久玖玖99| 婷婷干六月综合旧址| 九九中文色色| 婷婷精品综合| 久久er免费视频| 99久久99视频只有精品| 五月激激网w'w'w| 日本美女天天日天天爽| 婷婷五月伦理| 天天做天天爽| 九月丁香婷婷| 91无码一区人妻A片蜜| 91夫妻网站九色| 婷婷九九色| 日韩无码人妻一区二区| 婷婷久久五月| 襙逼网| 日本VA视频| 丁香婷婷激情六月五月开心| 狠狠色噜噜狠狠狠狠综合| 亚洲九区| 婷婷丁香先锋资源网站| 久操热| 天天操夜夜夜夜爽| 日本社区五月天激情| 五月婷婷激情综合| 女人高潮内射99精品| 五月婷无码| 五月天久久综合| 色噜噜,噜噜色| 五月丁香亚洲婷婷| 亚洲综合五月天婷婷| 亚洲情综合五月天| 日韩成人AV在线播放| 26UUU一区二区| 婷婷丁香五月综合激情小说| 五月婷婷啪| 国产精品18久久久| 欧美色久| 中文字幕婷婷五月天在线观看| 天天肏高清在线| 五月天精品| 超碰在线94| 《诡秘之主》在线观看| 五月丁香成人视频| 粉嫩AV久久一区二区三区| 另类图片五月激情| 99er免费在线观看| 色婷操逼| 色综啪啪啪啪啪啪| xx色综合| 色婷婷色99国产综合精品| 成人在线二区| 丁香五月天激情网址| 天天做天天摸| 农村熟妇高潮精品A片| 人妻激情视频| 婷婷五月天首页| 婷婷色色五月天| 吾爱AV导航| 色丁香综合影院| 国产操碰| 操逼六区| 99热都是精品| 成人五月天。COM| 很很操96| 九九久久99| 日本九九九九九九| 激情久久综合网| 五月天婷婷色| 操操啪| 久久这里只有精品99| 成人中文网| 婷婷丁香69精华| 夜夜爱伊人| 97婷婷丁香五月综合| 五月丁综合在线观看| 五月丁香激情啪啪| 97香蕉久久超级碰碰高清版 | 五月婷婷综合视频| 日韩成人电影Av| 色婷婷狠狠干芒果TV| 日日做A爰片久久毛片A片英语| 色情五月综合婷婷| 91成人品| 色色色五月婷婷| 99熟女啪啪视频| 五月婷婷亚洲色图| 99这里有精品视频| 色欲九区| 91久久99久久91熟女精品| 伊人色五月| 五月丁香在线观看| 超碰在线99热| 五月丁香久久久久| a网站免费观看| 天天色播| 狠狠色狠狠干| 色婷婷成人做爰A片免费看网站| 啪啪一区| 人妻久久久久| 日韩操人| 米奇影视资源婷婷狠狠色激情欧美五月丁香 | 91婷婷色 | 五月天婷婷綜合院| 丁香五月欧美激情| 五月婷婷激情综合| 五月婷婷m| 久色精品| 激情五月天小说|五月天开心激情网|亚洲精品国产自在现线|黄色五月天 | 丁香五月天堂| 欧美精产国品一二三区| 午夜免费试看| 色五月婷婷中文字幕在线观看| 五月丁香成人版| 久久桃花网色婷婷| 色五月在线观看| se.久久视频在线观看| 亚洲人成色A777777在线观看 | 伊人狠狠综合| 77777亚洲午夜久久| 97精品在线| 五月天亚洲图片婷婷| 五月天综合网| 色婷五月天激情| 超碰97免费在线| 能直接看的av网站| 婷婷激情网五月天| 成人网站免费在线播放| 久久精品99国产精品日本| 人人视频色| 人人性久久| 激情五月天色播| 成年人99热| 色色九九五月天 | 成人丁香婷婷| wWwCom夜操wwW| 激情都市另类| 久综合色| 99热精品一| 五月天婷婷基地综合网| 荡乳尤物3HP1V5| 天天爱夜夜爽| 久久99热这里只有精品23| 五月做爱| 婷婷五月天基地| 丁香五月婷婷色| 色色五月丁香| 日韩精品VIP| 四色五月婷婷| 婷婷五月天狠狠色| 亚洲久久婷婷丁香五月天| 五月丁香综合中文| 五月天社区婷婷| 久久女人天堂| 九九在线这里只有精品视频| 欧日美女Va| 伊人久热91| 国产欧美日韩综合精品一区二区| 五月天婷综合| 深爱五月日韩| 五月色情网| 欧美综合123区| 激情综合五月丁香六月婷婷| 五月丁香激情综合网| 亚洲五月停停| 能直接看的AV网站| 色综合天天网| www久久久| 超碰人人操| 伊人狼人干| 色五月激情网| 26uuu精品国产| 天天综合色| 五月天婷a| 婷婷的五月天另类视频| 男人的天堂999| 亚洲黄色精品| 91艹人| 伊人超碰在线| 色婷婷综合久久| 亚洲高清在线| www.天天日| 亚洲激情综合网| 99热这里有精品| 亚洲五月天婷婷在线| 99热这只有| 婷婷色色狠狠| 99亚洲综合| 全亚洲最大的婷婷五月天网站COM| 激情五月综合久久| av无码电影| 五月婷婷精品| 久久一级片| 日韩五月婷婷| 性色av大香综合| 嫩草国产| Av九九| 久久精典| 六月丁香婷婷色狠狠久久| 九九热AV| 激情五月天噢美| 丁香五月在线视频| 色的色综合| 婷婷五月天激情偷拍| 五月天婷婷无码| 婷婷基地爱| 婷婷丁香人妻天天爽| 97五月天| 婷婷香草网| 曰本久久女| 亚洲视频在线网| 91精品国产色猫| 性色av大香综合| 久久久99视频| 99这里有精品久久97| 五月天综合缴情网网站0| 日本www五月婷婷| 色高清无码视频| 五月婷婷综合在线观看| 99热天堂| 丁香五月激情五月| 琪琪色网在线| 97婷婷在线视频| 日日噜噜夜夜狠狠久久丁香六月| 少妇丁香婷婷| 久久久久人无码人妻| 丁香六月婷婷激情| 久9精品视频| www.婷婷| 超碰啪啪网| 99狠狠色| 6月丁香婷婷激情| 色丁香影院| 一本色道久久88加勒比—| 日韩成人av在线| 五月深爱婷婷| 五月丁香激情综合网| 在线观看的av| 天天色天天操天天射| 性爱激情小说AV五月丁香花| 五月丁欧美| 婷婷五月噜噜| 婷婷五月天激情四射| 超碰狠狠干99| 久久刺激网| 五月天激情Av| 99热在线精品播放| 欧美婷婷丁香社区在线播放| 99久久精品色老| 天天添天天摸天天天天做| www.99热在线| 综合色色五月| 久热99| 人草人人| 狠狠色综合网| 色狠狠色综合久久久绯色AⅤ影视| 亚洲AV激情五月综合网| 97碰人人操| 久久97久久99久久综合欧美| 婷婷精品在线| 舔色婷婷| 色婷青青| 色欲婷婷夜夜| 欧美色久| 丁香九月综合在线| 天天干天天操天天干天天操天天干天天操 | 五月天婷婷丁香成人网| 婷婷性爱| 午夜爱爱网站| 久久亭亭电影| 九九热视频免费观看| 97色婷婷成人综合在线观看| 69人人操人人爽| 男人综合网| 色色网站| 精典久久| 婷婷中文字幕| 超碰激情五月| 婷婷五月综合激情免费视频| 五月香蕉婷婷| 久久人人妻| 琪琪色五月天| 久9精品视频| 亚洲色综合色网| www,婷婷五月天,com| 91狠狠综合久久久久久| 91操熟女| 亚洲中文字幕AV| 91chinese 在线| 思思re99视频在线观看| 色色999三级片| 天插天啪天啪天啪| 欧美在线| 天天色伊人| 婷婷五月丁香五月| 五月天快乐开心激情网| 日本久久天堂| 成人精品一区二区三区四区五区| 五月婷婷天| 婷婷丁香五另类网站| 亚洲在线操| 超碰com| 色色色婷婷五月天| 亚洲乱码在线观看| 九色自拍| 狠狠色色| 五月天婷婷基地| 另类五月婷婷| 五月婷婷六月天| 色婷婷综合五月| 情欲禁地| 婷婷丁香五月亚洲综合网在线视频观看| 9色91视频| 久久66精品| 97自拍视频网| www.操.com| 玖玖婷婷综合| 五月天狠狠| 深爱激情九九五月天 | 伊人五月久久| 五月 婷 久| 色综合另类| 第五婷婷伊人丁香色| 97干在线| 五月天久久婷婷婷| 丁香婷婷浪潮AV久久综合| 日本五月婷婷| 九色自拍| 国外亚洲成AV人片在线观看| 99亚洲色| 九九色之九九色88| 五月婷婷激情综合| 激情婷婷狠狠干| 4438全国最大视频成人网站在线观看| 色五月综合资源推荐| 日韩成人中文字幕| 性一交一乱一交A片久| www色五月天| 97干视频在线| 成人看片网站| 热思思| 五月丁香免费视频| 亚洲精品白浆高清久久久久久| 婷婷五月天综合色| 激情综合网五月丁香| 天天干天天爽| 玖玖资源在线视频| 天天做天天爱高潮片| 九九婷婷五月天| 九九青草热| 天天做天天爰天天爽天天无遮挡| 婷婷五月成人社区| 国产激情久久| 99青青草| 色五月激情视频在线综合| 精品久久久中文字幕大豆网推荐理由| 九九亚洲| 亚洲AAA| 亚洲小电影在线观看黄999| 欧美三级A做爰在线观看| 玖玖精品视频| 婷婷五六月丁香| 色五月婷婷伊人| 婷婷色色网| 天天做天天爱天天爽| 激情99。| 五月丁香啪啪啪啪| 无语停婷丁香网| 色99视频| 国产免费一区二区三区三州老师F1F1.CC| 丁香六月天AV| 成人av在线网址| 婷婷丁香综合网| 青草激情综合| av狠狠操| 五月激情丁香| 色情五月丁香婷婷网| 五月婷婷综合影院| 色色婷婷综合| 婷婷五月天综合网| 五月丁香婷婷久久| 99这里只有精品|v| 五月丁香色狠狠干大屄| 婷婷伊人綜合中文字幕| 亚洲无码www| 久久五月婷综合| 激情网五月天| 色色色综合色| 久久激情五月婷婷| 日本成人噜噜噜| 色婷婷在线视频综合| 99re思思在线视频| 日韩影院三级| 99热综合色图| 久久久久久久久久久月丁| 丁香五月大香蕉在线99| 九九热在线精品视频| 久久这里都是精品| 亚洲在线操| 色五月婷婷网| 婷婷激情综合| 夜夜躁爽日日| 熟女激情五月天| 另类综合婷婷五月天欧美视频| 五月天色综合服务平台| 狠狠色性| 婷婷五月欧美综合| AV天堂淫乩| 国内婷婷丁香社区在线播放| 亚洲精品色色| 六月丁香婷婷视频综合在线观看| 婷婷五月天久久久| 激情文学久久| 99re这里只有精品99| 91色久| 另类天堂| 伍月婷丁香婷| 久久这里只有精品07 | 激情床戏| 操操碰| 只有精品视频在线观看| 思思久久网| 婷丁五月| 99爱免费在线观看| 啪啪干伊人婷婷| 色情一区二区播放| 啪啪亚洲综合| 人妻少妇色综合| 激情爱爱网站| 开心深爱激情网| 97人人射| 九九热123| 牛牛色av| 五月天色色婷婷| 婷婷久久亚洲| 美妞av| 99热99这里免费的精品| 99热官网精品在线| 色婷婷9| 久99久视频| 国产视频色色色色色色色 | 色丁香五月婷婷| 色欲Av五月天| 中文字幕性爱丰满| 69色婷婷| 色色色热| 激情综合网激情五月俺也去| 伊人五月天久久| 啊v视频在线观看| 日日色五月天| 色停停五月天| 激情视频网址| 精品久久久久成人码免费动漫| 1024成人免费看| 91狠狠色色丁香婷婷综合久久| 亚洲国产婷婷色五月| 日韩成人精品一区久久久久| 色婷婷社区| 99色色网| 久久婷婷五月天大香蕉| 国产综合81p| 婷婷五月丁香六月伊人网| 亚洲激情综合五月婷婷啪啪| 另类激情五月在线视频欧美| 色婷久久| 久久色午夜在线导航| 国产亚洲99久久精品| 五月天激情.com| 超碰com| 国产毛片精品一区二区色欲黄A片| 婷婷婷五月香蕉| 激情文学 综合 色| 另类综合婷婷五月天欧美视频| 中文字幕在线播放视频| 综合色图婷婷| 婷婷丁香成人| 97婷婷五月| 这里只有精品免费视频| 啪啪操网| 五月丁香色色综合| 99色热视频在线| 国产乱子轮XXX农村| 婷婷综合一二三| 伊人在线婷婷草| 国产97色在线| 亚洲久久天堂| 天天综合情| 五日激情综合| 激情五月黄色| 天天做天天要天天爱| 综合激情视频| 欧洲电影在线观看免费版英语版| 亚洲色图45p| 五月激情网站| 韩国真做片在线观看| WWW.99视频| 天天五月情| 国产精品久久久久久久久久| 欧美天堂久久| 亚洲99热| 丁香六月天婷婷色| 激情五月天在线观看色婷婷| 中文字幕成人影视| 九九伦子片| 亚洲AV激情五月综合网| 色五月激情网| 91人人澡人人爽人人看| 亚洲天码视频www蛋播视频| 亚洲亚洲人成综合网络| 久久香蕉影院| 五月天丁香综合久久国产| 亚洲视频码| 五月天激情网页| 中文字幕人成乱码在线观看| 丁香五月性爱| 婷婷射丁香| a在线免费v| 天天干夜夜想| 色婷婷久久9.com| 99aese| 欧美大片免费播放器| 狠狠色噜噜狠狠色噜噜噜999| 9久久婷婷国产综合精品性色| 美女91一起草| 99这里只有精品视频| 26uuu成人网| 激情五月婷婷在线| 久久九九激情五月天 | 91久久网站| 天天成人丁香美女AV| 熟妇无码乱子成人精品| 九九九九九无码| 香蕉AV福利精品导航| 美妞av| 激情综合五月| 天天爽,天天操。| 激情五月天丁香| 色99亚洲| 欧美69久成人做爰视频| 久久五月婷综合网| 亚洲网综合在线| 丁香五月,激情五月,深爱五月| 久久性爱99国产| 五月综合激情视频| 婷久久高清| 五月婷婷综合久久| 六月婷婷视频| 久久人人九九| 看婷婷五月天网| 亚洲爆乳无码精品AAA片蜜桃| 激情婷婷五六月天| 刘玥av在线| 四色五月婷婷在线观看| 色婷婷AⅤ| 天天久久狠狠色综合| 九九日本视频| 青草视频在线播放| 久久久久人妻精选| 99色在线观看视频| 99在线观看| 色婷婷婷综合五月天| 狠狠ri| 伊人在线视频| AV九九| 国产精品久久久久久久久久| 天天操夜夜爱| 97色在线观看视频| 俺去也婷婷| 亚洲性图一区二区| 99精品女人天堂| 99精品亚洲| 五月婷婷干| 伊人久久综合| 这里只有精品2| 天天操天天日天天爽| www99xxxx五月丁| 综合大香蕉| 5月婷婷性视频| 色色色五月| 天天狠天天叉| 五月天基地| 丁香五月色五月| 风流少妇A片一区二区蜜桃 | 怎么样可以看免费的一级av| 丁香五月六月综合激情| 久久99久久99久久99人受| 五月激香蕉网| 亚洲成人网在线观看| 天天操天天操| 92国产福利| 亚洲国产精品VA在线看黑人| 激情丁香五月婷婷| 99re热| 91久久久久久久久久| 五月激情综合网| 淑女丝袜bi操逼123| 久久这里这里有精品免费视频| 久久综合五月天激情小说网站 | 丁香五月电影| 中文字幕婷婷五月天在线观看| 人人97碰| 996re热精品视频| 久久99网| 激情文学五月丁香六月婷婷| 国语对白性爱视频播放| 天天操五月天| 久久caop| 亚洲激情五月天| 狠狠xx| 五月深爱婷婷| 色五月婷婷基地| 丁香五月婷婷香| 色五月亚洲| 激情啪啪五月| 97丁香五月| 欧美激情五月天在线观看| 亚洲 视频 导航 一区| 婷婷丁香五月社区亚洲| 亚洲五月婷婷| 日本一级特黄大片AAAAA级| 我要射综合| 久热这里这里有精品| 99热综合网| 丁香五月九九| 教师性爱毛片| 乱岳熟女50岁| 日韩视频99| 激情久久久久久久久久久| 婷婷丁香激情五月天色色| 蜜臀A∨在线水帘洞| 中文无码婷婷| 丁香五月婷婷天堂大香蕉| 丁香婷婷五月激情四射网| 99久久国产宗和精品1上映| 99久久99九九九99九他书对| 亚洲操B| 激情五月天www| 激情丰满熟妇五月| 天天日日人| 丁香综合婷婷开心激情网| 九九婷婷综合| 五月丁香综合中文| 免费超碰在线| se婷97| 北条麻妃伊人| 亚洲人操亚洲人| 婷婷视频在线| 青草视频在线观看视频| 五月丁香啪啪啪| 久热婷婷| 97人人操人人干| 亚洲久热| 在线只有精品| 丁香五月天堂网| 九九热精品| 五月香婷婷| 99在线精品免费视频| 丁香六月婷婷| 亚洲亚洲人成综合网络| 狠狠精品干练久久久无码中文字幕| 五月色综合| 五月激情综合网| 五月丁香综合| 成人做爰高潮A片免费视频 | 五月婷婷网站| 久综合| www99精品亚| 五月丁香久久久| 99re8热精品免费视频| 色五月天婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷 | 99在线精品视频观看免费下载| 天天做天天爱天天爽夜夜揉| 久久这里只有国产| 安息电影在线观看完整版| 综合逼五月激情婷婷| 天天干天天操天天干天天操天天干天天操| 多精窝99在线视频| 五月天婷婷色小说| 色色综合色| 99免费在线视频| 亚洲中文字幕网| 亚洲超碰在线| 性爱网五月婷婷| 色97啪啪| 色五月婷婷av| 激情五月第四色| 久久996re热这里只有精品无码| 精品三区影院| 日日夜夜狠狠| 人人操五月天| 亚洲深喉aV| 亚洲精品成人片在线播| 五月 成人 婷婷| 五月伊人综合| 思思久日精品视频| 停停五月色宗合| 欧美性爱五月天| 一本色道久久88加勒比| 51XX嘿嘿午夜无码| 九九精品99| 怡红院院久久| 中文av网站| www.激情五月| 天天综合网~91| 久久婷婷五月天激情四射| 亚洲丁香五月综合| 这里只有精品2| 大香蕉520| 婷婷在线日韩综合| 色婷婷六月天| 五月婷婷m| www.日本91| 人人操AV| 97久久久免费福利网址| 综合丁香婷婷五月天| 这里只有精品免费观看网占| 激情五月丁香五月| 97爱艹婷婷开心丁香激情综合| 五月天婷婷情色| www婷婷亚洲| 丁香婷婷91在线观看视频| 图片区 小说区 区 亚洲五月| 日韩精品无码AV| 五月天国产成人| 夜夜撸日日操| 无码AV久久久久久久久| 久久久久久久久久久97| 丁香成人综合| 婷婷九月激情| 琪琪狠狠干| 丁香五月天天哦| 六月丁香五月婷婷| 九九99九九精品免费| 7777激情基地| 久久久久久性爱视频| 伊人综合网站| 婷婷的99视频网站| 亚洲色情网站| 国产精品国产成人国产三级| 六月撸婷婷| 五月天深爱激情网| 91久久婷婷| 99热这里| 五月丁香激情综合网| 91无码色色| 五月婷婷与六月丁香图片激情| 五月婷婷激情综合av| 久婷婷视平| 蜜臀av无码久久久久久久久| 91碰| 久草九九| 色婷五月天激情| 99婷婷精品推荐在线视频| 欧美日本VA| 亚洲乱码在线观看| 国产免费一区二区三州老师F1F1……| 日日射天天射| 99热成人| 丁香五月婷婷深爱综合激情 | 97人人操人人干| 色婷婷在线播放| 超碰人人99| 无码一级片| 久热A| 久久大香蕉丁香| 日韩婷婷五月天| 丁香五月激情网| 欧日美女Va| 丁香五月天综合| 亚洲成人综合在线| 午夜成人AV在线| 婷婷内射视频在线| 丁香五月天电影| 人人草碰| 久久婷婷综合五月趴| 99热香港| 综合网五月天123| 亚洲午夜在线视频| 三级成人网站| 《亚洲操B久久免费在线观看,亚洲操B久久在线播放》在线播放 - 高清资源 - 97 | 九九碰九九爱97超碰| 精品成人在线观看| 色九亚洲| 激情性爱五月天| 色啪网| 婷婷五月天国产精品| www.99视频| 99热热九九| 伊人无码高清| 欧爱综合视频| 色五月综合激情网| 亚洲色色香蕉| 丁香六月婷婷社区| 久久香蕉丁香|