JS推箱⼦js推箱⼦⼩项⽬
效果图如下:
index.html代码如下:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>HTML5 Canvas推箱⼦⼩游戏DEMO演⽰</title>
<style>/*css样式表的⾐柜*/
*{
margin:0px;
padding:0px;
}
body{
}
.game{
width:560px;
margin:5px auto;
}
</style>
</head>
<body onkeydown="doKeyDown(event)"><!--⾝体-->
<div class="game">
<canvas id="canvas" width="560" height="560"></canvas>
<div id="msg"></div>
<input type="button" value="上⼀关" onClick="NextLevel(-1)">
<input type="button" value="下⼀关" onClick="NextLevel(1)">
<input type="button" value="重玩本关" onClick="NextLevel(0)">
<input type="button" value="游戏说明" onClick="showHelp()">
</div>
<script src="js/mapdata100.js"></script>
<script>
var can = ElementById("canvas");
var msg = ElementById("msg");
var cxt = Context("2d");
var w = 35,h = 35;
var curMap;//当前的地图
var curLevel;//当前等级的地图
//预加载所有图⽚
var oImgs = {
"block" : "images/block.gif",
"wall" : "images/wall.png",
"box" : "images/box.png",
"ball" : "images/ball.png",
"up" : "images/up.png",
"down" : "images/down.png",
"left" : "images/left.png",
"right" : "images/right.png",
}
function imgPreload(srcs,callback){
var count = 0,imgNum = 0,images = {};
for(src in srcs){
imgNum++;
}
for(src in srcs ){
images[src] = new Image();
images[src].onload = function(){
//判断是否所有的图⽚都预加载完成
if (++count >= imgNum)
{
callback(images);
}
}
images[src].src = srcs[src];
}
}
var block,wall,box,ball,up,down,left,right;
imgPreload(oImgs,function(images){
//console.log(images.block);
block = images.block;
wall = images.wall;
box = images.box;
ball = images.ball;
up = images.up;
down = images.down;
left = images.left;
right = images.right;
init();
});
//初始化游戏
function init(){
//InitMap();
//DrawMap(levels[0]);
initLevel();//初始化对应等级的游戏
showMoveInfo();//初始化对应等级的游戏数据 }
//绘制地板
function InitMap(){
for (var i=0;i<16 ;i++ )
{
for (var j=0;j<16 ;j++ )
{
cxt.drawImage(block,w*j,h*i,w,h);
}
}
}
//⼩⼈位置坐标
function Point(x,y){
this.x = x;
//绘制每个游戏关卡地图
function DrawMap(level){
for (var i=0;i<level.length ;i++ )
{
for (var j=0;j<level[i].length ;j++ )
{
var pic = block;//初始图⽚
switch (level[i][j])
{
case 1://绘制墙壁
pic = wall;
break;
case 2://绘制陷进
pic = ball;
break;
case 3://绘制箱⼦
pic = box;
break;
case 4://绘制⼩⼈
pic = curMan;//⼩⼈有四个⽅向具体显⽰哪个图⽚需要和上下左右⽅位值关联    //获取⼩⼈的坐标位置
perPosition.x = i;
perPosition.y = j;
break;
case 5://绘制箱⼦及陷进位置
pic = box;
break;
}
//每个图⽚不⼀样宽需要在对应地板的中⼼绘制地图
cxt.drawImage(pic,w*j-(pic.width-w)/2,h*i-(pic.height-h),pic.width,pic.height)  }
}
}
//初始化游戏等级
function initLevel(){
curMap = copyArray(levels[iCurlevel]);//当前移动过的游戏地图
curLevel = levels[iCurlevel];//当前等级的初始地图
curMan = down;//初始化⼩⼈
InitMap();//初始化地板
DrawMap(curMap);//绘制出当前等级的地图
}
//下⼀关
function NextLevel(i){
//iCurlevel当前的地图关数
iCurlevel = iCurlevel + i;
if (iCurlevel<0)
{
iCurlevel = 0;
return;
}
var len = levels.length;
if (iCurlevel > len-1)
{
iCurlevel = len-1;
}
initLevel();//初始当前等级关卡
moveTimes = 0;//游戏关卡移动步数清零
showMoveInfo();//初始化当前关卡数据
}
//⼩⼈移动
function go(dir){
var p1,p2;
curMan = up;
//获取⼩⼈前⾯的两个坐标位置来进⾏判断⼩⼈是否能够移动
p1 = new Point(perPosition.x-1,perPosition.y);
p2 = new Point(perPosition.x-2,perPosition.y);
break;
case "down":
curMan = down;
p1 = new Point(perPosition.x+1,perPosition.y);
p2 = new Point(perPosition.x+2,perPosition.y);
break;
case "left":
js 二维数组
curMan = left;
p1 = new Point(perPosition.x,perPosition.y-1);
p2 = new Point(perPosition.x,perPosition.y-2);
break;
case "right":
curMan = right;
p1 = new Point(perPosition.x,perPosition.y+1);
p2 = new Point(perPosition.x,perPosition.y+2);
break;
}
//若果⼩⼈能够移动的话,更新游戏数据,并重绘地图
if (Trygo(p1,p2))
{
moveTimes ++;
showMoveInfo();
}
//重绘地板
InitMap();
//重绘当前更新了数据的地图
DrawMap(curMap);
//若果移动完成了进⼊下⼀关
if (checkFinish())
{
alert("恭喜过关!!");
NextLevel(1);
}
}
//判断是否推成功
function checkFinish(){
for (var i=0;i<curMap.length ;i++ )
{
for (var j=0;j<curMap[i].length ;j++ )
{
//当前移动过的地图和初始地图进⾏⽐较,若果初始地图上的陷进参数在移动之后不是箱⼦的话就指代没推成功    if (curLevel[i][j] == 2 && curMap[i][j] != 3 || curLevel[i][j] == 5 && curMap[i][j] != 3)
{
return false;
}
}
}
return true;
}
//判断⼩⼈是否能够移动
function Trygo(p1,p2){
if(p1.x<0) return false;//若果超出地图的上边,不通过
if(p1.y<0) return false;//若果超出地图的左边,不通过
if(p1.x>curMap.length) return false;//若果超出地图的下边,不通过
if(p1.y>curMap[0].length) return false;//若果超出地图的右边,不通过
if(curMap[p1.x][p1.y]==1) return false;//若果前⾯是墙,不通过
if (curMap[p1.x][p1.y]==3 || curMap[p1.x][p1.y]==5)
{//若果⼩⼈前⾯是箱⼦那就还需要判断箱⼦前⾯有没有障碍物(箱⼦/墙)
//若果判断不成功⼩⼈前⾯的箱⼦前进⼀步
curMap[p2.x][p2.y] = 3;//更改地图对应坐标点的值
//console.log(curMap[p2.x][p2.y]);
}
//若果都没判断成功⼩⼈前进⼀步
curMap[p1.x][p1.y] = 4;//更改地图对应坐标点的值
//若果⼩⼈前进了⼀步,⼩⼈原来的位置如何显⽰
var v = curLevel[perPosition.x][perPosition.y];
if (v!=2)//若果刚开始⼩⼈位置不是陷进的话
{
if (v==5)//可能是5 既有箱⼦⼜陷进
{
v=2;//若果⼩⼈本⾝就在陷进⾥⾯的话移开之后还是显⽰陷进
}else{
v=0;//⼩⼈移开之后之前⼩⼈的位置改为地板
}
}
//重置⼩⼈位置的地图参数
curMap[perPosition.x][perPosition.y] = v;
//若果判断⼩⼈前进了⼀步,更新坐标值
perPosition = p1;
//若果⼩动了返回true 指代能够移动⼩⼈
return true;
}
//判断是否推成功
//与键盘上的上下左右键关联
function doKeyDown(event){
switch (event.keyCode)
{
case 37://左键头
go("left");
break;
case 38://上键头
go("up");
break;
case 39://右箭头
go("right");
break;
case 40://下箭头
go("down");
break;
}
}
//完善关卡数据及游戏说明
function showMoveInfo(){
msg.innerHTML = "第" + (iCurlevel+1) +"关移动次数: "+ moveTimes;
}
//游戏说明
var showhelp = false;
function showHelp(){
showhelp = !showhelp;
if (showhelp)
{
msg.innerHTML = "⽤键盘上的上、下、左、右键移动⼩⼈,把箱⼦全部推到⼩球的位置即可过关。箱⼦只可向前推,不能往后拉,并且⼩⼈⼀次只能推动⼀个箱⼦  }else{
showMoveInfo();
}
}
//克隆⼆维数组

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。