用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();
        }
    }
}

推箱子最终代码

时间: 2024-10-23 23:42:19

用C#制作推箱子小游戏的相关文章

js+Jquery 制作推箱子小游戏

<!DOCTYPE html> <html> <head> <title>Sokaban</title> <meta charset="utf-8"> <style type="text/css"> .roads { width: 50px; height: 50px; background: url(img/roods.png); background-size: 100% 100

Qt实现推箱子小游戏

学习Qt有一个月了,想要实现一个推箱子的游戏来检验一下自己.今天先设计一下将要完成的具体表现,因为是第一次做,所以设计的稍微简单点,以后逐渐修改.首先要创建菜单栏,分为三个主菜单: ①游戏 ②选择关卡 ③关于 (1)游戏主菜单下分为: ①开始游戏 ②重新开始 ③结束游戏 (2)选择关卡分为 ①前一关卡 ②后一关卡 ③选择关卡, (3)关于则弹出游戏的信息 主要使用以下几个类: 1.QPainter绘制地图 2.QMenu.QAction制作菜单栏 3.QKeyEvent接收键盘事件 控制人物行走

推箱子小游戏《格鲁的实验室》13关 - bfs最短路径

下载了一款推箱子小游戏,第13关的时候怎么也破不了最佳纪录(最少步数是9而我们最好的方案是10步),因为数据比较小(6*8的方阵),所以写了个BFS来找最短路. 游戏的目标是把小黄人推到黄色球,小绿人推到绿色球,有个限制是,小黄/绿人运动时会沿某一个方向一直走直到遇到边界或者障碍物,如果途中遇到传送带还会改变运动方向. -----------------------------------------------------------------------------------------

来点福利,看二维数组如何打造推箱子小游戏

C语言学好,通杀C++.这就是方向之一. 前面看过的读者,是不是觉得很鸡肋的知识,全是基本的运用,可是呢?还是看不出能干吗. 那么下面就用二维数组打造,推箱子小游戏.首先,得问问,有何思路? 光写没有用,没到一部分内容觉得可以了,最好先打印下看看效果,要不然写到都不知道自己有没有写错! 效果如图: 打印这部成功后,可以继续了,没有成功者,仔细检查,错误超出一百以上那肯定是头文件的问题. 这步很关键,没有定位,很难移动,几乎全是报错 这步也能首先打印初始化的坐标. 既然定位坐标的情况已经做好,是不

完整版本的推箱子小游戏,最简单的纯C语言打造

/* 推箱子小游戏 1.定义绘制样式 用二维数组的方式 2.绘制图像 3.找出当前位置 4.逻辑判断,制造动作 根据数学xy轴的规律,这里使用ij 上移,行轴上升,行数减少 下移,行数下降,函数增加 左移,列数向左,列数减少 右移,列数向右,列数增加 */ #include <stdio.h> #include <stdlib.h> #include <conio.h> #define ROWS 8 //行数 #define COLS 9 //列数 int i = 0;

c语言实现的推箱子小游戏-1

本次游戏是个推箱子第一关最简单的小游戏 有详细注释,下面是做出来的游戏界面 游戏操作说明和功能说明: 按wasd控制小人的上下左右移动. 按 r 重新开始游戏 游戏开始有操作介绍 游戏结束有胜利提示 游戏原理分析 游戏开始时的星星个数 = 箱子在星星上的个数时 , 游戏胜利. 按 r 键重新开始游戏, 我们需要定义一个量 map_1[8][8] 来保存游戏初始时的界面, 操作时我们将其赋值给 map[8][8] 来进行操作,以便重新归位, 这里就用到了memcpy()函数. wasd 代表上下左

Java实现推箱子小游戏

package Test1; //用于调用Test2包 import Test2.*; import java.awt.*; import javax.swing.*; public class APP extends JFrame{ public static void main(String[] args) { // TODO Auto-generated method stub APP a = new APP(); } public APP() { new Members(); } } p

推箱子小游戏

//K.h #pragma once class K { //抽象化机器人K //地图大小 #define cx 10 #define cy 10 #define wall1 0xA8 //▓占2个字节 WINDOWS下 #define wall2 0x88 // //为K定义方向,方向符号请无视. public: enum FX { y = '>', //朝右Y z = '<', //左 -Y s = '^', //上 -X x = 'V' //下 X }; protected: int m

15-07-09 二维数组-- 推箱子小游戏

1 int a = 2, b = 1;//人的初始坐标 2 #region 造地图 3 int[,] map = new int[10,10]{ 4 {8,8,8,8,8,8,8,8,8,8}, 5 {8,0,0,0,0,0,8,8,0,8}, 6 {8,1,2,0,0,8,8,8,0,8}, 7 {8,0,0,0,0,8,8,8,0,8}, 8 {8,0,0,0,0,0,8,8,0,8}, 9 {8,0,8,0,0,0,8,8,0,8}, 10 {8,0,8,8,0,0,8,8,0,8}, 1