html5拼图游戏canvas,canvas拼图游戏
我们小时候常玩的魔板拼图游戏,在一个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拼图游戏相关推荐
- HTML5+canvas激流勇进网页游戏源码
介绍: HTML5+canvas激流勇进网页游戏,游戏玩法:使用左键.右键和上箭头键移动. 网盘下载地址: http://kekewangLuo.cc/qn9O6AvpNW10 图片:
- 基于HTML5canvars的小游戏,利用HTML5实现Canvas激流勇进小游戏代码
特效描述:利用HTML5实现 Canvas 激流勇进 小游戏代码.利用HTML5实现Canvas激流勇进小游戏代码 代码结构 1. 引入JS 2. HTML代码 进入游戏 游戏玩法:使用左键.右键和上 ...
- html5画板游戏,HTML 5画布游戏停止(HTML 5 canvas game stop)
HTML 5画布游戏停止(HTML 5 canvas game stop) 我使用HTML 5画布和javascript在我的网页上创建了一个游戏.游戏循环运行,用户可以使用键盘播放. 网页上的游戏画 ...
- html5射箭游戏,好玩的Canvas射箭小游戏
Canvas射箭小游戏 body{ margin:0; background:#222; margin:20px; } svg{ width:100%; height:100%; position:f ...
- HTML5游戏实战之拼图游戏(包含关卡)
拼图游戏是每个人小时候都玩过的经典休闲游戏,依托Hola Studio强大的图片功能和事件回调体系,实现一个游戏性十足的拼图游戏并不难.本文就介绍整个游戏的制作过程,本游戏包含完整的游戏元素,包括广告 ...
- html5拼图游戏开题报告,拼图游戏开题报告-20210406005939.doc-原创力文档
拼图游戏开题报告 拼图游戏不仅可以帮助 ___打发时间,还可以用于锻炼儿童脑力,帮助少儿 ___大脑思维是Android平台游戏的一个特点. 智能 ___作为一种兼具通讯.办公.娱乐为一体的便携式工具 ...
- python自动拼图_Python图像处理——人物拼图游戏
开发工具:pycharm 游戏介绍: 拼图游戏将一幅图片分割咸若干拼块并将它们随机打乱顺序,当将所有拼块都放回原位置时,就完成了拼图(游戏结束).本人物拼图游戏为3行3列,拼块以随机顺序排列,玩家用鼠 ...
- 拼图游戏 java_Java实现拼图游戏
Java实现拼图游戏以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 偶尔帮同学作一个拼图游戏 要求多加注释 实现后加了这 ...
- 微信小游戏入门案例——拼图游戏
微信小游戏入门案例--拼图游戏 涉及内容:canvas组件.小程序界面绘图API 目录结构: pages\game\game.js // pages/game/game.js // 方块的初始位置 v ...
- 五子棋人机对战_原生JS+Canvas实现五子棋游戏
原生JS+Canvas实现五子棋游戏 效果图 主要功能模块为: 1.人机对战功能 2.悔棋功能 3.撤销悔棋功能 二.代码详解 2.1 人机对战功能实现 从效果图可以看到,棋盘的横竖可以放的位置为15 ...
最新文章
- rk3399在linux机上烧写img,烧写固件 — TB-96AI documentation
- OpenMP入门教程(一)hello world
- MYSQL--事务处理
- 课时39.细线表格(理解)
- TensorFlow函数使用总结
- 人脸对齐--采用dlib库的68_face_landmark进行人脸对齐操作
- Android Studio的安装与配置
- 洛谷【P1359】租用游艇
- Aip接口自动化测试框架pytest+allure+request+jsonpath+excle
- 视频物体检测(VID) FGFA:Flow-Guided Feature Aggregation for Video Object Detection
- oracle时分秒修改值_oracle优化(一) oracle数据库使用 TIMESTAMP(6)类型保存年月日时分秒...
- Win8下双系统win7 教程详解
- python redis连接_Python连接Redis连接配置
- 1024程序员节 技术对抗赛 算法与安全答题 标准答案
- 将ShellCode注入进程内存
- 根据卫星的方位角和仰角画卫星星空图(QT实现)
- 学习多种编程语言的益处
- sympy高斯光束模型
- 跨域解决的三种方法、四种请求方式
- C语言正则表达式判断例程
热门文章
- Hive综合应用案例——用户学历查询
- 高性能Java模板引擎BSL-1.0.1发布
- D-OJ刷题日记:一元多项式的运算 题目编号:463
- 360插件化踩坑记录(二),RePlugin安装、启动插件无反应
- office的笔记本:OneNote使用技巧
- 2019 面试系列 - 简历
- CertPathValidatorException:validity check failed
- linux进程管理数据结构,谢烟客---------Linux之进程管理基础概念
- python关系图谱_文本分析之制作网络关系图 Python
- Python模块之logging详解