原生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 相关文章推荐
iframe的父子窗口之间的对象相互调用基本用法
Sep 03 Javascript
用正则表达式替换图片地址img标签
Nov 22 Javascript
jQuery插件开发的五种形态小结
Mar 04 Javascript
基于jQuery的网页影音播放器jPlayer的基本使用教程
Mar 08 Javascript
简单谈谈原生js的math对象
Jun 27 Javascript
shiro授权的实现原理
Sep 21 Javascript
详解node.js中的npm和webpack配置方法
Jan 21 Javascript
JavaScript 性能提升之路(推荐)
Apr 10 Javascript
Node.js实现简单的爬取的示例代码
Jun 25 Javascript
微信小程序实现一张或多张图片上传(云开发)
Sep 25 Javascript
Angular之jwt令牌身份验证的实现
Feb 14 Javascript
VSCode插件安装完成后的配置(常用配置)
Aug 24 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&amp;java(二)
2006/10/09 PHP
php数组索引的Key加引号和不加引号的区别
2014/08/19 PHP
twig模板获取全局变量的方法
2016/02/05 PHP
PHP字典树(Trie树)定义与实现方法示例
2017/10/09 PHP
php解决crontab定时任务不能写入文件问题的方法分析
2019/09/16 PHP
javascript Math.random()随机数函数
2009/11/04 Javascript
js中关于String对象的replace使用详解
2011/05/24 Javascript
在JS数组特定索引处指定位置插入元素的技巧
2014/08/24 Javascript
jQuery 选择器详解
2015/01/19 Javascript
DOM基础教程之使用DOM设置文本框
2015/01/20 Javascript
js制作带有遮罩弹出层实现登录注册表单特效代码分享
2015/09/05 Javascript
jquery插件jquery.dragscale.js实现拖拽改变元素大小的方法(附demo源码下载)
2016/02/25 Javascript
微信小程序 form组件详解
2016/10/25 Javascript
JavaScript实现QQ聊天消息展示和评论提交功能
2017/05/22 Javascript
jQuery正则验证注册页面经典实例
2017/06/10 jQuery
web前端开发中常见的多列布局解决方案整理(一定要看)
2017/10/15 Javascript
vue项目环境变量配置的实现方法
2018/10/12 Javascript
JavaScript学习笔记之图片库案例分析
2019/01/08 Javascript
从0到1学习JavaScript编写贪吃蛇游戏
2020/07/28 Javascript
[04:49]期待西雅图之战 2016国际邀请赛中国区预选赛WINGS战队赛后采访
2016/06/29 DOTA
Pyramid Mako模板引入helper对象的步骤方法
2013/11/27 Python
将Python中的数据存储到系统本地的简单方法
2015/04/11 Python
Python简单遍历字典及删除元素的方法
2016/09/18 Python
python 画3维轨迹图并进行比较的实例
2019/12/06 Python
Python如何基于Tesseract实现识别文字功能
2020/06/05 Python
python+django+selenium搭建简易自动化测试
2020/08/19 Python
python中Pexpect的工作流程实例讲解
2021/03/02 Python
项目施工员岗位职责
2014/03/09 职场文书
2014年两会学习心得范例
2014/03/17 职场文书
节能标语大全
2014/06/21 职场文书
平安工地汇报材料
2014/08/19 职场文书
2014年国庆节庆祝建国65周年比赛演讲稿
2014/09/21 职场文书
2014年话务员工作总结
2014/11/19 职场文书
工程部岗位职责范本
2015/04/11 职场文书
开业庆典嘉宾致辞
2015/08/01 职场文书
Flask response响应的具体使用
2021/07/15 Python