- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章使用vue3重构拼图游戏的实现示例由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
花了两天时间,重构了项目中的一个拼图小游戏(又名数字华容道),为了方便使用抽离成了独立组件,效果如下:
线上体验 。
源码地址在文章最后哦.
原有拼图游戏是通过开源代码加以改造,使用的是 vue2 。在实际项目使用一切正常,但还是存在以下痛点 。
最后决定使用 vue3 重新实现拼图游戏,着重注意以下细节 。
无论是拼图片还是拼数字,其原理都是要把原本打乱的数组移动成有序状态。网上也有很多实现数字华容的的算法,算法主要需要解决的就是如何生成一组 随机且有解 的数组,有的人可能有疑问,数组华容道还有可能无解吗?
如果生成的游戏像上面这样,那就是无解了。原理就像我们玩魔方一样,正常情况下不管我们打乱的多乱都可以还原,但是如果我们把 某几个块抠出来换换位置 ,那就可能还原不了了 。
网上也有很多算法可以避免生成无解的情况,但是写的都比较高深,加上自己阅读算法的能力有限,最后决定按照自己的思路实现.
我的思路其实比较简单,一句话总结就是逆向推理法,我们可以先从排列好的数组开始,然后随机的通过 移动 打乱其顺序,这样肯定可以保证生成的题目有解,同时可以根据打乱的步数来控制游戏的难度,真是个一举两得的idear.
数据存放 。
首先我考虑的是使用一个一维数组来存放数据 。
1
|
let arr = [1,2,3,4,5,6,7,8,0]
// 0 代表空白
|
但是这样会出现一个问题,就是移动的时候逻辑变的相当麻烦,因为一维数组只能记录数据并不能记录竖直方向的位置,这个时候我们自然就想到使用二维数组了,比如,当我们需要生成一个3*3的游戏时数据是这样的
1
2
3
4
5
|
let arr [
[1,2,3],
[4,5,6],
[7,8,0]
]
|
这样我们就可以通过下面来模拟x,y轴来表示每个数字的位置。比如0的位置是(2,2),6的位置是(1,2),如果我想移动6和0的位置,只需要把他们的坐标做调换即可.
移动函数 。
数字华容道最关键的交互就是用户点击那个块就移动哪个块,但是需要注意的是只有0附近的数组可以移动。下面我们先完成移动函数 。
1
2
3
4
5
|
function
move(x, y, moveX, moveY) {
const num = state.arr[x][y];
state.arr[x][y] = state.arr[moveX][moveY];
state.arr[moveX][moveY] = num;
}
|
是不是很简单,其实就是把要移动的两个数的下标给交换下位置 有了移动函数,我们就可以实现上,下,左,右的移动了 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
// 上移动
function
moveTop(x, y) {
if
(x <= 0)
return
-1;
// 开始交换位置
const okx = x - 1;
move(x, y, okx, y);
return
{
x: okx,
y,
};
}
//下移动
function
moveDown(x, y) {
if
(x >= level - 1)
return
-1;
const okx = x + 1;
move(x, y, okx, y);
return
{
x: okx,
y,
};
}
// 左移动
function
moveLeft(x, y) {
if
(y <= 0)
return
-1;
const oky = y - 1;
move(x, y, x, oky);
return
{
x,
y: oky,
};
}
// 右移动
function
moveRight(x, y) {
if
(y >= level - 1)
return
-1;
const oky = y + 1;
move(x, y, x, oky);
return
{
x,
y: oky,
};
}
|
现在我们再实现一个判断移动方向的方法,如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
function
shouldMove(x, y) {
// 判断向哪移动
const { emptyX, emptyY } = seekEmpty();
if
(x === emptyX && y !== emptyY && Math.abs(y - emptyY) === 1) {
// 说明在一个水平线上 可能是左右移动
if
(y > emptyY) {
moveLeft(x, y);
}
else
{
moveRight(x, y);
}
}
if
(y === emptyY && x !== emptyX && Math.abs(x - emptyX) === 1) {
// 说明需要上下移动
if
(x > emptyX) {
moveTop(x, y);
}
else
{
moveDown(x, y);
}
}
}
|
if里面判断的意思是如果我们点击的块是空白快或者不是和空白快挨着的那个,那我们就不做任何处理 。
生成游戏面板 。
其实就是随机调用上移,下移,左移,右移函数,把数组打乱 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
// 随机打乱
function
moveInit(diffic) {
state.arr = creatArr(level);
const num = diffic ? diffic : state.diffec;
const fns = [moveTop, moveDown, moveLeft, moveRight];
let Index =
null
;
let fn;
for
(let i = 0; i < num; i++) {
Index = Math.floor(Math.random() * fns.length);
// moveConsole(Index);
fn = fns[Index](startX, startY);
if
(fn != -1) {
const { x, y } = fn;
startX = x;
startY = y;
}
}
}
|
短短几个函数,就完成了核心逻辑,还有几个函数没有介绍到比如判断游戏完成,寻找空白块的位置,创建二维数组大家可自行阅读源码 。
使用vue3重构 。
以上逻辑貌似和vue3没什么关系,但是我们忽略了最重要的一点,就是 改变数组后,视图也就改变了 这不就是响应式吗,使用vue3后我们可以把关于游戏的所有逻辑放到一个js里面,大大减少了代码的耦合度 。
1
2
3
4
5
|
const { arr, shouldMove, moveInit } = useCreateGame(
gamedata.level,
gamedata.difficulty,
gameEndCallback
);
|
可能有的人会有疑问?把所有逻辑抽离出来这不是很正常的操作吗?难道用vue2的时候都不能抽离了? 但是大家不要忘记了,我们的这个数组需要是响应式的,如果我们单独把逻辑抽离出来那我们在js文件里面改变数组还是响应式的吗 。
但当我们使用vue3的composition-api时就可以再js文件中声明一个响应式变量,且在组件中使用时它还是响应式的 。
1
2
3
4
5
6
7
8
9
10
11
12
|
export
default
function
useCreateGame() {
//声明一个响应式变量
...
const state = reactive({
arr: [],
});
...
return
{
...toRefs(state)
...
}
}
|
1
2
3
4
5
6
|
const { arr, shouldMove, moveInit } = useCreateGame(
gamedata.level,
gamedata.difficulty,
gameEndCallback
);
// 这个时候 arr 还是响应式的
|
这正是composition-api强大所在,有了composition-api我们可以任意组装我们的逻辑代码了 。
在vue2 如果要维护一个响应式变量我们是不是就要使用vuex这种状态管理器了,这样就增加了代码的耦合度 。
现在vite已经到了vite2版本,并且官方还在飞快迭代中,使用vite2创建的项目默认是可以使用setup新特性的,比如我们可以这样写
1
2
3
4
5
6
7
8
9
10
|
<template>
<div>
{{ name }}
</div>
</template>
<script setup>
import { ref } from
"vue"
;
const name = ref(
'"公众号码不停息"'
);
</script>
|
等价于这样写 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<template>
<div>
{{ name }}
</div>
</template>
<script>
import { ref } from
"vue"
;
export
default
{
setup() {
const name = ref(
"公众号码不停息"
);
return
{
name,
};
},
};
</script>
|
看着就简单了很多,并且在setup版本中vue又出了几个api,感兴趣的可以去官网看下,个人感觉还是挺香的。因为新语法还是实验性质的本次代码重构并未使用.
源码地址:数字华容道拼图游戏 欢迎start 。
你可能感兴趣:
基于vue-router思考 实现一个简易版vue-router 基于webpack打包多页应用,对前端工程化的思考 。
到此这篇关于使用vue3重构拼图游戏的实现示例的文章就介绍到这了,更多相关vue3重构拼图内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://juejin.cn/post/6920464793900384270 。
最后此篇关于使用vue3重构拼图游戏的实现示例的文章就讲到这里了,如果你想了解更多关于使用vue3重构拼图游戏的实现示例的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我在某处遇到了以下难题 #include int main() { { /*Fill in something here to make this code compile
我正在尝试为 iOS 创建一个拼图游戏应用程序。从我在互联网上的搜索来看,确实没有任何关于这个主题的教程。有谁知道任何人都知道的好教程或游戏教程的链接?谢谢。顺便说一下,iOS4 将不胜感激。 最佳答
如果必须使用 Promises,您会如何编写以下代码? 这个想法是,“私有(private)”方法 p1 调用一个执行异步操作的函数,然后,当异步调用的结果准备就绪时,控制权将传递给“私有(priva
下面是其中一个 facebook 谜题:我无法理解如何进行此操作。 你有 C 个容器、B 个黑球和无限数量的白球。您希望以一种方式在容器之间分配球,即每个容器至少包含一个球,并且选择白球的概率大于或等
有 5 位成员围坐在一张 table 旁。关键值是坐在 table 周围的成员数量。所以现在关键值将是 5。一个恐怖分子告诉成员,因为你们是 5 个成员,所以我将从第一个成员开始数,数到 5 的人将被
你能在不抛出错误的情况下解决这个问题吗?答案是单线。这是来自一个死的职位发布,在回复中要求回答。我认为这是剔除受访者的聪明方法,但我似乎无法在不出错的情况下回答它。 显而易见的解决方案: f.moo(
此源输出 G'Day Mate. 这是怎么发生的? public static void main(String args[]) { System.out.println("Hello Wor
我正在 android 中开发一个 slider 拼图,它有一个图像被分解成小图像,我们需要对这些 fragment 进行排序以形成正确的图像。我使用了一个 3x3 的 GridView ,其中包含
我遇到了以下难题,无法在 Picat 中制定解决方案: You will generate 5-digit numbers, where each digit is in 1..5 and diffe
我是 Javascript 新手,并且正在努力解决 CodeWars 中的这个难题。 约翰想用壁纸装饰房间。房间的尺寸为:宽度(w)、高度(h)、长度(l)。一卷壁纸的尺寸为 52cm 宽,10m 长
我对 Java 还很陌生,尝试过 Best Before puzzle from Spotify昨天。当我发送它时,我收到“错误答案”错误。检查其他解决方案没有帮助,我无法弄清楚哪个输入给出了错误的答
我正在尝试恢复我拥有的一些旧代码,这是一个拼图游戏。它从文件夹中加载图像(拼图),将它们随机放置在页面周围,然后拖放到板上。这曾经有效,但当我今天尝试使用它时,它只是抛出错误(见下文)。 HTML:
这对你们来说可能是个愚蠢的问题。它是关于 CSS Sprites 的。我有一个包含 4 个菜单的导航,例如 .. HOME COMPANY SERVICES SUPPORT 尽管我使用了一个 css
我需要创建一个标题,可以根据正在构建的页面轻松添加或删除部分,但我在处理其中一部分时遇到了问题。 我有一个标题,看起来像这样将所有组件放在 如果导航被移除,它应该看起来像这样(垂直居中) 我的问题是如
我在 JS 中构建了一个 15 拼图,但我的随机拼图生成正在创建无法解决的拼图实例。这可能是因为我不是计算机科学专业的负责人,但我不确定如何计算代码排列中的反转次数。我想知道如何编写我的代码,以便我可
我正在寻找 8 Puzzle graphs tree generator,最好是 (php+) html+css+javascript。我需要的是类似 3 2 1 6 8 7 5 4 会生成所有可
我住在德国,在 Android Market 上发布“Last Call Widget”。随着时间的推移,我一直在稳步改进它,但一组用户仍然提示它无法在他们的设备上运行。 我的小部件监听“androi
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
我正在尝试制作一个看起来像这样的拼图游戏。我试过的看起来像这样。 https://jsfiddle.net/uccfb46z/ 现在如果我想改变碎片的形状我需要修改这部分 - outside: fu
首先,让我为缺少 SSCCE 表示歉意。我在这方面真的没有足够的专业知识来弄清楚什么是相关的,什么不是。 简而言之,问题是在两台运行相同分辨率 (1366x768) 的不同计算机上,我女朋友的 tum
我是一名优秀的程序员,十分优秀!