原生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 相关文章推荐
Jquery Ajax学习实例7 Ajax所有过程事件分析示例
Mar 23 Javascript
ajax异步刷新实现更新数据库
Dec 03 Javascript
document节点对象的获取方式示例介绍
Dec 24 Javascript
javascript常用方法总结
May 14 Javascript
laypage分页控件使用实例详解
May 19 Javascript
js正则表达式replace替换变量方法
May 21 Javascript
JS加载器如何动态加载外部js文件
May 26 Javascript
JavaScript、C# URL编码、解码总结
Jan 21 Javascript
JavaScript订单操作小程序完整版
Jun 23 Javascript
详解vue axios二次封装
Jul 22 Javascript
详解VUE里子组件如何获取父组件动态变化的值
Dec 26 Javascript
Javascript中的this,bind和that使用实例
Dec 05 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流量统计功能的实现代码
2012/09/29 PHP
Windows下的PHP安装pear教程
2014/10/24 PHP
php连接MSsql server的五种方法总结
2018/03/04 PHP
JScript中的&quot;this&quot;关键字使用方式补充材料
2007/03/08 Javascript
客户端 使用XML DOM加载json数据的方法
2010/09/28 Javascript
Jquery阻止事件冒泡 event.stopPropagation
2011/12/11 Javascript
js复制到剪切板的实例方法
2013/06/28 Javascript
node.js中的http.response.write方法使用说明
2014/12/14 Javascript
浅谈javascript中自定义模版
2015/01/29 Javascript
在JavaScript中使用NaN值的方法
2015/06/05 Javascript
js正则匹配出所有图片及图片地址src的方法
2015/06/08 Javascript
通过js获取上传的图片信息(临时保存路径,名称,大小)然后通过ajax传递给后端的方法
2015/10/01 Javascript
jQuery侧边栏实现代码
2016/05/06 Javascript
Javascript字符串拼接小技巧(推荐)
2016/06/02 Javascript
angular.js 路由及页面传参示例
2017/02/24 Javascript
用nodeJS搭建本地文件服务器的几种方法小结
2017/03/16 NodeJs
vue实现多个元素或多个组件之间动画效果
2018/09/25 Javascript
es6数值的扩展方法
2019/03/11 Javascript
基于elementUI使用v-model实现经纬度输入的vue组件
2019/05/12 Javascript
JavaScript 作用域scope简单汇总
2019/10/23 Javascript
JS脚本实现定时到网站上签到/签退功能
2020/04/22 Javascript
原生js实现照片墙效果
2020/10/13 Javascript
[04:40]2016国际邀请赛中国区预选赛全程TOP10镜头集锦
2016/07/01 DOTA
13个最常用的Python深度学习库介绍
2017/10/28 Python
Pyqt5 关于流式布局和滚动条的综合使用示例代码
2020/03/24 Python
在keras里实现自定义上采样层
2020/06/28 Python
简述python Scrapy框架
2020/08/17 Python
Javascript 高级手势使用介绍
2013/04/21 HTML / CSS
奥地利汽车配件店:Pkwteile.at
2017/03/10 全球购物
Monki官网:斯堪的纳维亚的独立时尚品牌
2020/11/09 全球购物
教你打造完美的创业计划书
2014/01/06 职场文书
承诺书范文
2014/06/03 职场文书
中国梦读书活动总结
2014/07/10 职场文书
2015年事业单位办公室文员工作总结
2015/04/24 职场文书
浅谈golang 中time.After释放的问题
2021/05/05 Golang
Vue3.0 手写放大镜效果
2021/07/25 Vue.js