思路分析:

一、制作一个地图

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

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

游戏制作:

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. MyBatis配置文件解析

    MyBatis配置文件解析(概要) 1.configuration:根元素 1.1 properties:定义配置外在化 1.2 settings:一些全局性的配置 1.3 typeAliases:为 ...

  2. cookie与session的爱恨情仇

    这些都是基础知识,不过有必要做深入了解.先简单介绍一下. 二者的定义: 当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择, 都纪 ...

  3. HTML 学习笔记 JavaScript (对象)

    javaScript中所有的事物都是对象:字符串 数字 数组 日期 等等. 在javaScript中 对象是拥有属性和方法的数据. 属性和方法 属性是与对象相关的值 方法是能够在对象上执行的操作. 举 ...

  4. JS中NULL和Undefined的区别

    NULL是表示一个”无“的对象,转换成数值为0:undefined是一个“无”的原始值,转为数值为NaN: 当声明的变量还未被初始化时,变量的默认值为undefined: null用来表示尚未存在的对 ...

  5. Android入门篇1-Hello World

    一.android studio安装. 二.项目结构 三.运行流程 src->main->AndroidMainifest.xml注册HelloWorldActivity(intent-f ...

  6. C语言--指向多维数组的指针和指针数组

    #include <stdio.h> //void show(char *p[]); ]); int main(){ ][]={","abc","x ...

  7. Eclipse中启用Oracle jdbc logging

    根据自己用的JRE版本, jre1.5选择ojdbc5_g.jar, jre6选择ojdbc6_g.jar, 只有带_g的dirver才输出debug信息. maven 的配置信息: <depe ...

  8. distributed caching for .net applications

    distributed caching for .net applications fast, scalable distributed caching with meaningful perform ...

  9. android mk odex问题 push apk 不生效

    Android编译是否生成odex的设置 默认编译odex版本,如果需要非odex版本,请将device/huawei/k3v2_s10/BoardConfig.mk如下两个变量的值修改为:DISAB ...

  10. 清北学堂2017NOIP冬令营入学测试P4747 D’s problem(d)

    时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试题 描述 题目描述 小D是一名魔法师,它最喜欢干的事就是对批判记者了. 这次记者招待会上,记者对 ...