zoukankan      html  css  js  c++  java
  • 用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();
            }
        }
    }
    推箱子最终代码
  • 相关阅读:
    根据会员权限显示指定字段教程与源码
    关键字替换排除HTML标签属性字符
    C# 图片处理(压缩、剪裁,转换,优化)
    点击按钮后表单自动提交的问题
    浏览器中添加收藏当前网页
    Javascript基础知识整理
    JS中不同类型的值比较问题
    ACM训练场
    sencha/extjs 动态创建grid表格
    sencha 报错问题汇总
  • 原文地址:https://www.cnblogs.com/qq450867541/p/6100085.html
Copyright © 2011-2022 走看看