用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 - , 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#制作推箱子小游戏的更多相关文章
- 完整版本的推箱子小游戏,最简单的纯C语言打造
/* 推箱子小游戏 1.定义绘制样式 用二维数组的方式 2.绘制图像 3.找出当前位置 4.逻辑判断,制造动作 根据数学xy轴的规律,这里使用ij 上移,行轴上升,行数减少 下移,行数下降,函数增加 ...
- C++ 控制台推箱子小游戏
// 游戏菜单.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #in ...
- 推箱子小游戏《格鲁的实验室》13关 - bfs最短路径
下载了一款推箱子小游戏,第13关的时候怎么也破不了最佳纪录(最少步数是9而我们最好的方案是10步),因为数据比较小(6*8的方阵),所以写了个BFS来找最短路. 游戏的目标是把小黄人推到黄色球,小绿人 ...
- C/C++编程笔记:C语言写推箱子小游戏,大一学习C语言练手项目
C语言,作为大多数人的第一门编程语言,重要性不言而喻,很多编程习惯,逻辑方式在此时就已经形成了.这个是我在大一学习 C语言 后写的推箱子小游戏,自己的逻辑能力得到了提升,在这里同大家分享这个推箱子小游 ...
- 每个人都可以用C语言写的推箱子小游戏!今天你就可以写出属于自己项目~
C语言,作为大多数人的第一门编程语言,重要性不言而喻,很多编程习惯,逻辑方式在此时就已经形成了.这个是我在大一学习 C语言 后写的推箱子小游戏,自己的逻辑能力得到了提升,在这里同大家分享这个推箱子小游 ...
- c++、c实现推箱子小游戏
经过四次的修改和优化,终于将推箱子这个游戏完整的写出来了,今天就像大家分享一下这个游戏的编写. 这个游戏界面的编写总的来说不困难,主要是推动箱子的算法. (1)利用数组和windows api 即可写 ...
- 制作动画或小游戏——CreateJS事件(二)
在Canvas中如果要添加事件,就需要计算坐标来模拟各种事件,而EaselJS中已经封装好了多个事件,只需调用即可. 一.事件 1)点击 事件是绑定在Shape类中的,click事件与DOM中的意思是 ...
- 【面试笔试算法】Program 5 : 推箱子 (网易游戏笔试题)
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 推箱子是一款经典游戏.如图所示,灰色格子代表不能通过区域,蓝色方格是箱子,黑色圆形代表玩家,含有圆点的格子代表目标点. 规 ...
- [SpriteKit] 制作瓦片地图小游戏
概述 SpriteKit制作瓦片地图游戏,深入了解2D游戏制作过程 详细 代码下载:http://www.demodashi.com/demo/10703.html 说实话这个2D游戏实战的入门看的我 ...
随机推荐
- sqlmap小白操作
转载地儿:http://blog.csdn.net/zgyulongfei/article/details/41017493 对于网络安全人员来说,掌握渗透工具的使用方法是一项必备的技能.然而,一个没 ...
- 实现gridview空白处的点击事件
今天做了一个girdview,要求长按item出现删除按钮,点击空白处取消,长按出现按钮可以,但是点击空白处有问题,如果点击到书籍的空白处 可以用适配器的布局点击事件处理,但是空白区域不是item,不 ...
- HTML DOM 属性 对象
HTML DOM 属性 对象 HTML DOM 节点 在 HTML DOM (Document Object Model) 中, 所有的都是 节点: 文档是文档节点 所有 HTML 元素是元素节点 所 ...
- window.open与window.close的兼容性问题
window.open(页面地址url,打开的方式) 方法 打开一个新的窗口(页面) 如果url为空,则默认打开一个空白页面 如果打开方式为空,默认为新窗口方式打开 返回值:返回新打开窗口的windo ...
- nginx应用总结(2)--突破高并发的性能优化
在日常的运维工作中,经常会用到nginx服务,也时常会碰到nginx因高并发导致的性能瓶颈问题.今天这里简单梳理下nginx性能优化的配置(仅仅依据本人的实战经验而述,如有不妥,敬请指出~) 一.这里 ...
- Mac下搭建php开发环境教程
方案一:原生安装 这篇文章主要介绍了Mac下搭建php开发环境教程,Mac OS X 内置了Apache 和 PHP,这样使用起来非常方便.本文以Mac OS X 10.6.3为例,需要的朋友可以参考 ...
- topshelf包装redis为windows服务
topshelf包装redis为windows服务 Redis服务端目前用的是控制台程序运行,部署的时候能作为windows服务后台运行感觉更好.找到一篇文章Running Redis as a Wi ...
- Lowest Common Ancestor of a Binary Search Tree
Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BS ...
- Linux 网络编程详解九
TCP/IP协议中SIGPIPE信号产生原因 .假设客户端socket套接字close(),会给服务器发送字节段FIN: .服务器接收到FIN,但是没有调用close(),因为socket有缓存区,所 ...
- Unity 使用快速教程
Unity是微软在CodePlex上的一个开源项目,可用于依赖注入.控制反转,类似Spring,下面是使用示例: 1.先来定义几个接口.类 namespace UnityTest { public i ...