用C#制作推箱子小游戲


思路分析:

一、制作一個地圖

二、地圖中放置牆、箱子、人、目標等

三、讓小人動起來完成推箱子動作

 

游戲制作:

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();
        }
    }
}
推箱子最終代碼

 


免責聲明!

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



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