思路分析:

一、制作一个地图

二、地图中放置墙、箱子、人、目标等

三、让小人动起来完成推箱子动作

游戏制作:

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 - , x] == || map[y - , x] == )//小人的下一个坐标为空地,进行移动
{
if (map0[y,x]==)//如果小人现在的坐标是目标点的坐标
{
map[y - , x] = ;
map[y, x] = ;
y--;
}
else//如果小人现在的坐标不是目标点的坐标
{
map[y - , x] = ;
map[y, x] = ;
y--;
}
} else if (map[y - , x] == )//小人的下一个坐标为墙,跳过此次循环
{ continue; } else if (map[y - , x] == || map[y - , x] == )//小人的下一个坐标为未到达目标的箱子或到达目标的箱子
{
if (map[y - , x] == || map[y - , x] == || map[y - , x] == )//箱子的下一个目标为墙或空箱子或到达目标的箱子
{ continue; }
else if (map[y - , x] == )//箱子的下一个目标为空地
{
if (map0[y, x] == )//如果小人现在的坐标是目标点的坐标
{
map[y - , x] = ;
map[y - , x] = ;
map[y, x] = ;
y--;
}
else//如果小人现在的坐标不是目标点的坐标
{
map[y - , x] = ;
map[y - , x] = ;
map[y, x] = ;
y--;
}
}
else if (map[y - , x] == )//箱子的下一个目标为目标点
{
if (map0[y, x] == )//如果小人现在的坐标是目标点的坐标
{
map[y - , x] = ;
map[y - , x] = ;
map[y, x] = ;
y--;
}
else//如果小人现在的坐标不是目标点的坐标
{
map[y - , x] = ;
map[y - , x] = ;
map[y, x] = ;
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[, ]
{
{,,,,,,,,,,,,},
{,,,,,,,,,,,,},
{,,,,,,,,,,,,},
{,,,,,,,,,,,,},
{,,,,,,,,,,,,},
{,,,,,,,,,,,,},
{,,,,,,,,,,,,},
{,,,,,,,,,,,,},
{,,,,,,,,,,,,},
{,,,,,,,,,,,,},
{,,,,,,,,,,,,},
{,,,,,,,,,,,,}
};
int[,] map0 = new int[, ]
{
{,,,,,,,,,,,,},
{,,,,,,,,,,,,},
{,,,,,,,,,,,,},
{,,,,,,,,,,,,},
{,,,,,,,,,,,,},
{,,,,,,,,,,,,},
{,,,,,,,,,,,,},
{,,,,,,,,,,,,},
{,,,,,,,,,,,,},
{,,,,,,,,,,,,},
{,,,,,,,,,,,,},
{,,,,,,,,,,,,}
};
//小人的初始坐标
int y = , x = ;
//让小人动起来(用方向键↑↓←→控制),即改变小人的坐标位置,与下一个坐标内容互换,如果指定方向的下一个坐标是1(即面对墙),小人坐标不变(if进行判断)
//for循环中控制,清屏后打印新位置
for (; ; )
{
//打印新地图
for (int i = ; i < ; i++)
{
for (int j = ; j < ; j++)
{
if (map[i, j] == )
{
Console.Write(" ");
}
if (map[i, j] == )
{
Console.Write("■");
}
if (map[i, j] == )
{
Console.Write("□");
}
if (map[i, j] == )
{
Console.Write("♀");
}
if (map[i, j] == )
{
Console.Write("☆");
}
if (map[i, j] == )
{
Console.Write("★");
}
}
Console.WriteLine();
} //接收输入的按键
ConsoleKeyInfo aj = Console.ReadKey();
//清屏
Console.Clear();
//向上移动
if (aj.Key.ToString() == "UpArrow")
{
if (map[y - , x] == || map[y - , x] == )//小人的下一个坐标为空地,进行移动
{
if (map0[y,x]==)//如果小人现在的坐标是目标点的坐标
{
map[y - , x] = ;
map[y, x] = ;
y--;
}
else//如果小人现在的坐标不是目标点的坐标
{
map[y - , x] = ;
map[y, x] = ;
y--;
}
} else if (map[y - , x] == )//小人的下一个坐标为墙,跳过此次循环
{ continue; } else if (map[y - , x] == || map[y - , x] == )//小人的下一个坐标为未到达目标的箱子或到达目标的箱子
{
if (map[y - , x] == || map[y - , x] == || map[y - , x] == )//箱子的下一个目标为墙或空箱子或到达目标的箱子
{ continue; }
else if (map[y - , x] == )//箱子的下一个目标为空地
{
if (map0[y, x] == )//如果小人现在的坐标是目标点的坐标
{
map[y - , x] = ;
map[y - , x] = ;
map[y, x] = ;
y--;
}
else//如果小人现在的坐标不是目标点的坐标
{
map[y - , x] = ;
map[y - , x] = ;
map[y, x] = ;
y--;
}
}
else if (map[y - , x] == )//箱子的下一个目标为目标点
{
if (map0[y, x] == )//如果小人现在的坐标是目标点的坐标
{
map[y - , x] = ;
map[y - , x] = ;
map[y, x] = ;
y--;
}
else//如果小人现在的坐标不是目标点的坐标
{
map[y - , x] = ;
map[y - , x] = ;
map[y, x] = ;
y--;
}
}
}
}
//向下移动
if (aj.Key.ToString() == "DownArrow")
{
if (map[y + , x] == || map[y + , x] == )//小人的下一个坐标为空地,进行移动
{
if (map0[y, x] == )//如果小人现在的坐标是目标点的坐标
{
map[y + , x] = ;
map[y, x] = ;
y++;
}
else//如果小人现在的坐标不是目标点的坐标
{
map[y + , x] = ;
map[y, x] = ;
y++;
}
} else if (map[y + , x] == )//小人的下一个坐标为墙,跳过此次循环
{ continue; } else if (map[y + , x] == || map[y + , x] == )//小人的下一个坐标为未到达目标的箱子或到达目标的箱子
{
if (map[y + , x] == || map[y + , x] == || map[y + , x] == )//箱子的下一个目标为墙或空箱子或到达目标的箱子
{ continue; }
else if (map[y + , x] == )//箱子的下一个目标为空地
{
if (map0[y, x] == )//如果小人现在的坐标是目标点的坐标
{
map[y + , x] = ;
map[y + , x] = ;
map[y, x] = ;
y++;
}
else//如果小人现在的坐标不是目标点的坐标
{
map[y + , x] = ;
map[y + , x] = ;
map[y, x] = ;
y++;
}
}
else if (map[y + , x] == )//箱子的下一个目标为目标点
{
if (map0[y, x] == )//如果小人现在的坐标是目标点的坐标
{
map[y + , x] = ;
map[y + , x] = ;
map[y, x] = ;
y++;
}
else//如果小人现在的坐标不是目标点的坐标
{
map[y + , x] = ;
map[y + , x] = ;
map[y, x] = ;
y++;
}
}
}
}
//向左移动
if (aj.Key.ToString() == "LeftArrow")
{
if (map[y, x - ] == || map[y, x - ] == )//小人的下一个坐标为空地,进行移动
{
if (map0[y, x] == )//如果小人现在的坐标是目标点的坐标
{
map[y, x - ] = ;
map[y, x] = ;
x--;
}
else//如果小人现在的坐标不是目标点的坐标
{
map[y, x - ] = ;
map[y, x] = ;
x--;
}
} else if (map[y, x - ] == )//小人的下一个坐标为墙,跳过此次循环
{ continue; } else if (map[y, x - ] == || map[y, x - ] == )//小人的下一个坐标为未到达目标的箱子或到达目标的箱子
{
if (map[y, x - ] == || map[y, x - ] == || map[y, x - ] == )//箱子的下一个目标为墙或空箱子或到达目标的箱子
{ continue; }
else if (map[y, x - ] == )//箱子的下一个目标为空地
{
if (map0[y, x] == )//如果小人现在的坐标是目标点的坐标
{
map[y, x - ] = ;
map[y, x - ] = ;
map[y, x] = ;
x--;
}
else//如果小人现在的坐标不是目标点的坐标
{
map[y, x - ] = ;
map[y, x - ] = ;
map[y, x] = ;
x--;
}
}
else if (map[y, x - ] == )//箱子的下一个目标为目标点
{
if (map0[y, x] == )//如果小人现在的坐标是目标点的坐标
{
map[y, x - ] = ;
map[y, x - ] = ;
map[y, x] = ;
x--;
}
else//如果小人现在的坐标不是目标点的坐标
{
map[y, x - ] = ;
map[y, x - ] = ;
map[y, x] = ;
x--;
}
}
}
}
//向右移动
if (aj.Key.ToString() == "RightArrow")
{
if (map[y, x + ] == || map[y, x + ] == )//小人的下一个坐标为空地,进行移动
{
if (map0[y, x] == )//如果小人现在的坐标是目标点的坐标
{
map[y, x + ] = ;
map[y, x] = ;
x++;
}
else//如果小人现在的坐标不是目标点的坐标
{
map[y, x + ] = ;
map[y, x] = ;
x++;
}
} else if (map[y, x + ] == )//小人的下一个坐标为墙,跳过此次循环
{ continue; } else if (map[y, x + ] == || map[y, x + ] == )//小人的下一个坐标为未到达目标的箱子或到达目标的箱子
{
if (map[y, x + ] == || map[y, x + ] == || map[y, x + ] == )//箱子的下一个目标为墙或空箱子或到达目标的箱子
{ continue; }
else if (map[y, x + ] == )//箱子的下一个目标为空地
{
if (map0[y, x] == )//如果小人现在的坐标是目标点的坐标
{
map[y, x + ] = ;
map[y, x + ] = ;
map[y, x] = ;
x++;
}
else//如果小人现在的坐标不是目标点的坐标
{
map[y, x + ] = ;
map[y, x + ] = ;
map[y, x] = ;
x++;
}
}
else if (map[y, x + ] == )//箱子的下一个目标为目标点
{
if (map0[y, x] == )//如果小人现在的坐标是目标点的坐标
{
map[y, x + ] = ;
map[y, x + ] = ;
map[y, x] = ;
x++;
}
else//如果小人现在的坐标不是目标点的坐标
{
map[y, x + ] = ;
map[y, x + ] = ;
map[y, x] = ;
x++;
}
}
}
} }
Console.ReadLine();
}
}
}

