问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

用javascript怎么怎么制作一个拼图游戏?

发布网友 发布时间:2022-04-21 18:35

我来回答

1个回答

热心网友 时间:2023-11-22 16:55


本篇文章的内容是关于如何利用原生的 JavaScript来实现一个简单的拼图小游戏,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
一、游戏的基础逻辑
想用一门语言来开发游戏,必须先了解如何使用这门语言来实现一些基础逻辑,比如图像的绘制、交互的处理、定时器等。
1、图形绘制图形绘制是一切的基础,这里使用 JavaScript 在 canvas 上进行绘制。即先在 html 中创建 canvas 元素,然后在 JavaScript 中,通过 id 拿到这个元素,并且通过 canvas 拿到对应的上下文环境 context ,为后续的绘图做好准备。
<canvas id="background" width="450px" height="450px"></canvas>var background = document.getElementById("background");
var context = background.getContext('2d');通过 context 的 drawImage 方法可以绘制图片,这里进行了相应的封装:
注:这里要等图片加载完毕后再进行绘制,即在 onload 中去调用 drawImage 方法,否则会绘制失败。
var drawImageItem = function(index, position) {
var img = new Image();
img.src = './image/dog_0' + String(index+1) + '.jpg';
img.onload = () => {
var rect = rectForPosition(position);
context.drawImage(img, rect[0], rect[1], rect[2], rect[3]);
}
}在绘制图片之后,我们还需要去动态刷新视图,否则 canvas 就只是一张静态的图片。如果是简单的图形刷新,只需在原来的位置重新绘制,进行覆盖即可。但有时候我们只需要将原来已存在的图形清除掉,而不需要绘制新图案。比如在拼图游戏中,将一个方块移动到另一个位置后,需要清空原来的位置。
通过 context 的 clearRect 方法可以达到清除的目的。以下是清除 canvas 的某个区域的代码:
var originRect = rectForPosition(origin);
context.clearRect(originRect[0], originRect[1], originRect[2], originRect[3]);2、事件处理有了图形的绘制后,我们还需要处理玩家的输入事件,然后根据输入事件,来决定什么时候刷新视图。输入事件可以分为 3 种:在手机上有触屏事件;在 PC 上,有鼠标和键盘事件。
JavaScript 中对触屏和鼠标点击的监听是一样的,都是通过 canvas 的 onclick 事件进行回调,具体如下:
// 屏幕点击
background.onclick = function(e) {
};我们可以通过 e.offsetX 、 e.offsetY 来获取触控点在 canvas 中的位置。
注: canvas 的坐标原点在左上角,即左上角的坐标是 (0, 0) 。
键盘的按键点击则是通过 document 的 onkeyup 、 onkeydown 等事件进行回调。 onkeyup 是指按键的抬起事件, onkeydown 是指按键的按下事件。我们可以通过 keyCode 知道当前具体是哪一个按键,然后根据不同的按键去处理不同的逻辑,如下:
if (event.keyCode == '37') { // 左
// do something
} else if (event.keyCode == '38') { // 上
// do something
} else if (event.keyCode == '39') { // 右
// do something
} else if (event.keyCode == '40') { // 下
// do something
}3、定时器有时候,除了在玩家输入的时候需要去刷新视图,还需要每隔一段时间定时去刷新视图。比如在一个贪吃蛇游戏中,就需要每隔一段时间就去刷新蛇的位置。
这个时候我们就需要一个定时器,让它每隔一段时间去执行一段刷新视图的代码。我们通过 setInterval 方法来实现定时器功能:
setInterval("run()", 100);上面这段代码表示每隔 100 毫秒,去执行一次 run 方法。
二、拼图的基础逻辑有了游戏的基础逻辑,下面来看一下如何实现拼图的逻辑。
1、生成随机序列因为不是任意序列都可以通过平移的方式来还原,所以我们不能简单地生成一个随机序列。比如 1、0、2、3、4、5、6、7、8 这个序列,无论怎么平移,都不可能还原。
这里采取的做法是:预先设置了 4 个可还原的序列,先从这 4 个序列中随机选取一个,然后再对序列进行模拟平移若干步骤。以此来尽可能地保证初始序列的多样性,也保证了序列的可还原性。具体代码如下:
var setupRandomPosition = function() {
var list1 = [4, 3, 2, 8, 0, 7, 5, 6, 1];
var list2 = [2, 0, 5, 6, 8, 7, 3, 1, 4];
var list3 = [3, 7, 2, 4, 1, 6, 8, 0, 5];
var list4 = [3, 2, 4, 1, 7, 6, 5, 0, 8];
var lists = [list1, list2, list3, list4];
imageIndexForPosition = lists[parseInt(Math.random() * 4)];
// 获取空位位置
var emptyPosition = 0;
for (var i = imageIndexForPosition.length - 1; i >= 0; i--) {
if (imageIndexForPosition[i] == lastIndex()) {
emptyPosition = i;
break;
}
}
background.emptyPosition = emptyPosition;
// 随机移动次数
var times = 10;
while (times--) {
// 获取随机数,决定空位哪个位置进行移动
var direction = parseInt(Math.random() * 4);
var target = -1;
if (direction == 0) {
target = topOfPosition(emptyPosition); // 上
} else if (direction == 1) {
target = leftOfPosition(emptyPosition); // 左
} else if (direction == 2) {
target = rightOfPosition(emptyPosition); // 右
} else if (direction == 3) {
target = bottomOfPosition(emptyPosition); // 下
}
if (target < 0 || target > lastIndex()) { // 位置不合法,继续下一次循环
continue;
}
var result = moveImageIfCanAtPosition(target);
if (result >= 0) { // 如果移动成功,更新空位的位置
emptyPosition = target;
}
}
}2、判断是否可以移动方块在保存顺序的时候,是用 0~8 这 9 个数字来保存,而空白的方块是数字 8 的位置。所以判断可以移动的唯一条件是,目标位置的值是否为 8。代码如下:
var isPositionEmpty = function(position) {
if (position < 0 || position > lastIndex()) {
return false;
}
if (imageIndexForPosition[position] == lastIndex()) {
return true;
} else {
return false;
}
}上面 lastIndex() 的值为 8。
3、实现方块移动方块移动的实现很简单,先将旧位置的图形清除,然后在新的位置绘制。
var refreshImagePositions = function(origin, target) {
var originRect = rectForPosition(origin);
context.clearRect(originRect[0], originRect[1], originRect[2], originRect[3]);
drawImageItem(imageIndexForPosition[target], target);
}4、检查是否完成检查图案是否已经还原,只需要对数组进行一次遍历,看是否有序即可。
var checkIfFinish = function() {
for (var index = 0; index < imageIndexForPosition.length; index++) {
if (index != imageIndexForPosition[index]) {
return false;
}
}
return true;
}5、交互事件屏蔽当图案还原之后,我们不希望玩家还能通过键盘或鼠标来移动方块,这个时候就需要对交互事件进行屏蔽。
只需要一个标志位就可以达到这个目的:
// 屏幕点击
background.onclick = function(e) {
if (isFinish) {
return;
}
// do something
};
// 键盘按钮事件
document.onkeyup = function(event) {
if (isFinish) {
return;
}
// do something
}当图案还原之后,标志位 isFinish 会被置为 true ,然后在屏幕点击和键盘按钮响应事件的开始处添加判断,如果已经结束,则不继续走方块移动的逻辑。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
“苏大强”的本意是什么?抹黑江苏吗? 伦敦奥运会入场式各个国家和地区的先后顺序 参加奥运会入场式的前后顺序 神马是费用性斜视?没听说过,斜视不就是斗鸡眼么 小儿斜视原因 为了不出现重影,右眼会被推到外斜视眼位,称为“废用性斜视” 在八岁时玩鞭炮炸伤左眼,而形成左眼斜视,现在能治好吗 ...后左眼斜视外斜 左眼下半部有光感 视觉模糊 请问左手术的话 能恢复... 两眼视力差距大会怎么样 关于耳洞的小问题~有经验的和懂行的进~ JS游戏编程怎么读取进度 js写了个游戏,怎么写重新玩耍 自学cocos2d js游戏开发应该按什么步骤进行 我想用js写游戏,现在只会一点jquery,能行吗 用JS编写一个数字游戏 有如下要求 js可以制作3D游戏吗? 要用JS做个游戏,JS得学到什么程度 js简单回合制小游戏 JS经典小游戏 html5游戏实际上是js游戏,认同吗?为什么还要叫h5... js编写的小游戏有哪些 大家觉得雷神笔记本怎么样,值得购买么? 我新买的雷神G150T笔记本,没有系统,自己装完系统... 我雷神笔记本玩LOL FPS60稳定不掉,但是自从更新了... 雷神笔记本g150屏幕绿屏 系统操作正常 独立显卡驱... 雷神笔记本花屏看不清怎么办? 雷神笔记本屏幕闪烁(求教大神) 雷神新笔记本电脑双显卡.为啥没有独显控制面板啊 雷神笔记本不装驱动性能会发挥不了么? 雷神笔记本g150sg显卡怎么驱动不了? 用js做一个贪吃蛇的游戏,谢谢,最好有注释 在网络游戏中常说js是什么意思,还有生活中的老说j... JS怎么设计游戏的开始界面 js小游戏怎么永久记录分数 怎样使台式硬盘变成移动硬盘? 原生js可以写游戏吗 关于打JS的单机游戏 js编写小游戏控制子弹的移动,当第二颗子弹发射时... 如何将硬盘变成移动硬盘? 如何将电脑硬盘改为移动硬盘 怎么把js的游戏加到安卓app中 如何把旧电脑硬盘变成移动硬盘 怎样把一个台式电脑的硬盘变做可插式的移动硬盘? 台式电脑里的盒装硬盘如何改装成移动硬盘? 请问这个是什么虫子,是什么原因造成的,如何解决? 这是什么虫。 最近家里发现种虫子爬得很快,按死血色,请大家看... 微信公众号的怎么改 可以更 微信公众平台怎么修改 公众号的可以改吗