話不多說直接上代碼
using System;
namespace Boxer
{
class Program
{
const int WIDTH = 8;
const int HEIGHT = 8;
static int[,] map = new int[HEIGHT, WIDTH]{
{0, 0, 1, 1, 1, 0, 0, 0},
{0, 0, 1, 4, 1, 0, 0, 0},
{0, 0, 1, 0, 1, 1, 1, 1},
{1, 1, 1, 3, 0, 3, 4, 1},
{1, 4, 0, 3, 2, 1, 1, 1},
{1, 1, 1, 1, 3, 1, 0, 0},
{0, 0, 0, 1, 4, 1, 0, 0},
{0, 0, 0, 1, 1, 1, 0, 0}
};
static int x, y;
static int boxs;
/**
* 0 表示空
* 1 表示牆
* 2 表示人
* 3 表示箱子
* 4 表示目的地(球)
* 5 表示已完成的箱子
*/
static void Main(string[] args)
{
char direction; //存儲鍵盤按的方向
initData(); //初始化一些數據
//開始游戲的循環,這里是個死循環,每按一次按鈕循環一次
while (true)
{
//每次循環的開始清除屏幕
//system("cls");
Console.Clear();
//繪畫地圖
drawMap();
//判斷,當boxs的數量0時,!0為真,然后走break跳出循環(結束游戲)
if (boxs == 0)
{
break;
}
//鍵盤輸入方向,這里使用getch,因為getch讀取字符不會顯示在屏幕上
direction = Console.ReadKey().KeyChar;
//用switch判斷用戶輸入的方向
switch (direction)
{
case 'w':
//按w時,調用向上移動函數
moveUp();
break;
case 'a':
//按a時,調用向左移動函數
moveLeft();
break;
case 's':
moveDown();
break;
case 'd':
moveRight();
break;
}
}
//當跳出循環時,運行該語句,游戲結束
Console.WriteLine("恭喜你完成游戲!※");
Console.ReadKey();
}
//初始化一些數據
public static void initData()
{
int i, j;
//加載數據時讓用戶等待,一般情況加載數據比較快
Console.WriteLine("游戲加載中,請稍后.........");
//遍歷地圖中的數據
for (i = 0; i < HEIGHT; i++)
{
for (j = 0; j < WIDTH; j++)
{
//遍歷到2(人)時,記錄人的坐標。x, y是前面定義的全局變量
if (map[i,j] == 2)
{
x = j;
y = i;
}
//遍歷到3時,箱子的數目增加。boxs是前面定義的全局變量
if (map[i,j] == 3)
{
boxs++;
}
}
}
}
//在控制台上打印地圖
public static void drawMap()
{
int i, j;
for (i = 0; i < WIDTH; i++)
{
for (j = 0; j < HEIGHT; j++)
{
switch (map[i,j])
{
case 0:
Console.Write(" ");
break;
case 1:
Console.Write("■");
break;
case 2:
Console.Write("♀");
break;
case 3:
Console.Write("◆");
break;
case 4:
Console.Write("●");
break;
case 5:
Console.Write("★");
break;
}
}
Console.Write("\n");
}
}
//向上移動
public static void moveUp()
{
int ux, uy;
//當上方沒有元素時,直接return (其實人不可能在邊緣)
if (y == 0)
{
return;
}
//記錄上方坐標,x為橫,y為縱,所有ux = x, uy = y - 1;
ux = x;
uy = y - 1;
//上方為已完成的箱子
if (map[uy,ux] == 5)
{
return;
}
//假設上方為牆,直接return,這個和上面的判斷可以合在一起,這里為了看清楚分開寫
if (map[uy,ux] == 1)
{
return;
}
//假設上方為箱子
if (map[uy,ux] == 3)
{
//判斷箱子上方是否為牆
if (map[uy - 1,ux] == 1)
{
return;
}
//判斷箱子上方是否為終點
if (map[uy - 1,ux] == 4)
{
//將箱子上面內容賦值為5★
map[uy - 1,ux] = 5;
map[uy,ux] = 0;
//箱子的數目減1
boxs--;
}
else
{
//移動箱子
map[uy - 1,ux] = 3;
}
}
//當上面幾種return的情況都沒遇到,人肯定會移動,移動操作如下
map[y,x] = 0;
map[uy,ux] = 2;
//更新人的坐標
y = uy;
}
//向左移動
public static void moveLeft()
{
int lx, ly;
//當左邊沒有元素時,直接return
if (x == 0)
{
return;
}
//記錄左邊坐標
lx = x - 1;
ly = y;
//左邊為已完成方塊
if (map[ly,lx] == 5)
{
return;
}
//假設左邊為牆,直接return
if (map[ly,lx] == 1)
{
return;
}
//假設左邊為箱子
if (map[ly,lx] == 3)
{
//判斷箱子左邊是否為牆
if (map[ly,lx - 1] == 1)
{
return;
}
//判斷箱子左邊是否為球
if (map[ly,lx - 1] == 4)
{
//將箱子左邊內容賦值為5★
map[ly,lx - 1] = 5;
map[ly,lx] = 0;
//箱子的數目減1
boxs--;
}
else
{
//移動箱子
map[ly,lx - 1] = 3;
}
}
map[y,x] = 0;
map[ly,lx] = 2;
x = lx;
}
//向下移動
public static void moveDown()
{
int dx, dy;
//當下方沒有元素時,直接return
if (y == HEIGHT - 1)
{
return;
}
//記錄下方坐標
dx = x;
dy = y + 1;
//下方為已完成方塊
if (map[dy,dx] == 5)
{
return;
}
//假設下方為牆,直接return
if (map[dy,dx] == 1)
{
return;
}
//假設下方為箱子
if (map[dy,dx] == 3)
{
//判斷箱子下方是否為牆
if (map[dy + 1,dx] == 1)
{
return;
}
//判斷箱子下方是否為球
if (map[dy + 1,dx] == 4)
{
//將箱子下面內容賦值為5★
map[dy + 1,dx] = 5;
map[dy,dx] = 0;
//箱子的數目減1
boxs--;
}
else
{
//移動箱子
map[dy + 1,dx] = 3;
}
}
map[y,x] = 0;
map[dy,dx] = 2;
y = dy;
}
//向右移動
public static void moveRight()
{
int rx, ry;
//當右邊沒有元素時,直接return
if (x == WIDTH - 1)
{
return;
}
//記錄右邊坐標
rx = x + 1;
ry = y;
//右邊為已完成方塊
if (map[ry,rx] == 5)
{
return;
}
//假設右邊為牆,直接return
if (map[ry,rx] == 1)
{
return;
}
//假設右邊為箱子
if (map[ry,rx] == 3)
{
//判斷箱子右邊是否為牆
if (map[ry,rx + 1] == 1)
{
return;
}
//判斷箱子左邊是否為球
if (map[ry,rx + 1] == 4)
{
//將箱子右邊內容賦值為5★
map[ry,rx + 1] = 5;
map[ry,rx] = 0;
//箱子的數目減1
boxs--;
}
else
{
//移動箱子
map[ry,rx + 1] = 3;
}
}
map[y,x] = 0;
map[ry,rx] = 2;
x = rx;
}
}
}