推箱子最终代码

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

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

    /* 推箱子小游戏 1.定义绘制样式 用二维数组的方式 2.绘制图像 3.找出当前位置 4.逻辑判断,制造动作 根据数学xy轴的规律,这里使用ij 上移,行轴上升,行数减少 下移,行数下降,函数增加 ...

  2. C++ 控制台推箱子小游戏

              // 游戏菜单.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #in ...

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

    下载了一款推箱子小游戏,第13关的时候怎么也破不了最佳纪录(最少步数是9而我们最好的方案是10步),因为数据比较小(6*8的方阵),所以写了个BFS来找最短路. 游戏的目标是把小黄人推到黄色球,小绿人 ...

  4. C/C++编程笔记:C语言写推箱子小游戏,大一学习C语言练手项目

    C语言,作为大多数人的第一门编程语言,重要性不言而喻,很多编程习惯,逻辑方式在此时就已经形成了.这个是我在大一学习 C语言 后写的推箱子小游戏,自己的逻辑能力得到了提升,在这里同大家分享这个推箱子小游 ...

  5. 每个人都可以用C语言写的推箱子小游戏!今天你就可以写出属于自己项目~

    C语言,作为大多数人的第一门编程语言,重要性不言而喻,很多编程习惯,逻辑方式在此时就已经形成了.这个是我在大一学习 C语言 后写的推箱子小游戏,自己的逻辑能力得到了提升,在这里同大家分享这个推箱子小游 ...

  6. c++、c实现推箱子小游戏

    经过四次的修改和优化,终于将推箱子这个游戏完整的写出来了,今天就像大家分享一下这个游戏的编写. 这个游戏界面的编写总的来说不困难,主要是推动箱子的算法. (1)利用数组和windows api 即可写 ...

  7. 制作动画或小游戏——CreateJS事件(二)

    在Canvas中如果要添加事件,就需要计算坐标来模拟各种事件,而EaselJS中已经封装好了多个事件,只需调用即可. 一.事件 1)点击 事件是绑定在Shape类中的,click事件与DOM中的意思是 ...

  8. 【面试笔试算法】Program 5 : 推箱子 (网易游戏笔试题)

    时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 推箱子是一款经典游戏.如图所示,灰色格子代表不能通过区域,蓝色方格是箱子,黑色圆形代表玩家,含有圆点的格子代表目标点. 规 ...

  9. [SpriteKit] 制作瓦片地图小游戏

    概述 SpriteKit制作瓦片地图游戏,深入了解2D游戏制作过程 详细 代码下载:http://www.demodashi.com/demo/10703.html 说实话这个2D游戏实战的入门看的我 ...

随机推荐

  1. C#中Abstract和Virtual

    C#中Abstract和Virtual 在C#的学习中,容易混淆virtual方法和abstract方法的使用,现在来讨论一下二者的区别.二者都牵涉到在派生类中与override的配合使用. 一.Vi ...

  2. 当手机被PS掉,人们看到的是手中的灵魂

    Eric Pickersgill是一名摄影师,最近喜欢拍摄并记录人们使用智能手机的情景,不过不同的是,在最终作品中会将手机从人们手中PS掉,一刹那会进入一个奇怪的世界.黑白照片也极具冲击力. 每个人神 ...

  3. Android终端配置isatap隧道使用IPV6的方法

    使用isatap隧道可以在手机有IPV4网络的情况下访问IPv6网络资源.关于isatap隧道的配置方法,清华.上交两所学校都给出了相应的在windows xp/2003,windows 2000,以 ...

  4. HB制作的app版本更新

    wgt下载成功,安装的时候报wgt包中的manifest.json文件的version必须要大于当前版本,所以每次提交wgt资源包的时候一定要记得大于当前的版本号

  5. Web API 接口

    Web API 接口 在给网站编写 JavaScript 代码时,也有很多可用的 API.您可以使用下面的接口(也称为对象的类型)列表,开发 Web 应用程序或网站. 关于包含这些接口的 API 列表 ...

  6. Java8 Lambda表达式和流操作如何让你的代码变慢5倍

    原文出处:ImportNew 有许许多多关于 Java 8 中流效率的讨论,但根据 Alex Zhitnitsky 的测试结果显示:坚持使用传统的 Java 编程风格——iterator 和 for- ...

  7. DEDECMS之一 安装配置

    一.织梦安装 1.建好数据库.数据库用户名密码以及权限 2.上传代码到服务器,根目录赋予所有权限 3.打开网址,一步步安装即可 二.配置 1.删除安装目录下的所有文件 2.系统 系统设置:配置网站基本 ...

  8. IE6 P标签下DIV无法inline-block

    IE6 P标签下的DIV标签无法inline-block,使其触发了hasLayout属性再用csshack 使其inline还是不行,始终要换行 解决:把div标签替换成非div标签,比如span等 ...

  9. redis 学习笔记(5)-Spring与Jedis的集成

    首先不得不服Spring这个宇宙无敌的开源框架,几乎整合了所有流行的其它框架,http://projects.spring.io/spring-data/从这上面看,当下流行的redis.solr.h ...

  10. 发布我的图片预加载控件YPreLoadImg v1.0

    介绍 大家好!很高兴向大家介绍我的图片预加载控件YPreLoadImg.它可以帮助您预加载图片,并且能显示加载的进度,在预加载完成后调用指定的方法. YPreLoadImg控件由一个名为PreLoad ...