原生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 限制输入脚本大全
Nov 03 Javascript
JavaScript中的null和undefined解析
Apr 14 Javascript
js获取当前日期代码适用于网页头部
Jun 27 Javascript
Angularjs制作简单的路由功能demo
Apr 14 Javascript
整理Javascript数组学习笔记
Nov 29 Javascript
JS密码生成与强度检测完整实例(附demo源码下载)
Apr 06 Javascript
jquery.serialize() 函数语法及简单实例
Jul 08 Javascript
详解vuelidate 对于vueJs2.0的验证解决方案
Mar 09 Javascript
再谈Angular4 脏值检测(性能优化)
Apr 23 Javascript
vue动态加载SVG文件并修改节点数据的操作代码
Aug 17 Javascript
Element-ui树形控件el-tree自定义增删改和局部刷新及懒加载操作
Aug 31 Javascript
Javascript节流函数throttle和防抖函数debounce
Dec 03 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
php5编程中的异常处理详细方法介绍
2008/07/29 PHP
PHP 返回13位时间戳的实现代码
2016/05/13 PHP
PHP实现微信提现(企业付款到零钱)
2019/08/01 PHP
使用Rancher在K8S上部署高性能PHP应用程序的教程
2020/07/10 PHP
HTML IMG标签 onload 内存溢出导致浏览器CPU占用过高
2021/03/09 Javascript
jquery win 7透明弹出层效果的简单代码
2013/08/06 Javascript
JavaScript实现班级随机点名小应用需求的具体分析
2014/05/12 Javascript
jQuery中addClass()方法用法实例
2015/01/05 Javascript
浅谈JavaScript数据类型及转换
2015/02/28 Javascript
javascript给span标签赋值的方法
2015/11/26 Javascript
JavaScript操作select元素和option的实例代码
2016/01/29 Javascript
详解VueRouter进阶之导航钩子和路由元信息
2017/09/13 Javascript
vue结合Echarts实现点击高亮效果的示例
2018/03/17 Javascript
bootstrap模态框弹出和隐藏,动态改变中间内容的实例
2018/08/10 Javascript
Vue开发之封装上传文件组件与用法示例
2019/04/25 Javascript
全网小程序接口请求封装实例代码
2020/11/06 Javascript
Python获取任意xml节点值的方法
2015/05/05 Python
python脚本设置系统时间的两种方法
2016/02/21 Python
Django框架实现的简单分页功能示例
2018/12/04 Python
Python面向对象思想与应用入门教程【类与对象】
2019/04/12 Python
flask框架路由常用定义方式总结
2019/07/23 Python
python3字符串操作总结
2019/07/24 Python
Python3 批量扫描端口的例子
2019/07/25 Python
django日志默认打印request请求信息的方法示例
2020/05/17 Python
使用HTML5的Canvas绘制曲线的简单方法
2015/09/08 HTML / CSS
NBA德国官方网上商店:NBA Store德国
2018/04/13 全球购物
Eagle Eyes Optics鹰眼光学:高性能太阳镜
2018/12/07 全球购物
安踏官方商城:anta.cn
2019/12/16 全球购物
自荐信的禁忌和要点
2013/10/15 职场文书
心得体会开头
2014/01/01 职场文书
数学系毕业生的自我评价
2014/01/10 职场文书
婚礼答谢宴主持词
2014/03/14 职场文书
教师党员自我评议不足范文
2014/10/19 职场文书
2016年119消防宣传日活动总结
2016/04/05 职场文书
Ajax实现三级联动效果
2021/10/05 Javascript
MySQL悲观锁与乐观锁的实现方案
2021/11/02 MySQL