思路分析:
一、制作一個地圖
二、地圖中放置牆、箱子、人、目標等
三、讓小人動起來完成推箱子動作
游戲制作:
1、按照上述地圖制作一個地圖 (12行×13列)
地圖可以看做是行和列組成的,即可以看做是由二維數組組成的
2、實體化:將0轉換為空格,1轉換為黑色方塊
3、設置箱子、人、目標點
4、先讓小人動起來,實現小人向上移動,因為坐標的交換,所以箱子向下移動了,同理,改變坐標可以實現向左、向下、向右移動
向下移動:y+1;向左移動:x-1;向右移動:x+1;
5、實現推箱子,以向上移動為例,其他方向移動只需要改變坐標即可
(1)判斷小人前進方向的下一個坐標如果是空地,則下一個坐標值=3(小人),小人現在位置的值=0(空地),實現移動
(2)判斷小人前進方向的下一個坐標如果是牆,則continue跳過此次循環,即小人不動
(3)判斷小人前進方向的下一個坐標如果是箱子,則:
a、箱子的下一個坐標如果是牆或者是箱子(未到達目標的箱子“□”或者是到達目標位置的箱子“★”,即值=2或值=5),則continue跳過此次循環,即小人和箱子不動
b、箱子的下一個坐標如果是空地,則箱子的下一個坐標值=2(箱子),箱子的位置的值=3(小人),小人位置的值=0(空地)
c、箱子的下一個坐標如果是目標點,則箱子的下一個坐標值=5(完成),箱子的位置的值=3(小人),小人位置的值=0(空地)
(4)如果小人在目標點上行走,移動后,小人移動前的位置應該由小人變為目標點顯示。為了方便判斷小人在空地或目標點上行走,可添加一個與地圖一樣新的地圖(即二維數組)map0,此地圖中箱子和小人位置皆為空地(值=0),目的是小人移動時判斷他移動前的位置是空地還是目標點。例如小人向上移動,移動后小人位置map[y-1,x]=3;小人移動前位置變為:map[y,x]=map0[y,x]

