原生js实现的金山打字小游戏(实例代码详解)


Posted in Javascript onMarch 16, 2020

首先先来看一下效果图

原生js实现的金山打字小游戏(实例代码详解)原生js实现的金山打字小游戏(实例代码详解)

如果感兴趣的就来看一下Js源码吧

//计分板
var board = {
 dom: document.getElementById("score"),
 maxLost: 3, //最大丢失量
 lost: 0, //当前丢失了多少个
 score: 0, //当前分数
 render: function() {
 //显示
 this.dom.innerHTML =
  "<p>得分:" +
  this.score +
  "</p><p>丢失:" +
  this.lost +
  " / " +
  this.maxLost +
  "</p>";
 },
 //增加一个丢失数
 addLost: function() {
 if (this.lost === this.maxLost) {
  return; //游戏已经结束了
 }
 this.lost++;
 if (this.lost === this.maxLost) {
  //丢失量达到最大
  game.gameOver();
 }
 this.render();
 },
 reset: function() {
 this.lost = 0;
 this.score = 0;
 this.render();
 },
 //增加得分
 addScore: function(number) {
 if (this.lost === this.maxLost) {
  //已经结束了
  return;
 }
 this.score += number;
 this.render();
 }
};

board.render();

var letters = []; //目前的所有字母,一个字母就是一个对象
//字母的容器
var divContainer = document.getElementById("letter-container");
/**
 * 产生一个字母对象,并将其加入到数组中
 */
function createLetter() {
 //创建img元素
 var img = document.createElement("img");
 img.className = "letter";

 divContainer.appendChild(img);

 //设置src路径
 var charNumber = getRandom(65, 65 + 26); //字母的随机ASCII码
 var char = String.fromCharCode(charNumber);
 img.src = "img/letter/" + char + ".png";

 //left随机
 var left = getRandom(0, divContainer.clientWidth - img.width);
 img.style.left = left + "px";

 var letter = {
 dom: img,
 char: char,
 left: left,
 top: -img.height, //初始的top值
 speed: getRandom(100, 500), //速度: 像素/秒
 render: function() {
  this.dom.style.top = this.top + "px";
 },
 // 每调用一次该方法,字母移动一段距离
 // duration是经过的时间: 秒
 move: function(duration) {
  var dis = duration * this.speed; //计算距离
  this.top += dis;
  this.render();
 },
 kill: function() {
  //自杀
  // 从数组中移除
  var index = letters.indexOf(this); //找到字母在数组中的下标
  if (index >= 0) {
  letters.splice(index, 1);
  }
  // 移除dom元素
  this.dom.remove();
 }
 };

 letter.render();

 letters.push(letter);
}

// 根据最小值和最大值产生一个随机整数(不包含最大值)
function getRandom(min, max) {
 // Math.random() 0~1
 // Math.random() * (max - min) 0 ~ (max - min)
 // Math.random() * (max - min) + min min ~ max
 return Math.floor(Math.random() * (max - min) + min);
}

//游戏对象,统筹规划
var game = {
 timerProduce: null, //自动产生字母的timerid
 timerMove: null, //自动移动的timerid
 isOver: false,
 //自动的,不断的,产生字母
 startProduce: function() {
 if (this.timerProduce) {
  return; //正在产生中,什么也不做
 }
 this.timerProduce = setInterval(createLetter, 500);
 },
 //停止自动产生字母
 stopProduce: function() {
 clearInterval(this.timerProduce);
 this.timerProduce = null;
 },
 //开始不断的移动所有字母
 startMove: function() {
 if (this.timerMove) {
  return;
 }
 var duration = 0.016; //间隔时间,秒
 this.timerMove = setInterval(function() {
  for (var i = 0; i < letters.length; i++) {
  var letter = letters[i]; //要移动的字母
  letter.move(duration);
  //判断该字母是不是可以消除了
  if (letter.top >= divContainer.clientHeight) {
   letter.kill();
   i--;
   //丢失
   board.addLost();
  }
  }
 }, duration * 1000);
 },
 //停止移动所有字母
 stopMove: function() {
 clearInterval(this.timerMove);
 this.timerMove = null;
 },
 gameOver: function() {
 this.stopMove();
 this.stopProduce();
 document.getElementById("over").style.display = "block";
 this.isOver = true;
 },
 restart: function() {
 //清空字母
 for (var i = 0; i < letters.length; i++) {
  var letter = letters[i];
  letter.kill();
  i--;
 }
 this.startMove();
 this.startProduce();
 board.reset();
 this.isOver = false;
 document.getElementById("over").style.display = "none";
 }
};

game.startProduce();
game.startMove();

