用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背景图片定位让我们模拟写出一个点击选中效果 首先需要有个图片素材,当页面加载的时候是背景图片定位到左图,当我们点击图片的时候,背景图 ...
随机推荐
- Thread多线程(二):Runnable
如果要让其他类使用线程就要用到runnable,其他thread就是实现了runnbale接口,其中run()方法就是对runnable接口中的run()方法的具体实现.有两个构造函数分别是: ...
- android 史上最简单易懂的跨进程通讯(Messenger)!
不需要AIDL也不需要复杂的ContentProvider,也不需要SharedPreferences或者共享存储文件! 只需要简单易懂的Messenger,它也称为信使,通过它可以在不同进程中传递m ...
- iOS开发之功能模块--关于自定义TabBar条
只上项目中用到的代码: 1.实现重写TabBar的TabBarItem,然后在中间额外加一个按钮. #import <UIKit/UIKit.h> @interface BikeTabBa ...
- [原创]python之简单计算器(超详解,只有基本功能+-*/,还有括号处理)
不想看过程的话,直接看文章最后的正式源码 作业需求及分析: 流程图 https://www.processon.com/diagraming/580c5276e4b03c844a5a9716 初期感 ...
- 我的第一个React Native App
我用了三天时间实现了一个相对比较完整的React Native 新闻发布类型的示例.应用做得很简单,但大多React Native的组件都有用到,今天做一个分享(由于我电脑是Windows系统,所以只 ...
- SqlServer主键和外键
*主键 主键就是数据行的唯一标识.不会重复的列才能当主键.一个表可以没有主键,但是会非常难以处理,因此没有特殊理由表都要设定主键. *主键特点:1不能重复的列.2主键不能为null. *同名时如何处理 ...
- 监控mysql各种选项
安装mysql之后,需要对mysql服务进行监控. nagios开源自带的check_mysql 对 mysql 的slave 机监控倒是不错.但是对数据库主机监控就略显不足了. 使用一个监控 ...
- 基于注解的SpringMVC
相比传统的继承Controller体系中某些类的方式,SpringMVC的注解具有以下优点: 1.Controller不再需要继承某个特定类,只是简单的POJO. 2.请求映射的配置非常方便灵活. 3 ...
- Centos6.5下设置静态IP
1.编辑网卡配置文件 vi /etc/sysconfig/network-scripts/ifcfg-eth0 设置网卡eth0的IPV4信息,需要注意的是,设置的IPADDR需要和局域网中其他机器处 ...
- 【Windows编程】系列第九篇:剪贴板使用
上一篇我们学习了常见的通用对话框,本篇来了解剪贴板的使用,它常用于复制粘贴功能. 剪贴板是Windows最早就加入的功能,由于该功能非常实用,我们几乎每天都会使用到.通过剪贴板,我们就可以将数据从一个 ...