我们小时候常玩的魔板拼图游戏,在一个M*N的魔板中共有(M*N-1)张小块图片,和一个空白块;我们要利用这个空白块来移动这(M*N-1)张小块图片,使之拼成一张原始的完整的图片。

接下来就要详细讲解如何利用html5中的canvas来开发这样一个益智小游戏,下面我来简单地讲解一下游戏的开发思路。

1.首先我们来定义游戏中需要用到的一些全局配置变量

//全局配置变量var kBoardWidth = 4; //横向块数var kBoardHeight = 5; //纵向块数var kPieceWidth = 100; //每块的宽度var kPieceHeight = 100; //每块的高度var kPixelWidth = 1 + kBoardWidth * kPieceWidth; //游戏视野的宽度var kPixelHeight = 1 + kBoardHeight * kPieceHeight; //游戏视野的高度var exchangeTimes = 100; //随机对换次数

var gCanvasElement; //canvas元素节点var gDrawingContext; //canvas元素的context内容var gMoveCountElem; //移动步数元素节点var gMoveCount; //移动次数var gPieces; //小块图片数组var gNumPieces; //小块图片的张数

2.利用OOP(面向对象)的方法,创建一个Cell类,Cell类当中包含了每个小块图片的行列和内容信息:

//定义一个cell类,cell类包含了小块图片的信息function Cell(row,column,index)