//注册事件
window.onkeydown = function(e) {
 if (game.isOver) {
 return;
 }
 var key = e.key.toUpperCase();
 //匹配
 for (var i = 0; i < letters.length; i++) {
 var letter = letters[i];
 if (letter.char === key) {
  letter.kill();
  board.addScore(10);
  return; //只移除一个
 }
 }
};

仅仅使用js的面向对象编程,可爱的金山打字小游戏就实现了

总结

到此这篇关于原生js实现的金山打字小游戏的文章就介绍到这了,更多相关js金山打字游戏内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
javascript parseInt 大改造
Sep 27 Javascript
jquery validate poshytip 自定义样式
Nov 26 Javascript
onkeydown事件解决按回车键直接提交数据的需求
Apr 11 Javascript
D3.js中data(), enter() 和 exit()的问题详解
Aug 17 Javascript
javascript中JSON.parse()与eval()解析json的区别
May 19 Javascript
JS实现京东首页之页面顶部、Logo和搜索框功能
Jan 12 Javascript
js微信分享实现代码
Oct 11 Javascript
react高阶组件经典应用之权限控制详解
Sep 07 Javascript
Vue中添加手机验证码组件功能操作方法
Dec 07 Javascript
jq.ajax+php+mysql实现关键字模糊查询(示例讲解)
Jan 02 Javascript
微信小程序仿美团城市选择
Jun 06 Javascript
layui table 表格上添加日期控件的两种方法
Sep 28 Javascript
JavaScript实现拖拽效果
Mar 16 #Javascript
js实现点赞效果
Mar 16 #Javascript
Javascript Web Worker使用过程解析
Mar 16 #Javascript
Javascript ParentNode和ChildNode接口原理解析
Mar 16 #Javascript
JS手写一个自定义Promise操作示例
Mar 16 #Javascript
JS函数参数的传递与同名参数实例分析
Mar 16 #Javascript
vue css 引入asstes中的图片无法显示的四种解决方法
Mar 16 #Javascript
You might like
php 抽象类的简单应用
2011/09/06 PHP
js以对象为索引的关联数组
2010/07/04 Javascript
jQuery 1.5最新版本的改进细节分析
2011/01/19 Javascript
javascript加号&quot;+&quot;的二义性说明
2013/03/04 Javascript
JavaScript中诡异的delete操作符
2015/03/12 Javascript
jquery模拟进度条实现方法
2015/08/03 Javascript
JS实现在状态栏显示打字效果完整实例
2015/11/02 Javascript
纯JavaScript基于notie.js插件实现消息提示特效
2016/01/18 Javascript
深入理解JS继承和原型链的问题
2016/12/17 Javascript
javascript中的深复制详解及实例分析
2016/12/29 Javascript
JS检测数组类型的方法小结
2017/03/14 Javascript
Vue生命周期示例详解
2017/04/12 Javascript
AngularJs 延时器、计时器实例代码
2017/09/16 Javascript
js处理包含中文的字符串实例
2017/10/11 Javascript
JavaScript函数绑定用法实例分析
2017/11/14 Javascript
layui中table表头样式修改方法
2018/08/15 Javascript
基于vue-upload-component封装一个图片上传组件的示例
2018/10/16 Javascript
详解Node.js异步处理的各种写法
2019/06/09 Javascript
js对象简介与基本用法示例
2020/03/13 Javascript
es6函数之尾递归用法实例分析
2020/04/25 Javascript
微信小程序开发(二):页面跳转并传参操作示例
2020/06/01 Javascript
使用Python获取CPU、内存和硬盘等windowns系统信息的2个例子
2014/04/15 Python
python提取页面内url列表的方法
2015/05/25 Python
python实现实时监控文件的方法
2016/08/26 Python
python 图片去噪的方法示例
2019/07/09 Python
python使用socket实现的传输demo示例【基于TCP协议】
2019/09/24 Python
已安装tensorflow-gpu,但keras无法使用GPU加速的解决
2020/02/07 Python
tensorflow 分类损失函数使用小记
2020/02/18 Python
详解Python的爬虫框架 Scrapy
2020/08/03 Python
Html5 canvas实现粒子时钟的示例代码
2018/09/06 HTML / CSS
Ibatis中如何提高SQL Map的性能
2013/05/11 面试题
2014年高三毕业生自我评价
2014/01/11 职场文书
详细的大学生创业计划书模板
2014/01/27 职场文书
2015年监理个人工作总结
2015/05/23 职场文书
2016年“我们的节日·清明节”活动总结
2016/04/01 职场文书
vue route新窗口跳转页面并且携带与接收参数
2022/04/10 Vue.js