思路分析:

一、制作一个地图

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

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

游戏制作:

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. 嵌入式Linux驱动学习之路(八)创建最小的根文件系统

    busybox 在配置busybox,在是否选择要静态链接库时,在静态下,busybox中的工具不需要动态链接库,能够直接运行.而用户自己编写的程序如果需要动态链接库,还是依然需要有. 如果是动态链接 ...

  2. 方便!C++ builder快捷键大全

    Clipboard control (default) Ctrl+Ins Edit|Copy Shift+Del Edit|Cut Shift+Ins Edit|Paste Ctrl+C Edit|C ...

  3. [No00002E]关于大数据,你不知道的6个迷思

    还是那个观点:计算机,编程语言,互联网,大数据等等都只是工具! 导语:看过美剧<纸牌屋>没?知道这部"白宫甄嬛传"为什么会火吗?靠的是大!数!据! 过去两年,在 Net ...

  4. [No000026]365种创业、办公、和生活成长的精华资源

    只需要具备以下技能,人人都可以成为企业家:经得起失败的考验,思维活跃,新点子不断,能够脚踏实地把新点子转化为产品,并在这个过程中坚持不懈,百折不挠,即使跌倒了,也要及时从失败中学习,迅速投入到下一次冒 ...

  5. 理解Java中字符流与字节流的区别

    1. 什么是流 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列.和水流一样,Java中的流也具有一个“流动的方向”,通常可以从中读入一个字节序 ...

  6. Eclipse调整双击选取的字符颜色背景

    Eclipse调整双击选取的字符颜色背景,如下图所示: 会有二点影响: 1. 编辑页的颜色 2. 右侧滚动条的小提示点的颜色.

  7. poj3278 Catch That Cow

    Catch That Cow Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 73973   Accepted: 23308 ...

  8. CentOS 6.4 下安装vsftpd

    概述: vsftpd是Linux下比较著名的FTP服务器,搭建FTP服务器当然首选这个. 本文介绍了在CentOS 6.4下安装vsftpd.配置虚拟用户登录FTP的过程. 正文: 一:安装vsftp ...

  9. [转]PHP 下使用 ZeroMQ 和 protobuf

    FROM : http://www.68idc.cn/help/makewebs/php/20150118175432.html 前言 这个记录总的来说分两部分: 搭建环境. 简单使用教程. 搭建环境 ...

  10. PHP PSR规范

    PHP PSR-1 基本代码规范(中文版)  http://segmentfault.com/a/1190000002521577PHP PSR-2 代码风格规范 (中文版)  http://segm ...