原生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 相关文章推荐
用ADODB.Stream转换
Jan 22 Javascript
jQuery验证Checkbox是否选中的代码 推荐
Sep 04 Javascript
js中的scroll和offset 使用比较的实例与分析
Sep 29 Javascript
浅谈angularJS 作用域
Jul 05 Javascript
JS获取下拉框显示值和判断单选按钮的方法
Jul 09 Javascript
jQuery实现鼠标经过时出现隐藏层文字链接的方法
Oct 12 Javascript
如何利用JS通过身份证号获取当事人的生日、年龄、性别
Jan 22 Javascript
如何给ss bash 写一个 WEB 端查看流量的页面
Mar 23 Javascript
利用NPM淘宝的node.js镜像加速nvm
Mar 27 Javascript
Nginx 配置多站点vhost 的方法
Jan 07 Javascript
vue.js或js实现中文A-Z排序的方法
Mar 08 Javascript
javascript实现智能手环时间显示
Sep 18 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
轻松入门: 煮好咖啡的七个诀窍
2021/03/03 冲泡冲煮
[原创]ThinkPHP中SHOW_RUN_TIME不能正常显示运行时间的解决方法
2015/10/10 PHP
谈谈 PHP7新增功能
2015/12/16 PHP
PHP使用PDO操作数据库的乱码问题解决方法
2016/04/08 PHP
Some tips of wmi scripting in jscript (1)
2007/04/03 Javascript
脚本安需导入(装载)的三种模式的对比
2007/06/24 Javascript
js实现双向链表互联网机顶盒实战应用实现
2011/10/28 Javascript
用javascript为页面添加天气显示实现思路及代码
2013/12/02 Javascript
javascript中使用正则计算中文长度的例子
2014/04/29 Javascript
JS在可编辑的div中的光标位置插入内容的方法
2014/11/20 Javascript
jQuery中mouseover事件用法实例
2014/12/26 Javascript
JS简单计算器实例
2015/01/20 Javascript
javascript实现的多个层切换效果通用函数实例
2015/07/06 Javascript
react-redux中connect()方法详细解析
2017/05/27 Javascript
基于JS实现移动端左滑删除功能
2017/07/28 Javascript
详解JavaScript中的数组合并方法和对象合并方法
2018/05/11 Javascript
浅谈JavaScript 代码整洁之道
2018/10/23 Javascript
layui实现form表单同时提交数据和文件的代码
2019/10/25 Javascript
vue 解决异步数据更新问题
2019/10/29 Javascript
vue-calendar-component 封装多日期选择组件的实例代码
2020/12/04 Vue.js
javascript实现数字时钟效果
2021/02/06 Javascript
一个超级简单的python web程序
2014/09/11 Python
python 阶乘累加和的实例
2019/02/01 Python
Django中的静态文件管理过程解析
2019/08/01 Python
Python3进制之间的转换代码实例
2019/08/24 Python
Python DataFrame使用drop_duplicates()函数去重(保留重复值,取重复值)
2020/07/20 Python
使用CSS3实现多列布局与多背景的技巧
2016/02/29 HTML / CSS
Jo Malone美国官网:祖玛珑香水
2017/03/27 全球购物
菲律宾酒店预订网站:Hotels.com菲律宾
2017/07/12 全球购物
在校生自我鉴定
2014/01/23 职场文书
财经学院自荐信范文
2014/02/02 职场文书
党员创先争优承诺书
2014/03/26 职场文书
人代会标语
2014/06/30 职场文书
Matlab求解数组中的最大值及它所在的具体位置
2021/04/16 Python
一篇文章带你搞懂Python类的相关知识
2021/05/20 Python
Windows 11上手初体验:任务栏和开始菜单等迎来大改
2021/11/21 数码科技