原生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 相关文章推荐
Js 订制自己的AlertBox(信息提示框)
Jan 09 Javascript
在IE浏览器中resize事件执行多次的解决方法
Jul 12 Javascript
改变文件域的样式实现思路同时兼容ie、firefox
Oct 23 Javascript
使用 js+正则表达式为关键词添加链接
Nov 11 Javascript
学习JavaScript设计模式之中介者模式
Jan 14 Javascript
javascript判断图片是否加载完成的方法推荐
May 13 Javascript
JS生成和下载二维码的代码
Dec 07 Javascript
详解Vue中状态管理Vuex
May 11 Javascript
使用JS模拟锚点跳转的实例
Feb 01 Javascript
js数组常用最重要的方法
Feb 04 Javascript
vue使用代理解决请求跨域问题详解
Jul 24 Javascript
vue中的 $slot 获取插槽的节点实例
Nov 12 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邮件发送,php发送邮件的类
2011/03/24 PHP
PHP网站备份程序代码分享
2011/06/10 PHP
php中根据变量的类型 选择echo或dump
2012/07/05 PHP
基于php下载文件的详解
2013/06/02 PHP
PHP解析html类库simple_html_dom的转码bug
2014/05/22 PHP
PHP对象相互引用的内存溢出实例分析
2014/08/28 PHP
PHP大文件分片上传的实现方法
2018/10/28 PHP
PHP7新功能总结
2019/04/14 PHP
PHP7 安装event扩展的实现方法
2019/10/08 PHP
在Laravel中实现使用AJAX动态刷新部分页面
2019/10/15 PHP
Laravel实现搜索的时候分页并携带参数
2019/10/15 PHP
JQuery 将元素显示在屏幕的中央的代码
2010/02/27 Javascript
jquery事件重复绑定的快速解决方法
2014/01/03 Javascript
Javascript判断图片尺寸大小实例分析
2014/06/16 Javascript
JavaScript使用function定义对象并调用的方法
2015/03/23 Javascript
JavaScript显示表单内元素数量的方法
2015/04/02 Javascript
jQuery+ajax实现实用的点赞插件代码
2016/07/06 Javascript
javascript将list转换成树状结构的实例
2017/09/08 Javascript
Vue项目打包部署到apache服务器的方法步骤
2021/02/01 Vue.js
Python读取环境变量的方法和自定义类分享
2014/11/22 Python
Python zip()函数用法实例分析
2018/03/17 Python
基于Django框架利用Ajax实现点赞功能实例代码
2018/08/19 Python
python+os根据文件名自动生成文本
2019/03/21 Python
Python面向对象之类和实例用法分析
2019/06/08 Python
如何将tensorflow训练好的模型移植到Android (MNIST手写数字识别)
2020/04/22 Python
解决pycharm debug时界面下方不出现step等按钮及变量值的问题
2020/06/09 Python
基于python的opencv图像处理实现对斑马线的检测示例
2020/11/29 Python
纯CSS实现设置半个字符的样式
2014/07/03 HTML / CSS
预订奥兰多和佛罗里达州公园门票:FloridaTix
2018/01/03 全球购物
档案室主任岗位职责
2014/02/12 职场文书
2015年办公室主任工作总结
2015/04/09 职场文书
离婚案件原告代理词
2015/05/23 职场文书
《鸡兔同笼》教学反思
2016/02/19 职场文书
如何在Mac上通过docker配置PHP开发环境
2021/05/29 PHP
Nginx配置https的实现
2021/11/27 Servers
vue中div禁止点击事件的实现
2022/04/02 Vue.js