原生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 相关文章推荐
网页中CDATA标记的说明
Sep 12 Javascript
jQuery Ajax方法调用 Asp.Net WebService 的详细实例代码
Apr 27 Javascript
jquery的ajaxSubmit()异步上传图片并保存表单数据演示代码
Jun 04 Javascript
JS取文本框中最小值的简单实例
Nov 29 Javascript
jQuery学习笔记之jQuery.fn.init()的参数分析
Jun 09 Javascript
JS根据生日月份和日期计算星座的简单实现方法
Nov 24 Javascript
使用Node.js实现RESTful API的示例
Aug 01 Javascript
javascript实现考勤日历功能
Nov 29 Javascript
详解Vue-Router源码分析路由实现原理
May 15 Javascript
JS原型和原型链原理与用法实例详解
Feb 05 Javascript
JS自定义滚动条效果
Mar 13 Javascript
如何在现代JavaScript中编写异步任务
Jan 31 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扩展迁移为PHP7扩展兼容性问题记录
2016/02/15 PHP
php图片添加水印例子
2016/07/20 PHP
PHP结合Redis+MySQL实现冷热数据交换应用案例详解
2019/07/09 PHP
php定期拉取数据对比方法实例
2019/09/22 PHP
PHP使用openssl扩展实现加解密方法示例
2020/02/20 PHP
checkbox 多选框 联动实现代码
2008/10/22 Javascript
IE6下出现JavaScript未结束的字符串常量错误的解决方法
2010/11/21 Javascript
jquery的ajax请求全面了解
2013/03/20 Javascript
21个值得收藏的Javascript技巧
2014/02/04 Javascript
nodejs文件操作模块FS(File System)常用函数简明总结
2014/06/05 NodeJs
用JavaScript实现用一个DIV来包装文本元素节点
2014/09/09 Javascript
分析js闭包引起的事件注册问题
2016/03/29 Javascript
ionic开发中点击input时键盘自动弹出
2016/12/23 Javascript
Jquery鼠标放上去显示全名的实现方法
2017/02/06 Javascript
实例分析JS中的相等性判断===、 ==和Object.is()
2019/11/17 Javascript
[01:00:06]加油DOTA_EP01_网络版
2014/08/09 DOTA
[03:27]《辉夜杯》线下训练营 导师CU和海涛指点迷津
2015/10/23 DOTA
跟老齐学Python之折腾一下目录
2014/10/24 Python
python实现多线程网页下载器
2018/04/15 Python
django解决跨域请求的问题
2018/11/11 Python
使用Python 统计高频字数的方法
2019/01/31 Python
解决json中ensure_ascii=False的问题
2020/04/03 Python
pandas的resample重采样的使用
2020/04/24 Python
Python pip install如何修改默认下载路径
2020/04/29 Python
浅谈python3打包与拆包在函数的应用详解
2020/05/02 Python
TensorFlow的环境配置与安装教程详解(win10+GeForce GTX1060+CUDA 9.0+cuDNN7.3+tensorflow-gpu 1.12.0+python3.5.5)
2020/06/22 Python
用CSS3实现无限循环的无缝滚动的示例代码
2017/11/01 HTML / CSS
请说出你所知道的线程同步的方法
2013/04/19 面试题
北京RT科技有限公司.net工程师面试题
2013/02/15 面试题
高考标语大全
2014/06/05 职场文书
2015新学期开学寄语
2015/02/26 职场文书
实验室安全管理制度
2015/08/05 职场文书
宿舍管理制度范本
2015/08/07 职场文书
2016消防宣传标语口号
2015/12/26 职场文书
公司转让协议书
2016/03/19 职场文书
CSS的class与id常用的命名规则
2021/05/18 HTML / CSS