C#語言實現推箱子


  話不多說直接上代碼

  

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; 

        }

    }
}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM