用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游戏实战的入门看的我 ...
随机推荐
- [No000055]教你早晨清肠、除口臭、色斑、大肚腩
[长生不老的秘诀] 释.道.医三家有个共同的秘诀:"要叫人不死. 肠中须无屎". 佛家除要求人们戒杀吃素外,还认为早饭是天食,中饭是人食,晚饭是鬼食. 因此,为了身体健康,不妨碍修 ...
- 【深入ASP.NET原理系列】--ASP.NET页面生命周期
前言 ASP.NET页面运行时候,页面将经历一个生命周期,在生命周期中将执行一系列的处理步骤.包括初始化.实例化控件.还原和维护状态.运行时间处理程序代码以及进行呈现.熟悉页面生命周期非常重要,这样我 ...
- wk_04
函数 函数是对程序逻辑进行结构化或过程化的一直编程方法.能将整块代码巧妙的隔离成易于管理的小块,把重复代码放到函数中而不是进行大量的拷贝--这样既能节省空间,也有助于保持一致性,因为你只需要改变单个的 ...
- Java读写文本文件
1 字符输入(FileReader , char) import java.io.IOException; import java.io.FileReader; public class ep10_1 ...
- PHP-数组函数
今天在写一个给第三方同步数据的接口时遇到一个这种情况,我有一大坨数据,但是第三方只需要其中的几个而已,不及思索的就开始foreach $ret = array(); foreach ($needPar ...
- eclipse服务器add and remove 工程时出现there are no resources that can be added or removed from the server
网上的解决方法: 解决方法: 第1步.新建一个“Dynamic Web Project” 第2步.把新建项目里面的.project文件和.settings文件夹复制到导入的那个项目里面. 可是我发现: ...
- PAT 1014. 福尔摩斯的约会 (20)
大侦探福尔摩斯接到一张奇怪的字条:"我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm".大侦 ...
- VFS分析(二)基本数据结构(持续更新)
nameidata /mnt/dir1/dir2/ nameidata结构体是一个临时的结构体, 目标是为了找到最后的dentry.
- SharePoint 2013:自定义ECB菜单项的添加
本文分别介绍了两种常用的添加ECB菜单项的方式. 声明式创建 这也是微软最佳实践推荐的方式.在VS中创建一个SharePoint空解决方案,并添加一个“空元素”类型的SPI. 在Elements.xm ...
- Java 基础命名空间
java.lang (提供利用 Java 编程语言进行程序设计的基础类)java.lang.annotation(提供了引用对象类,支持在某种程度上与垃圾回收器之间的交互)java.lang.inst ...