用JS写了一个打字游戏,反正我是通不了关
今天想写个简单的游戏, 打字游戏好像都没写过, 那么就写打字游戏吧, gamePad包含了关卡的信息, 可以用来调整给个关卡字符下落的速度;
getRandom函数会返回一个字符对象, 这个对象包含了字符下落的速度和当前被定位的x,y值, 一整框代码比较有借鉴的地方就是, 只用了一个定时器, 而不是每一个字符都用一个定时器, 那样会严重影响性能;
没使用第三方的库, 纯手贱, 用原生的js写游戏
<html>
<head>
<meta charset="utf-8">
<style>
#conatiner{
width:400px;
height:500px;
border:1px solid #eee;
position: relative;
}
</style>
</head>
<body>
<span>typing</span>
<div>
<span id="score"></span>得分
</div>
<div id="conatiner"> </div>
<button id="start">开始游戏</button>
</body>
<script>
var gamePad = {
: {
speed :
},
: {
speed :
},
: {
speed :
},
: {
speed :
},
: {
speed :
}
}
var getRandom = function() {
//随即一个97到122的字符;
var charCode = +Math.floor(Math.random()*);
var speed = Math.ceil(Math.random()*);
return {
code : String.fromCharCode(charCode),
speed : speed,
y : ,
x : Math.floor(Math.random()*),
}
};
function game( n , score ) {
var eConatiner = document.getElementById("conatiner");
var eScore = document.getElementById("score");
var showArr = []; //字符对象的列表
var shoted = ;
//随机一个字符对象, 包含了字符的运动速度,字符的值
//让showArr这个数组的数据运动;
var run = function() {
//随机生成字符对象
if(Math.random()>0.9) {
var obj = getRandom();
showArr.push(obj);
}
//让元素运动
for(var i= ;i < showArr.length; i++) {
showArr[i].y+=showArr[i].speed;
if(showArr[i].y>) {
//showArr.splice(i,1);
clear();
alert("游戏失败");
location.reload();
}
}
eConatiner.innerHTML = "";
//让元素添加到界面中;
for(var i= ;i < showArr.length; i++) {
var eSpan = document.createElement("span");
eSpan.style.position = "absolute";
eSpan.innerHTML = showArr[i].code;
eSpan.style.left = showArr[i].x;
eSpan.style.top = showArr[i].y;
eConatiner.appendChild(eSpan);
}
}
var keyup = function(ev) {
for(var i= ;i < showArr.length; i++) {
if(showArr[i].code === ev.key || String.fromCharCode(ev.keyCode).toLowerCase() == showArr[i].code) {
showArr.splice(i,);
shoted++;
eScore.innerHTML = shoted;
if(shoted === score && gamePad[n+] === undefined) {
alert("少侠你好厉害, 你好快, 真的好快好快的");
}else if(shoted === score) {
clear();
alert("进入下一关");
game(n+, score+)
}
return;
}
}
}
var clear = function() {
clearInterval(game.timer);
window.removeEventListener("keyup", keyup);
}
window.addEventListener("keyup", keyup);
game.timer = setInterval(run,gamePad[n].speed);
}
document.getElementById("start").addEventListener("click", function() {
game(, );
});
</script>
</html>
重新整理代码, 修改成面向对象样子, 过程式的代码太乱了, 虽然说是面向对象, 只是JS看起来舒服多;
通过面向对象的思维把JS代码各个模块进行封装, 避免作用域的混乱不堪:
<html>
<head>
<meta charset="utf-8">
<style>
#conatiner{
width:400px;
height:500px;
border:1px solid #eee;
position: relative;
}
</style>
</head>
<body>
<span>typing</span>
<div>
<span id="score"></span>得分 ;
需要:<span id="need"></span>分;
</div>
<div id="conatiner"> </div>
<button id="start">开始游戏</button>
</body>
<script>
var eConatiner = document.getElementById("conatiner");
var eScore = document.getElementById("score");
var getRandom = function() {
//随即一个97到122的字符;
var charCode = +Math.floor(Math.random()*);
var speed = Math.ceil(Math.random()*);
return {
code : String.fromCharCode(charCode),
speed : speed,
y : ,
x : Math.floor(Math.random()*),
}
}; function Game( n , score , eConatiner, eScore ,need) {
this.need = need;
this.need.innerHTML = score;
this.showArr = []; //字符对象的列表
this.shoted = ;
this.n = n;
this.score = score;
this.eConatiner = eConatiner;
this.eScore = eScore;
this.events();
this.run();
this.timer = setInterval(this.run.bind(this), Game.gamePad[n].speed);
}
Game.gamePad = {
: {
speed :
},
: {
speed :
},
: {
speed :
},
: {
speed :
},
: {
speed :
}
}
Game.prototype.keyup = function(ev) {
showArr = this.showArr;
for(var i= ;i < showArr.length; i++) {
if(showArr[i].code === ev.key || String.fromCharCode(ev.keyCode).toLowerCase() == showArr[i].code) {
showArr.splice(i,);
this.shoted++;
this.eScore.innerHTML = this.shoted;
if(this.shoted === this.score && Game.gamePad[this.n+] === undefined) {
alert("少侠你好厉害, 你好快, 真的好快好快的");
}else if(this.shoted === this.score) {
this.unbind();
alert("进入下一关");
new Game(this.n+, this.score+, this.eConatiner, this.eScore, this.need);
}
return;
}
}
}
Game.prototype.events = function() {
this.keyup = this.keyup.bind(this);
window.addEventListener("keyup", this.keyup);
}
Game.prototype.unbind = function() {
clearInterval(this.timer);
window.removeEventListener("keyup", this.keyup);
}
//随机一个字符对象, 包含了字符的运动速度,字符的值
//让showArr这个数组的数据运动;
Game.prototype.run = function(){
showArr = this.showArr;
//随机生成字符对象
if(Math.random()>0.9) {
var obj = getRandom();
showArr.push(obj);
}
//让元素运动
for(var i= ;i < showArr.length; i++) {
showArr[i].y+=showArr[i].speed;
if(showArr[i].y>) {
alert("游戏失败");
location.reload();
}
}
this.eConatiner.innerHTML = "";
//让元素添加到界面中;
for(var i= ;i < showArr.length; i++) {
var eSpan = document.createElement("span");
eSpan.style.position = "absolute";
eSpan.innerHTML = showArr[i].code;
eSpan.style.left = showArr[i].x;
eSpan.style.top = showArr[i].y;
this.eConatiner.appendChild(eSpan);
}
}
document.getElementById("start").addEventListener("click", function() {
new Game(, , eConatiner, eScore, document.getElementById("need"));
});
</script>
</html>
作者: NONO
出处:http://www.cnblogs.com/diligenceday/
企业网站:http://www.idrwl.com/ 厦门点燃未来网络科技
开源博客:http://www.github.com/sqqihao
QQ:287101329
微信:18101055830
厦门点燃未来网络科技有限公司, 是厦门最好的微信应用, 小程序, 微信网站, 公众号开发公司
用JS写了一个打字游戏,反正我是通不了关的更多相关文章
- 用vue.js写的一个瀑布流的组件
用vue.js写的一个瀑布流的组件:https://segmentfault.com/a/1190000010741319 https://www.jianshu.com/p/db3cadc03402
- ajax简单手写了一个猜拳游戏
使用ajax简单写一个猜拳游戏 HTML代码 <!DOCTYPE HTML> <html lang="en-US"> <head> <me ...
- jQuery 写的简单打字游戏
var off_x; //横坐标 var count=0; //总分 var speed=5000; //速度,默认是5秒. var keyErro=0; //输入错误次数 var keyRight= ...
- 这个程序员有点牛,现场直接用JS写了个飞机游戏,半小时吸粉三千
程序员昨晚在b站直播的时用JavaScript代码写了一个飞机大战游戏,半小时不到粉丝关注就上千了. 今日就拿出来跟大家分享一下,对许多大佬来说做这个特效也不是很难,但是对于刚开始学习前端这方面还是有 ...
- 原生js写的一个弧形菜单插件
弧形菜单是一种半弧式或者全弧形菜单,是一种不同于传统横向或者竖向菜单形式的菜单.最近在网上看到好多人写出了这种效果,于是也尝试自己写了一个. 实现方式:原生态js 主要结构: 1.参数合并 var d ...
- 用css3+js写了一个钟表
有一天看到css3旋转这个属性,突发奇想的写了一个钟表(没做浏览器兼容),来一起看看是怎么写的吧! 先给个成品图,最终结果是个样子的(动态的). 首先,思考了一下页面的布局,大致需要4层div,最底层 ...
- 【原创】使用JS封装的一个小型游戏引擎及源码分享
1 /** * @description: 引擎的设计与实现 * @user: xiugang * @time: 2018/10/01 */ /* * V1.0: 引擎实现的基本模块思路 * 1.创建 ...
- 使用纯js写的一个分页
上图晒效果: 网上确实有很多分页的插件以及开源代码,单本是一个后台开发猿,前台css等样式还驾驭不住,所以就开始自己去写了.其实这个分页原理很简单,就是用ajax往后台传值(当前页码),后台使用lim ...
- 用js写出一个漂亮的单选框选中效果
一般的input框比较简单,我们可以用JavaScript配合css背景图片定位让我们模拟写出一个点击选中效果 首先需要有个图片素材,当页面加载的时候是背景图片定位到左图,当我们点击图片的时候,背景图 ...
随机推荐
- UILabel
//UILabel->UIView /* 1.实例化 2.属性 3.添加到父视图上 */ //实例化 UILabel *label = [[UILabel alloc] initWithFram ...
- Spring中多配置文件以及寻觅引用其他bean的方式
Spring多配置文件有什么好处? 按照目的.功能去拆分配置文件,可以提高配置文件的可读性与维护性,如将配置事务管理.数据源等少改动的配置与配置bean单独分开. Spring读取配置文件的几种方式: ...
- 【Linux学习】Linux下用户组、文件权限详解
原文地址:http://www.cnblogs.com/123-/p/4189072.html Linux下用户组.文件权限详解 用户组 在linux中的每个用户必须属于一个组,不能独立于组外.在li ...
- (转)tomcat进程意外退出的问题分析
节前某个部门的测试环境反馈tomcat会意外退出,我们到实际环境排查后发现不是jvm crash,日志里有进程销毁的记录,从pause到destory的整个过程: org.apache.coyote. ...
- Json解析工具Jackson(使用注解)
原文http://blog.csdn.net/nomousewch/article/details/8955796 接上一篇文章Json解析工具Jackson(简单应用),jackson在实际应用中给 ...
- makefile之变量赋值
makefile中变量赋值有4种方法: = , := , += , ?= = :直接赋值 变量 = 值 := :位置相关赋值 如果右值为一个值,那么它和=没区别,如果右值为变量,那么左边变 ...
- MongoDB官方C#驱动中查询条件Query用法
Query.All("name", "a", "b");//通过多个元素来匹配数组 Query.And(Query.EQ("nam ...
- 【小白的CFD之旅】06 流体力学基础
从黄师姐那里了解到要学习CFD的话,需要先补充流体力学.数学以及计算机方面的常识,小白就一阵头大.想起当初自己已经把牛皮吹出去了,现在都不知道怎么收场,一个月入不了门多丢人.不过头大归头大,小白还是老 ...
- python学习笔记-python程序运行
小白初学python,写下自己的一些想法.大神请忽略. 安装python编辑器,并配置环境(见http://www.cnblogs.com/lynn-li/p/5885001.html中 python ...
- css3 选择器(三)
接css3选择器(一) 接css3 选择器(二) 这篇和前两篇内容相关性不大,主要是涉及到一些css3的状态选择器,所以标题从一开始. 一.[:enabled]选择器 一看这个属性就知道是专为表单元素 ...