{

this.row = row; //行信息 this.column = column; //列信息 this.index = index; //内容信息}

3.接下来可以开始初始化游戏了。

//初始化游戏function initGame(canvasElement,moveCountElement)

{

//若canvas元素节点不存在则创建canvas元素节点 if(!canvasElement)

{

canvasElement = document.createElement("canvas");

canvasElement.id = "puzzle";

document.body.appendChild(canvasElement);

}

//若记录步数记录节点不存在则创建步数记录节点 if(!moveCountElement)

{

moveCountElement = document.createElement("p");

document.body.appendChild(moveCountElement);

document.body.appendChild(moveCountElement);

}

//初始化参数 gCanvasElement = canvasElement;

gDrawingContext = gCanvasElement.getContext("2d");

gCanvasElement.width = kPixelWidth;

gCanvasElement.height = kPixelHeight;

gMoveCountElem = moveCountElement;

gMoveCount = 0;

newGame(); //载入新的游戏 //监听按键事件 document.οnkeydοwn=function(e)

{

//key接受到的键盘码,以下写法有更好的跨浏览器兼容性 var key=e.keyCode||e.which||e.charCode;

if(key==38 || key==87) movePiece("up"); //上 或者 W 被按下 if(key==40 || key==83) movePiece("down"); //下 或者 S 被按下 if(key==37 || key==65 ) movePiece("left"); //左 或者 A 被按下 if(key==39 || key==68 ) movePiece("right"); //右 或者 D 被按下 }

}

4.其他函数介绍

//开始新游戏function newGame()

{

gMoveCount = 0;

gMoveCountElem.innerHTML = gMoveCount;

gPieces = new Array(kBoardWidth*kBoardHeight-1);

for(var i=0; i

{

var row = parseInt(i/kBoardWidth);

var column = i-row*kBoardWidth;

gPieces[i]=new Cell(row,column,i); //创建小块方格元素 }

//创建最后一个空白图片块,index为-1 gPieces[kBoardWidth*kBoardHeight-1] = new Cell(kBoardHeight-1,kBoardWidth-1,-1); //空白的图片 gNumPieces = gPieces.length;

randExchange(); //随机打乱图片 gDrawingContext.clearRect(0, 0, kPixelWidth, kPixelHeight); //清除canvas原有内容 for(var i=0; i

drawBoard(); //绘制网格线}

//随机对换,用于打小块图片的次序function randExchange()

{

var temp1,temp2,temp3;

for(var i=0; i

{

temp1 = parseInt(kBoardWidth*kBoardHeight*Math.random());

temp2 = parseInt(kBoardWidth*kBoardHeight*Math.random());

//交换两个gPieces[temp1],gPieces[temp2]的位置 temp3 = gPieces[temp1].column;

gPieces[temp1].column = gPieces[temp2].column;

gPieces[temp2].column = temp3;

temp3 = gPieces[temp1].row;

gPieces[temp1].row = gPieces[temp2].row;

gPieces[temp2].row = temp3;

}

}

//绘制网格线function drawBoard()

{

gDrawingContext.beginPath();

//绘制竖直网格线 for (var x = 0; x <= kPixelWidth; x += kPieceWidth) {

gDrawingContext.moveTo(0.5 + x, 0);

gDrawingContext.lineTo(0.5 + x, kPixelHeight);

}

//绘制水平网格线 for (var y = 0; y <= kPixelHeight; y += kPieceHeight) {

gDrawingContext.moveTo(0, 0.5 + y);

gDrawingContext.lineTo(kPixelWidth, 0.5 + y);

}

//设定样式并且绘制到屏幕上 gDrawingContext.strokeStyle = "#f00";

gDrawingContext.stroke();

}

//绘制图片function drawPiece(p)

{

var column = p.column;

var row = p.row;

var index = p.index;

var _row = parseInt(index/kBoardWidth);

var _column = index-_row*kBoardWidth;

var sy = _row*kPieceWidth;

var sx = _column*kPieceHeight ;

var dx = column * kPieceWidth;

var dy = row * kPieceHeight;

var pic = document.getElementById("pic");       //获取原图片资源gDrawingContext.drawImage(pic,sx,sy,kPieceWidth,kPieceHeight,dx,dy,kPieceWidth,kPieceHeight); //截取对应的小块图片,并且绘制到canvas中

}

//根据键盘事件来移动图片function movePiece(direction)

{

var emptyPieceNum = kBoardWidth*kBoardHeight-1; //得到空白图片的内容 var validMove = false; //是否为一次有效的移动

//向上移动 if(direction=='up')

if(gPieces[emptyPieceNum].row+1

for(var i=0; i

if(gPieces[i].column==gPieces[emptyPieceNum].column && gPieces[i].row==gPieces[emptyPieceNum].row+1)

{

gPieces[i].row-=1;

gPieces[emptyPieceNum].row+=1;

validMove = true;

break;

}

//向下移动 if(direction=='down')

if(gPieces[emptyPieceNum].row-1>=0)

for(var i=0; i

if(gPieces[i].column==gPieces[emptyPieceNum].column && gPieces[i].row==gPieces[emptyPieceNum].row-1)

{

gPieces[i].row += 1;

gPieces[emptyPieceNum].row -= 1;

validMove = true;

break;

}

//向左移动 if(direction=='left')

if(gPieces[emptyPieceNum].column+1

for(var i=0; i

if(gPieces[i].column==gPieces[emptyPieceNum].column+1 && gPieces[i].row==gPieces[emptyPieceNum].row)

{

gPieces[i].column -=1;

gPieces[emptyPieceNum].column += 1;

validMove = true;

break;

}

//向右移动 if(direction=='right')

if(gPieces[emptyPieceNum].column-1>=0)

for(var i=0; i

if(gPieces[i].column==gPieces[emptyPieceNum].column-1 && gPieces[i].row==gPieces[emptyPieceNum].row)

{

gPieces[i].column += 1;

gPieces[emptyPieceNum].column -= 1;

validMove = true;

break;

}

//如果是一次有效的移动,开始真正地移动 if(validMove)

{

//清楚canvas所有内容,开始重新绘制 gDrawingContext.clearRect(0, 0, kPixelWidth, kPixelHeight);

for(var i=0; i

drawPiece(gPieces[i]);

drawBoard();

gMoveCount++; //移动步数加1 gMoveCountElem.innerHTML = gMoveCount; //修改显示移动步数 }

}

整个游戏的js代码就是这么多了,一共只有不到200多行的代码,我们就实现了一个有趣的益智小游戏。游戏在chrome中运行效果:

当然了,你还可以发挥你的聪明才智把这个游戏做的更好,比如可以增加难度设置,关卡设置等一系列的内容,在这里我只是演示游戏的工作原理,从而来说明html5中的canvas属性是多么的方便和强大。

html5拼图游戏canvas,canvas拼图游戏相关推荐

  1. HTML5+canvas激流勇进网页游戏源码

    介绍: HTML5+canvas激流勇进网页游戏,游戏玩法:使用左键.右键和上箭头键移动. 网盘下载地址: http://kekewangLuo.cc/qn9O6AvpNW10 图片:

  2. 基于HTML5canvars的小游戏,利用HTML5实现Canvas激流勇进小游戏代码

    特效描述:利用HTML5实现 Canvas 激流勇进 小游戏代码.利用HTML5实现Canvas激流勇进小游戏代码 代码结构 1. 引入JS 2. HTML代码 进入游戏 游戏玩法:使用左键.右键和上 ...

  3. html5画板游戏,HTML 5画布游戏停止(HTML 5 canvas game stop)

    HTML 5画布游戏停止(HTML 5 canvas game stop) 我使用HTML 5画布和javascript在我的网页上创建了一个游戏.游戏循环运行,用户可以使用键盘播放. 网页上的游戏画 ...

  4. html5射箭游戏,好玩的Canvas射箭小游戏

    Canvas射箭小游戏 body{ margin:0; background:#222; margin:20px; } svg{ width:100%; height:100%; position:f ...

  5. HTML5游戏实战之拼图游戏(包含关卡)

    拼图游戏是每个人小时候都玩过的经典休闲游戏,依托Hola Studio强大的图片功能和事件回调体系,实现一个游戏性十足的拼图游戏并不难.本文就介绍整个游戏的制作过程,本游戏包含完整的游戏元素,包括广告 ...

  6. html5拼图游戏开题报告,拼图游戏开题报告-20210406005939.doc-原创力文档

    拼图游戏开题报告 拼图游戏不仅可以帮助 ___打发时间,还可以用于锻炼儿童脑力,帮助少儿 ___大脑思维是Android平台游戏的一个特点. 智能 ___作为一种兼具通讯.办公.娱乐为一体的便携式工具 ...

  7. python自动拼图_Python图像处理——人物拼图游戏

    开发工具:pycharm 游戏介绍: 拼图游戏将一幅图片分割咸若干拼块并将它们随机打乱顺序,当将所有拼块都放回原位置时,就完成了拼图(游戏结束).本人物拼图游戏为3行3列,拼块以随机顺序排列,玩家用鼠 ...

  8. 拼图游戏 java_Java实现拼图游戏

    Java实现拼图游戏以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 偶尔帮同学作一个拼图游戏 要求多加注释 实现后加了这 ...

  9. 微信小游戏入门案例——拼图游戏

    微信小游戏入门案例--拼图游戏 涉及内容:canvas组件.小程序界面绘图API 目录结构: pages\game\game.js // pages/game/game.js // 方块的初始位置 v ...

  10. 五子棋人机对战_原生JS+Canvas实现五子棋游戏

    原生JS+Canvas实现五子棋游戏 效果图 主要功能模块为: 1.人机对战功能 2.悔棋功能 3.撤销悔棋功能 二.代码详解 2.1 人机对战功能实现 从效果图可以看到,棋盘的横竖可以放的位置为15 ...

最新文章

  1. rk3399在linux机上烧写img,烧写固件 — TB-96AI documentation
  2. OpenMP入门教程(一)hello world
  3. MYSQL--事务处理
  4. 课时39.细线表格(理解)
  5. TensorFlow函数使用总结
  6. 人脸对齐--采用dlib库的68_face_landmark进行人脸对齐操作
  7. Android Studio的安装与配置
  8. 洛谷【P1359】租用游艇
  9. Aip接口自动化测试框架pytest+allure+request+jsonpath+excle
  10. 视频物体检测(VID) FGFA:Flow-Guided Feature Aggregation for Video Object Detection
  11. oracle时分秒修改值_oracle优化(一) oracle数据库使用 TIMESTAMP(6)类型保存年月日时分秒...
  12. Win8下双系统win7 教程详解
  13. python redis连接_Python连接Redis连接配置
  14. 1024程序员节 技术对抗赛 算法与安全答题 标准答案
  15. 将ShellCode注入进程内存
  16. 根据卫星的方位角和仰角画卫星星空图(QT实现)
  17. 学习多种编程语言的益处
  18. sympy高斯光束模型
  19. 跨域解决的三种方法、四种请求方式
  20. C语言正则表达式判断例程

热门文章

  1. Hive综合应用案例——用户学历查询
  2. 高性能Java模板引擎BSL-1.0.1发布
  3. D-OJ刷题日记:一元多项式的运算 题目编号:463
  4. 360插件化踩坑记录(二),RePlugin安装、启动插件无反应
  5. office的笔记本:OneNote使用技巧
  6. 2019 面试系列 - 简历
  7. CertPathValidatorException:validity check failed
  8. linux进程管理数据结构,谢烟客---------Linux之进程管理基础概念
  9. python关系图谱_文本分析之制作网络关系图 Python
  10. Python模块之logging详解