【HTML】【消失的花木兰】花木兰:三兔蹦迪走,安能辨我是兔子?
前言
(改编)
某日,参军后的花木兰刚回到家乡,却不料遇上抓拿自己的官兵… 因此,花木兰变成兔子躲了起来,你能否找到躲起来的花木兰呢?一起来拭目以待…
一、游戏名称与游戏规则(玩法)
游戏名称
花木兰:安能辨我是兔子
游戏规则(玩法)
游戏的规则非常简单,游戏开始后,花木兰会变成兔子,会与另外两只一模一样的兔子进行交换位置。找到最后的花木兰所变的兔子的位置即可获胜!
玩法如图所示(会有背景声音,也可进行关闭声音。):
二、大体设计与代码讲解
大体设计
- 首先,找素材(图片和音频)。弄个背景图,这里选择青青草地。(让兔子在进行跳跃起来的时候,能达到合理)
- 我们曾经玩过躲包包的游戏,学习了互换位置的思路。我们在这个基础上实现平行移动互换位置,并且完成小幅度的跳跃即可。(代码中有注释)
代码讲解
由于代码也比较简单,而且也有注释;这里就直接上完整的代码啦~
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="description" content="花木兰:安能辨我是兔子, 南方者"><meta name="keywords" content="花木兰:安能辨我是兔子, 南方者"><title>花木兰:安能辨我是兔子</title><link rel="shortcut icon" href="./img/rabbit.png" size="32x32">
</head><body><div class="head"><h1>花木兰:安能辨我是兔子</h1><h1 style="color: red; cursor: pointer;" onclick="gameStart()">开始游戏</h1><h3 onclick="changeBGM()">声音状态:<span id="bgmStatus">开启</span>(点击这里可关闭)</h3><div style="font-size: medium; color: #919191;">(注意:背景声音会有些大。)</div></div><div class="game"><div class="rabbit" onclick="gameOver(0)"><div style="display: none;" class="v-talk"><img src="./img/talk.png" alt=""></div><img class="i-rabbit" src="./img/rabbit.png" alt="" style="opacity: 1;"></div><div class="rabbit" onclick="gameOver(1)"><div style="display: none;" class="v-talk"><img src="./img/talk.png" alt=""></div><img class="i-rabbit" src="./img/rabbit.png" alt="" style="opacity: 1;"></div><div class="rabbit" onclick="gameOver(2)"><div style="display: none;" class="v-talk"><img src="./img/talk.png" alt=""></div><!-- <img src="./img/Mulan.png" alt="" id="mulan" style="opacity: 1;"> --><!-- <img src="./img/rabbit.png" alt=""> --><img class="i-rabbit" src="./img/rabbit.png" alt="" style="opacity: 1;"></div></div><!-- 信息弹窗框 (该初始模板来源地址:http://www.webkaka.com/tutorial/html/2021/1015185/)--><div class="modal-dialog" id="modal-dialog"><div class="modal-header"><h2 id="modal-title">提示框标题</h2><span class="btn-close" onclick="closeModal()">×</span></div><div class="modal-body"><p id="modal-content">内容</p></div><div class="modal-footer"><span class="btn" onclick="closeModal()">确定</span></div></div>
</body></html>
<script>var isPlayBgm = true;var talkList = document.getElementsByClassName("v-talk");// var mulan = document.getElementById("mulan");var imgList = document.getElementsByClassName('i-rabbit');var isStart = false;var isMove = false;var answer = getRan(); // 随机生成木兰的位置,0,1,2function getRan() {return Math.floor(Math.random() * 3);}imgList[answer].src = "./img/Mulan.png"; // 设置为木兰// console.log("init answer:", answer)// gameStart();function gameStart() {// console.log(mulan)// console.log("answer:", answer)if (isStart || isMove) {return;}var mulan = imgList[answer];isStart = true;isMove = true;var count = 1;talkList[answer].style.display = "";talkList[answer].style.opacity = 0.8;mulan.style.opacity = 1;playBGM('./mp3/change.mp3');// 播放木兰变身动画var interval = setInterval(() => {var opacity = mulan.style.opacity;// console.log(opacity);if (opacity <= 0) {window.clearInterval(interval)// 播放变身成兔子(“碰”的一声)changeBody();return;}opacity -= count * 0.28;// console.log(opacity, count);if (0.8 > opacity)talkList[answer].style.opacity = opacity;mulan.style.opacity = opacity;count++;}, 400);}function changeBody() {var mulan = imgList[answer];// console.log(mulan)setTimeout(() => {talkList[answer].style.display = "none";}, 200)setTimeout(() => {mulan.src = "./img/smoke.png";playBGM('./mp3/peng.mp3');mulan.style.opacity = 0.8;}, 300)setTimeout(() => {mulan.style.opacity = 1;mulan.src = "./img/rabbit.png";setTimeout(() => {move(5); // 移动5次}, 200);}, 800)changePointer(true);}// window.onload = function () { move(2); }function move(sum) {// 小兔跳动(移动)// moveOne(imgList[0], imgList[1]);var num = getRan();while (answer == num) {num = getRan();}moveOne(answer, num, sum);}function moveOne(p1, p2, sum) {var node1 = imgList[p1], node2 = imgList[p2];// console.log("p1:", p1, "p2:", p2, "answer:", answer)playBGM("./mp3/jump.mp3");var t1 = node1.offsetTop;var l1 = node1.offsetLeft;var t2 = node2.offsetTop;var l2 = node2.offsetLeft;// console.log(node1, node1.offsetLeft, node2, node2.offsetLeft)// console.log("l1:" + l1, "t1:" + t1, " --- ", "l2:" + l2, "t2:" + t2);var moveX = Math.abs(l1 - l2); // 取绝对值var moveY = Math.abs(t1 - t2);var translate1 = "-webkit-transform:";var translate2 = "-webkit-transform:";var translate1;var translate2;if (l1 >= l2) {translate1 += " translate(" + String(moveX) + "px,";translate2 += " translate(" + String(-moveX) + "px,";} else {translate1 += " translate(" + String(-moveX) + "px,";translate2 += " translate(" + String(moveX) + "px,";}node1.classList.add("game-trans");node2.classList.add("game-trans");// console.log(translate2, translate1)node1.style.cssText = translate2 + String(-100) + "px);"; // y轴进行范围性移动node2.style.cssText = translate1 + String(-100) + "px);";setTimeout(function () {node1.style.cssText = translate2 + String(0) + "px);";node2.style.cssText = translate1 + String(0) + "px);";sum--;setTimeout(function () {// 这里瞬间变回原来的位置,实际上是并没有变化的。// 主要是为了形成视觉上的切换,因此只需要记录最终位置即可。(即 anster 的最终值)node1.classList.remove("game-trans");node2.classList.remove("game-trans");node1.style.cssText = "translate(0px,0px)";node2.style.cssText = "translate(0px,0px)";}, 800);if (p1 == answer) {answer = p2;} else if (p2 == answer) {answer = p1;}if (sum < 0) {isMove = false;return;}var num1 = getRan();var num2 = getRan();while (num2 == num1) {num2 = getRan();}setTimeout(() => {moveOne(num1, num2, sum);}, 1000)}, 300);}function changePointer(isPointer) {var imgList = document.getElementsByTagName('img');// 图片是否变鼠标滑入变小手var txt = "";if (isPointer) {txt = "pointer";}for (img of imgList) {// console.log(img)img.style.cursor = txt;}}function playBGM(url) {if (!isPlayBgm) {// 当前不开启return;}//浏览器适用 contextClass = window.AudioContext = window.AudioContext || window.webkitAudioContext || window.mozAudioContext || window.msAudioContext;try {var context = new contextClass();var source = null;var audioBuffer = null;function stopSound() {if (source) {source.stop(0); //立即停止}}function playSound() {source = context.createBufferSource();source.buffer = audioBuffer;source.loop = false;source.connect(context.destination);source.start(0); //立即播放 }function initSound(arrayBuffer) {context.decodeAudioData(arrayBuffer, function (buffer) { //解码成功时的回调函数audioBuffer = buffer;playSound();}, function (e) { //解码出错时的回调函数console.log('404', e);});}function loadAudioFile(url) {var xhr = new XMLHttpRequest(); //通过XHR下载音频文件xhr.open('GET', url, true);xhr.responseType = 'arraybuffer';xhr.onload = function (e) { //下载完成initSound(this.response);};xhr.send();}//这里用来存储背景音乐的路径loadAudioFile(url);} catch (e) {console.log('无法找到音乐!');}}function changeBGM() {var bgmStatus = document.getElementById("bgmStatus");// console.log(bgmStatus);var txt = "";if (isPlayBgm) {isPlayBgm = false;txt += "关闭";} else {isPlayBgm = true;txt += "开启";}// console.log(txt)bgmStatus.innerHTML = txt;}// 展开答案并且判断是否正确function gameOver(id) {if (!isStart || isMove) { // 游戏未开始 或 正在跳动return;}var titleValue, contentValue;// console.log("end answer:", answer, id)if (answer == id) {playBGM("./mp3/victory.mp3")titleValue = "胜利!";contentValue = "恭喜你成功找到了变身的兔子!<br>成功拿下花木兰!";} else {playBGM("./mp3/defeat.mp3")titleValue = "失败!";var text = "";switch (answer) {case 0:text = "第一个";break;case 1: text = "中间";break;case 2: text = "最后一个";break;}contentValue = "很抱歉,你找的并不是花木兰。<br>花木兰太狡猾了,她躲在了" + text + "!";}showModalMsg(titleValue, contentValue);imgList[answer].src = "./img/Mulan.png";changePointer(false);isStart = false;}// 显示弹窗框function showModalMsg(titleValue, contentValue) {var title = document.getElementById("modal-title");title.innerText = titleValue;var content = document.getElementById("modal-content");content.innerHTML = contentValue;var modal = document.getElementById("modal-dialog");modal.style.display = "block";}// 关闭弹窗框function closeModal() {var modal = document.getElementById("modal-dialog");modal.style.display = "";}</script>
<style>.head {position: fixed;width: 100%;text-align: center;}.head h1 {font-size: -webkit-xx-large;}body {/* 背景图设置 */background: url("./img/bg.png") no-repeat center center;background-size: cover;background-attachment: fixed;margin: 0px;}body,html,.game {height: 100%;width: 100%;/* margin: 50px; */}.game {display: flex;justify-content: space-around;}.rabbit {display: flex;/* 垂直居中 */align-items: center;/* 水平居中 */justify-content: center;/* 文字居中 */text-align: center;height: 100%;width: 25%;/* background: #000; */}img {max-width: 100%;max-height: 100%;}.game-trans {transition: transform 0.5s linear 0s;}.modal-body {padding: 20px;}.modal-header,.modal-footer {padding: 10px 20px;}.modal-header {border-bottom: #eee solid 1px;}.modal-header h2 {font-size: 20px;}.modal-footer {border-top: #eee solid 1px;text-align: right;}.modal-dialog {display: none;background: #fefefe;border: #333 solid 1px;border-radius: 5px;margin-left: -180px;margin-top: -50px;position: fixed;left: 50%;top: 30%;z-index: 11;width: 360px;}.btn-close {cursor: pointer;color: #aaa;font-size: 30px;text-decoration: none;position: absolute;right: 5px;top: 0;}.btn-close:hover {color: #919191;}.btn {cursor: pointer;background: #428bca;border: #357ebd solid 1px;border-radius: 3px;color: #fff;display: inline-block;font-size: 14px;padding: 8px 15px;text-decoration: none;text-align: center;min-width: 60px;position: relative;transition: color 0.1s ease;}.btn:hover {background: #357ebd;}.v-talk {position: fixed;z-index: 10;opacity: 0.8;}
</style>
仓库地址与体验地址
大家可以直接来笔者的网站来体验
在线体验(pc端):体验传送门
仓库地址:暂无(想要的可以直接去扒笔者的网站传送门 )
以前的小游戏
- 【HTML】【休闲益智】还有9块月饼并未获得!请及时出战!(解锁月饼小游戏 - 掘金 (juejin.cn)
- 【微信小游戏】合成大灯笼 丨 2022
【HTML】【消失的花木兰】花木兰:三兔蹦迪走,安能辨我是兔子?相关推荐
- 雄兔脚扑朔,雌兔眼迷离;双兔傍地走,安能辨我是雄雌?——golang接口的概念
古有花木兰替父从军,安能识我是女郎?今有golang接口隐式实现.对于一个具体的类型,无须声明它实现了哪些接口,只要提供接口所必需的方法即可. 因为golang是我新学的语言,我们先看看其他语言中接口 ...
- rust怎么上邮轮_20年内泰坦尼克号将消失 英公司推三千米沉船之旅
1912年,搭乘泰坦尼克号旅行是一件奢侈的事儿.一个多世纪后的今天,仍然如此.伦敦一家名为蓝色大理石的私人旅行公司将在2018年5月推出泰坦尼克沉船潜水之旅,荷包足够鼓的游客将有机会亲眼一睹这艘20世 ...
- 米兔机器人第三代测评_这只兔子有点酷—米兔积木机器人履带机甲测评
这只兔子有点酷-米兔积木机器人履带机甲测评 2018-09-22 14:12:04 1点赞 1收藏 0评论 一.写在开篇 谈起积木可能多数人都停留在童年那简易的七巧板吧,现在的孩子很多都非常迷恋乐高, ...
- 安兔兔评测HTML5,安兔兔评测
[PConline 资讯]10nm制程.骁龙835.双镜头大概是上半年手机市场的关键词,一大波新机潮是否让你眼花缭乱了呢?日前,安兔兔公布6月手机好评榜/性能榜TOP10,半路竟然杀出个黑马. ▍最大 ...
- iphone android 安兔兔,iPhone XR安兔兔跑分曝光,性能碾压一切Android手机
10月19日15点01分,与iPhone XS.iPhone XS Max一同发布的iPhone XR将迎来首销预购,iPhone XR是有史以来配色最为丰富的iPhone手机,而且采用了苹果经典的刘 ...
- 三天打入CV大赛决赛圈!我是如何做到的?
学人工智能,为什么我说,你必须参与一次AI大赛? 在人工智能领域,不管是国外的Kaggle,还是阿里天池.DataCastle.科赛网,每年都会举办各种各样类型的比赛,很多人会有这样的疑问,参加这种大 ...
- 三年前赚走马云665亿的外卖小哥,现在怎么样了?
作者:电商君 来源:电商报Pro ID:kandianshang 中国最牛外卖小哥, 一单外卖赚了马云665亿! 2018年4月,一个年仅33岁的年轻人以665亿的价格,将自己读书时创办的一个品牌卖给 ...
- 苹果x用安兔兔测试html5,安兔兔跑分23万,苹果iPhone X怎么样?
苹果iPhone X,最新款苹果手机,也是当下诸多消费者最关注的智能手机之一.但是,8388元起步的高昂售价,只能让普通消费者望而却步. 如今,苹果iPhone X上市32天,软件适配是否又有新进展? ...
- 科三考试邢台市交安考试路线
上车准备 绕车 模拟灯光 模拟灯光考试已结束,关闭灯光. 起步准备工作 一调二系三打火 调座椅 系安全带 打火 起步,左三右二 先打左转向灯,5秒后鸣三下喇叭,后打右转向灯,进入右二车道. 起步时,左 ...
最新文章
- arm32 linux 内存分布,gcc代码反汇编查看内存分布[2]: arm-linux-gcc
- jboss1.7_在JBoss 7中使用HA Singleton
- asp.net oracle优化,[转]ASP.NET性能优化
- 训练网络loss出现Nan的原因总结记录
- 解密QQ非会员漫游聊天记录
- Windows Android Studio生成javadoc
- android service onlowmemory,Android乱弹onLowMemory()和onTrimMemory()
- mysql8安装版安装教程_MySQL8.0版本安装教程
- sqlplus中清理屏幕语句_sqlplus的小秘密[转]
- 设计模式之GOF23代理模式02
- 喜洋洋大战灰太狼(大结局)
- 盲目的相信——写在购买陆谷孙先生主编的《英汉大词典》之后
- 交换Button中图片与文字左右位置
- Java中将List分组到Map中算法(可用于android联系人拼音分组)
- 1389: 程序员PIPI II
- Win11的几个实用技巧系列之不能玩植物大战僵尸、如何彻底删除360所有文件
- -moz、-ms、-webkit, -o各什么意思
- 北京智和信通:交换机策略查询与自动化配置
- C++使用FFmpeg库实现图片转视频
- vb6.0 Access数据库
热门文章
- 雄兔脚扑朔,雌兔眼迷离;双兔傍地走,安能辨我是雄雌?——golang接口的概念