使用uniapp实现双简版本wordle

我正在参加掘金社区游戏创意投稿大赛团队赛,详情请看:游戏创意投稿大赛

简介

Wordle是一款网页猜字谜游戏,玩法是尝试填入字母根据提示组成正确的单词。

汉兜是由Vue核心团队一位大佬:Antfu 开发的中文版wordle,字母改为汉字,单词改为成语,每天更新一个成语。

盘点游戏规则、需求

需求:实现一个无限模式双简版本wordle(简体中文&简单化)。 原版的汉兜是每天凌晨更新一题,这里为了增加游戏的可玩性我们打算实现一个可无限猜题版

  • 游戏分享
  • 记分板
  • 游戏简单化

开始体验 源码

使用技术

uniapp:是一个使用vue.js开发所有前端应用的框架。 wordle这款游戏交互不是很多,所以我们打算使用uniapp。 因为前不久刚跟着大帅老师使用uniapp搞了一个壁纸小程序,而且uniapp有云开发平台:uniCloud可以使用。

pinyin-pro

依赖:pinyin-pro 一款 “专业的汉字拼音转换工具”!

开发流程

uniapp官方推荐的开发工具为 HBuilderX,但是我平时习惯用vscode工具,不想更换编辑器,然后看到了这篇教程:使用vscode工具开发,教程比较详尽 我这里不在赘述。

拼音匹配规则

拼音匹配规则详见我队友的文章:汉林:使用uniapp来实现wordle,来看看成语你能猜对几分

分享模块

分享有复制文本和下载图片两种方式: 1、复制文本

// 使用uni提供API
uni.setClipboardData({
    data: "some text...",
    success: () => uni.showToast({
	title: '复制成功',
	duration: 2000
    }),
   fail: () => console.warn("复制失败");
})
复制代码

2、图片分享

看了几个uniapp生成分享海报的插件感觉 不是很好用的样子,生成海报也不是很难的样子,于是干脆自己动手写一下吧:

  • 使用canvas 绘制图片。
  • 使用uni.canvasToTempFilePath API:把当前画布指定区域的内容导出生成指定大小的图片。
// 使用canvas先绘制图片
drawPoster() {
    var context = uni.createCanvasContext('canvas')
    context.font = '20px ui-serif,Georgia,Cambria,"Times New Roman",Times,serif'
    context.fillStyle = '#FFFFFF'
		
    // 注:这里绘制图片第一个参数为图片地址,不用创建img元素,当时没仔细看文档 new Img()元素 一直绘不出图片
    const honorBg = '/static/honor_bg.png'
    context.drawImage(honorBg, 0, 0, 360, 540)

    const src = '/static/qrcode.png'
    context.drawImage(src, 28, 380, 120, 120)

    this.drawText(16, '#666', '汉林·双简版wordle', 190, 455, context)
    // ... some thing else

    context.draw()
},
// 绘制文本
drawText(size, color, content, drawX, drawY, context) {
    context.setFontSize(size)
    context.setFillStyle(color)
    context.fillText(content, drawX, drawY)
}
createImg() {
    const that = this
    uni.canvasToTempFilePath({
        canvasId: 'canvas',
        success: function(res) {
            // 目前先考虑H5下载,其他平台下载 可直接调用uni.saveFile()API
            // 在H5平台下,tempFilePath 为 base64
            that.srcBase64 = res.tempFilePath
        }
    })		
},
复制代码
  • 图片保存分享:因为H5 目前不支持文件保存到本地(uni.saveFile(OBJECT)),浏览器可在或得用户授权后下载到文件中、但微信浏览器下载有问题;所以 目前方案为:移动端提示用户长按保存图片、pc端可提示用户点击下载。具体实现如下:
/**
* 使用uni.getSystemInfoSync()获取设备信息,判断用户设备。
* 1、base64格式图片转换成blob对象 
* 2、将blob对象封装到a标签中置入页面
* 3、模拟点击a标签触发下载请求
*/

downloadImg(base64 = this.srcBase64) {
    var arr = base64.split(',')
    var bytes = atob(arr[1])
    let ab = new ArrayBuffer(bytes.length)
    let ia = new Uint8Array(ab)
    for (let i = 0; i < bytes.length; i++) {
            ia[i] = bytes.charCodeAt(i)
    }

    const blob = new Blob([ab], {
            type: 'application/octet-stream'
    })
    const _URL = window.URL || window.webkitURL
    const url = _URL.createObjectURL(blob)

    let dom = document.createElement("a")
    dom.style.display = "none"
    dom.href = url
    dom.setAttribute("download", "汉林_猜成语游戏.png")
    document.body.appendChild(dom)
    dom.click() // 模拟点击这个a标签触发下载请求
    dom.remove() 
},
复制代码

总结

这款小游戏还有很多需要优化完善的地方:声调、元音辅音规则、称号可配制化等等问题,但是这两天刷原版的汉兜游戏发现竟然也有bug我就释然了,嗯~以后有时间慢慢改...

最后感谢大帅老师的支持指导。大帅老师创建的“猿创营”氛围非常好,很多小伙伴一起沟通讨论问题。 感谢执行力超强的队友warn完成了大部分内容!

猜你喜欢

转载自juejin.im/post/7087938140446392357
今日推荐