//向上移動 if (aj.Key.ToString() == "UpArrow") { if (map[y - 1, x] == 0 || map[y - 1, x] == 4)//小人的下一個坐標為空地,進行移動 { if (map0[y,x]==4)//如果小人現在的坐標是目標點的坐標 { map[y - 1, x] = 3; map[y, x] = 4; y--; } else//如果小人現在的坐標不是目標點的坐標 { map[y - 1, x] = 3; map[y, x] = 0; y--; } } else if (map[y - 1, x] == 1)//小人的下一個坐標為牆,跳過此次循環 { continue; } else if (map[y - 1, x] == 2 || map[y - 1, x] == 5)//小人的下一個坐標為未到達目標的箱子或到達目標的箱子 { if (map[y - 2, x] == 1 || map[y - 2, x] == 2 || map[y - 2, x] == 5)//箱子的下一個目標為牆或空箱子或到達目標的箱子 { continue; } else if (map[y - 2, x] == 0)//箱子的下一個目標為空地 { if (map0[y, x] == 4)//如果小人現在的坐標是目標點的坐標 { map[y - 2, x] = 2; map[y - 1, x] = 3; map[y, x] = 4; y--; } else//如果小人現在的坐標不是目標點的坐標 { map[y - 2, x] = 2; map[y - 1, x] = 3; map[y, x] = 0; y--; } } else if (map[y - 2, x] == 4)//箱子的下一個目標為目標點 { if (map0[y, x] == 4)//如果小人現在的坐標是目標點的坐標 { map[y - 2, x] = 5; map[y - 1, x] = 3; map[y, x] = 4; y--; } else//如果小人現在的坐標不是目標點的坐標 { map[y - 2, x] = 5; map[y - 1, x] = 3; map[y, x] = 0; y--; } } } }
6、綜上各步驟修改后完成整個推箱子功能,一起來試試吧

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Collections; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { //推箱子 //一、設計地圖 空地為0,牆為1,箱子=2,人=3,目標=4,完成=5 int[,] map = new int[12, 13] { {0,0,0,0,0,1,1,1,1,1,1,1,0}, {0,0,0,0,0,1,0,0,1,0,0,1,0}, {0,0,0,0,0,1,0,0,2,2,0,1,0}, {1,1,1,1,1,1,0,2,1,0,0,1,0}, {1,4,4,4,1,1,1,0,1,0,0,1,1}, {1,4,0,0,1,0,0,2,0,1,0,0,1}, {1,4,0,0,0,0,2,0,2,0,2,0,1}, {1,4,0,0,1,0,0,2,0,1,0,0,1}, {1,4,4,4,1,1,1,0,1,0,0,1,1}, {1,1,1,1,1,1,0,2,0,0,0,1,0}, {0,0,0,0,0,1,0,3,1,0,0,1,0}, {0,0,0,0,0,1,1,1,1,1,1,1,0} }; int[,] map0 = new int[12, 13] { {0,0,0,0,0,1,1,1,1,1,1,1,0}, {0,0,0,0,0,1,0,0,1,0,0,1,0}, {0,0,0,0,0,1,0,0,0,0,0,1,0}, {1,1,1,1,1,1,0,0,1,0,0,1,0}, {1,4,4,4,1,1,1,0,1,0,0,1,1}, {1,4,0,0,1,0,0,0,0,1,0,0,1}, {1,4,0,0,0,0,0,0,0,0,0,0,1}, {1,4,0,0,1,0,0,0,0,1,0,0,1}, {1,4,4,4,1,1,1,0,1,0,0,1,1}, {1,1,1,1,1,1,0,0,0,0,0,1,0}, {0,0,0,0,0,1,0,0,1,0,0,1,0}, {0,0,0,0,0,1,1,1,1,1,1,1,0} }; //小人的初始坐標 int y = 10, x = 7; //讓小人動起來(用方向鍵↑↓←→控制),即改變小人的坐標位置,與下一個坐標內容互換,如果指定方向的下一個坐標是1(即面對牆),小人坐標不變(if進行判斷) //for循環中控制,清屏后打印新位置 for (; ; ) { //打印新地圖 for (int i = 0; i < 12; i++) { for (int j = 0; j < 13; j++) { if (map[i, j] == 0) { Console.Write(" "); } if (map[i, j] == 1) { Console.Write("■"); } if (map[i, j] == 2) { Console.Write("□"); } if (map[i, j] == 3) { Console.Write("♀"); } if (map[i, j] == 4) { Console.Write("☆"); } if (map[i, j] == 5) { Console.Write("★"); } } Console.WriteLine(); } //接收輸入的按鍵 ConsoleKeyInfo aj = Console.ReadKey(); //清屏 Console.Clear(); //向上移動 if (aj.Key.ToString() == "UpArrow") { if (map[y - 1, x] == 0 || map[y - 1, x] == 4)//小人的下一個坐標為空地,進行移動 { if (map0[y,x]==4)//如果小人現在的坐標是目標點的坐標 { map[y - 1, x] = 3; map[y, x] = 4; y--; } else//如果小人現在的坐標不是目標點的坐標 { map[y - 1, x] = 3; map[y, x] = 0; y--; } } else if (map[y - 1, x] == 1)//小人的下一個坐標為牆,跳過此次循環 { continue; } else if (map[y - 1, x] == 2 || map[y - 1, x] == 5)//小人的下一個坐標為未到達目標的箱子或到達目標的箱子 { if (map[y - 2, x] == 1 || map[y - 2, x] == 2 || map[y - 2, x] == 5)//箱子的下一個目標為牆或空箱子或到達目標的箱子 { continue; } else if (map[y - 2, x] == 0)//箱子的下一個目標為空地 { if (map0[y, x] == 4)//如果小人現在的坐標是目標點的坐標 { map[y - 2, x] = 2; map[y - 1, x] = 3; map[y, x] = 4; y--; } else//如果小人現在的坐標不是目標點的坐標 { map[y - 2, x] = 2; map[y - 1, x] = 3; map[y, x] = 0; y--; } } else if (map[y - 2, x] == 4)//箱子的下一個目標為目標點 { if (map0[y, x] == 4)//如果小人現在的坐標是目標點的坐標 { map[y - 2, x] = 5; map[y - 1, x] = 3; map[y, x] = 4; y--; } else//如果小人現在的坐標不是目標點的坐標 { map[y - 2, x] = 5; map[y - 1, x] = 3; map[y, x] = 0; y--; } } } } //向下移動 if (aj.Key.ToString() == "DownArrow") { if (map[y + 1, x] == 0 || map[y + 1, x] == 4)//小人的下一個坐標為空地,進行移動 { if (map0[y, x] == 4)//如果小人現在的坐標是目標點的坐標 { map[y + 1, x] = 3; map[y, x] = 4; y++; } else//如果小人現在的坐標不是目標點的坐標 { map[y + 1, x] = 3; map[y, x] = 0; y++; } } else if (map[y + 1, x] == 1)//小人的下一個坐標為牆,跳過此次循環 { continue; } else if (map[y + 1, x] == 2 || map[y + 1, x] == 5)//小人的下一個坐標為未到達目標的箱子或到達目標的箱子 { if (map[y + 2, x] == 1 || map[y + 2, x] == 2 || map[y + 2, x] == 5)//箱子的下一個目標為牆或空箱子或到達目標的箱子 { continue; } else if (map[y + 2, x] == 0)//箱子的下一個目標為空地 { if (map0[y, x] == 4)//如果小人現在的坐標是目標點的坐標 { map[y + 2, x] = 2; map[y + 1, x] = 3; map[y, x] = 4; y++; } else//如果小人現在的坐標不是目標點的坐標 { map[y + 2, x] = 2; map[y + 1, x] = 3; map[y, x] = 0; y++; } } else if (map[y + 2, x] == 4)//箱子的下一個目標為目標點 { if (map0[y, x] == 4)//如果小人現在的坐標是目標點的坐標 { map[y + 2, x] = 5; map[y + 1, x] = 3; map[y, x] = 4; y++; } else//如果小人現在的坐標不是目標點的坐標 { map[y + 2, x] = 5; map[y + 1, x] = 3; map[y, x] = 0; y++; } } } } //向左移動 if (aj.Key.ToString() == "LeftArrow") { if (map[y, x - 1] == 0 || map[y, x - 1] == 4)//小人的下一個坐標為空地,進行移動 { if (map0[y, x] == 4)//如果小人現在的坐標是目標點的坐標 { map[y, x - 1] = 3; map[y, x] = 4; x--; } else//如果小人現在的坐標不是目標點的坐標 { map[y, x - 1] = 3; map[y, x] = 0; x--; } } else if (map[y, x - 1] == 1)//小人的下一個坐標為牆,跳過此次循環 { continue; } else if (map[y, x - 1] == 2 || map[y, x - 1] == 5)//小人的下一個坐標為未到達目標的箱子或到達目標的箱子 { if (map[y, x - 2] == 1 || map[y, x - 2] == 2 || map[y, x - 2] == 5)//箱子的下一個目標為牆或空箱子或到達目標的箱子 { continue; } else if (map[y, x - 2] == 0)//箱子的下一個目標為空地 { if (map0[y, x] == 4)//如果小人現在的坐標是目標點的坐標 { map[y, x - 2] = 2; map[y, x - 1] = 3; map[y, x] = 4; x--; } else//如果小人現在的坐標不是目標點的坐標 { map[y, x - 2] = 2; map[y, x - 1] = 3; map[y, x] = 0; x--; } } else if (map[y, x - 2] == 4)//箱子的下一個目標為目標點 { if (map0[y, x] == 4)//如果小人現在的坐標是目標點的坐標 { map[y, x - 2] = 5; map[y, x - 1] = 3; map[y, x] = 4; x--; } else//如果小人現在的坐標不是目標點的坐標 { map[y, x - 2] = 5; map[y, x - 1] = 3; map[y, x] = 0; x--; } } } } //向右移動 if (aj.Key.ToString() == "RightArrow") { if (map[y, x + 1] == 0 || map[y, x + 1] == 4)//小人的下一個坐標為空地,進行移動 { if (map0[y, x] == 4)//如果小人現在的坐標是目標點的坐標 { map[y, x + 1] = 3; map[y, x] = 4; x++; } else//如果小人現在的坐標不是目標點的坐標 { map[y, x + 1] = 3; map[y, x] = 0; x++; } } else if (map[y, x + 1] == 1)//小人的下一個坐標為牆,跳過此次循環 { continue; } else if (map[y, x + 1] == 2 || map[y, x + 1] == 5)//小人的下一個坐標為未到達目標的箱子或到達目標的箱子 { if (map[y, x + 2] == 1 || map[y, x + 2] == 2 || map[y, x + 2] == 5)//箱子的下一個目標為牆或空箱子或到達目標的箱子 { continue; } else if (map[y, x + 2] == 0)//箱子的下一個目標為空地 { if (map0[y, x] == 4)//如果小人現在的坐標是目標點的坐標 { map[y, x + 2] = 2; map[y, x + 1] = 3; map[y, x] = 4; x++; } else//如果小人現在的坐標不是目標點的坐標 { map[y, x + 2] = 2; map[y, x + 1] = 3; map[y, x] = 0; x++; } } else if (map[y, x + 2] == 4)//箱子的下一個目標為目標點 { if (map0[y, x] == 4)//如果小人現在的坐標是目標點的坐標 { map[y, x + 2] = 5; map[y, x + 1] = 3; map[y, x] = 4; x++; } else//如果小人現在的坐標不是目標點的坐標 { map[y, x + 2] = 5; map[y, x + 1] = 3; map[y, x] = 0; x++; } } } } } Console.ReadLine(); } } }