JavaScript游戏之仿劲舞团(简陋版)
突然发觉自己好喜欢写一些js小游戏,觉得蛮有意思。。。又可以娱乐,又可以学到东西。。。哈哈
这次带来的是仿劲舞团的小游戏。。。就是上下左右。。按后按空格。。。不过,没有人跳舞,也没有背景音乐。。。简陋版嘛
先来个预览玩玩吧:
0
时间:
1:Direction类,方向类,就是显示上下左右那些,主要负责生成对应的dom元素。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 //方向类,生成上下左右的方向Dom
2 //direction:方向
3 var Direction = function(direction){
4
5 this.dom = null;
6
7 this.init(direction);
8
9 return this.dom;
10 }
11 Direction.prototype = {
12 //方向对应的dom元素的类名
13 directionMap : {
14 "up":"up",
15 "down":"down",
16 "left":"left",
17 "right":"right"
18 },
19 //初始化函数
20 init : function(direction){
21 var b = document.createElement('b');
22 b.className = this.directionMap[direction];
23 //为方向dom元素扩展一个属性与方法
24 b.direction = direction;
25 b.bingo = this.bingo;
26
27 this.dom = b;
28 },
29 //命中之后事件
30 bingo : function(){
31 this.className += 'bingo';
32 }
33 }
2 //direction:方向
3 var Direction = function(direction){
4
5 this.dom = null;
6
7 this.init(direction);
8
9 return this.dom;
10 }
11 Direction.prototype = {
12 //方向对应的dom元素的类名
13 directionMap : {
14 "up":"up",
15 "down":"down",
16 "left":"left",
17 "right":"right"
18 },
19 //初始化函数
20 init : function(direction){
21 var b = document.createElement('b');
22 b.className = this.directionMap[direction];
23 //为方向dom元素扩展一个属性与方法
24 b.direction = direction;
25 b.bingo = this.bingo;
26
27 this.dom = b;
28 },
29 //命中之后事件
30 bingo : function(){
31 this.className += 'bingo';
32 }
33 }
2:Panel类,背景类,就是游戏区,主要处理方向的生成与键盘事件,还有连击数。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 //背景类,处理方向的生成与键盘事件
2 var Panel = function(){
3 //背景dom元素
4 this.dom = null;
5 //生成的方向类集合
6 this.directionList = [];
7 //目前输入到第几个方向
8 this.inputNum = 0;
9 //连击数
10 this.actcount = 0;
11
12 this.init();
13 }
14 Panel.prototype = {
15 //数字对应方向
16 map : {
17 1:"up",
18 2:"down",
19 3:"left",
20 4:"right"
21 },
22 //每次出现多少个方向
23 count : 4,
24 //初始化
25 init : function(){
26
27 var _this = this;
28
29 this.dom = document.getElementById('panel');
30
31 this.dom.focus();
32
33 this.dom.onkeydown = function(e){_this.keydown(e);};
34 },
35 //显示所有方向
36 showDirection : function(){
37
38 for(var i=1;i <= this.count;i++){
39 this.add();
40 }
41 },
42 //清楚所有方向
43 clearDirection : function(){
44
45 for(var i=0,l=this.directionList.length;i < l;i++){
46 var temp = this.directionList.pop();
47
48 this.dom.removeChild(temp);
49 }
50 },
51 //添加一个方向
52 add : function(){
53
54 var random = parseInt(Math.random()*4+1,10);
55
56 var dir = new Direction(this.map[random]);
57
58 this.directionList.push(dir);
59 this.dom.appendChild(dir);
60 },
61 //按键事件
62 keydown : function(e){
63 e = e|| window.event;
64 //阻止浏览器默认事件
65 if(e.keyCode == 32 || e.keyCode == 37 || e.keyCode == 38 || e.keyCode == 39 || e.keyCode == 40){
66 if(e.preventDefault)e.preventDefault();
67 else e.returnValue = false;
68 }
69 else return;
70
71 var direction;
72 switch(e.keyCode){
73 case 32:direction = 'space';this.inputNum--;break;
74 case 37:direction = 'left';break;
75 case 38:direction = 'up';break;
76 case 39:direction = 'right';break;
77 case 40:direction = 'down';break;
78 default:direction = null;break;
79 }
80
81 this.inputNum++;
82 this.checkInput(direction);
83 },
84 //检测用户输入方向
85 checkInput : function(direction){
86 //检测是否输入完成
87 if (direction == 'space' && this.inputNum == this.directionList.length) {
88 this.finish();
89 }
90 else {
91 var dir = this.directionList[this.inputNum - 1];
92 //检测是否按键正确
93 if (this.inputNum > 0 && direction != null && dir.direction == direction) {
94 dir.bingo();
95 }
96 else this.lose();
97 }
98 },
99 //完成一轮方向输入
100 finish : function(){
101
102 this.actcount += 1;
103 document.getElementById('actcount').innerHTML = this.actcount;
104 this.actEffor();
105 //随机下轮出现的方向数
106 this.count = parseInt(Math.random()*4+5,10);
107 //重置
108 this.reset();
109 //显示方向
110 this.showDirection();
111 //清理一些手尾
112 this.onend();
113 },
114 //用户输入错误或者时间到
115 lose : function(){
116 alert('您输了,战绩为:'+this.actcount+"连击");
117
118 this.count = 4;
119 this.actcount = 0;
120 document.getElementById('actcount').innerHTML = this.actcount;
121 this.reset();
122
123 this.onend();
124 this.onlose();
125 },
126 //用户正确输入一轮方向后,连击数的效果
127 actEffor : function(){
128
129 var flag = 0,
130 colorMap = {
131 0:"Red",
132 1:"Blue",
133 2:"Orange",
134 3:"White"
135 };
136
137 var process = function(){
138
139 document.getElementById('actcount').style.color = colorMap[flag];
140 flag++;
141
142 if(flag <= 3){
143 setTimeout(process,100);
144 }
145 }
146 process();
147 },
148 //重置
149 reset : function(){
150
151 this.clearDirection();
152 this.inputNum = 0;
153 },
154 onend : function(){},
155 onlose: function(){}
156 }
2 var Panel = function(){
3 //背景dom元素
4 this.dom = null;
5 //生成的方向类集合
6 this.directionList = [];
7 //目前输入到第几个方向
8 this.inputNum = 0;
9 //连击数
10 this.actcount = 0;
11
12 this.init();
13 }
14 Panel.prototype = {
15 //数字对应方向
16 map : {
17 1:"up",
18 2:"down",
19 3:"left",
20 4:"right"
21 },
22 //每次出现多少个方向
23 count : 4,
24 //初始化
25 init : function(){
26
27 var _this = this;
28
29 this.dom = document.getElementById('panel');
30
31 this.dom.focus();
32
33 this.dom.onkeydown = function(e){_this.keydown(e);};
34 },
35 //显示所有方向
36 showDirection : function(){
37
38 for(var i=1;i <= this.count;i++){
39 this.add();
40 }
41 },
42 //清楚所有方向
43 clearDirection : function(){
44
45 for(var i=0,l=this.directionList.length;i < l;i++){
46 var temp = this.directionList.pop();
47
48 this.dom.removeChild(temp);
49 }
50 },
51 //添加一个方向
52 add : function(){
53
54 var random = parseInt(Math.random()*4+1,10);
55
56 var dir = new Direction(this.map[random]);
57
58 this.directionList.push(dir);
59 this.dom.appendChild(dir);
60 },
61 //按键事件
62 keydown : function(e){
63 e = e|| window.event;
64 //阻止浏览器默认事件
65 if(e.keyCode == 32 || e.keyCode == 37 || e.keyCode == 38 || e.keyCode == 39 || e.keyCode == 40){
66 if(e.preventDefault)e.preventDefault();
67 else e.returnValue = false;
68 }
69 else return;
70
71 var direction;
72 switch(e.keyCode){
73 case 32:direction = 'space';this.inputNum--;break;
74 case 37:direction = 'left';break;
75 case 38:direction = 'up';break;
76 case 39:direction = 'right';break;
77 case 40:direction = 'down';break;
78 default:direction = null;break;
79 }
80
81 this.inputNum++;
82 this.checkInput(direction);
83 },
84 //检测用户输入方向
85 checkInput : function(direction){
86 //检测是否输入完成
87 if (direction == 'space' && this.inputNum == this.directionList.length) {
88 this.finish();
89 }
90 else {
91 var dir = this.directionList[this.inputNum - 1];
92 //检测是否按键正确
93 if (this.inputNum > 0 && direction != null && dir.direction == direction) {
94 dir.bingo();
95 }
96 else this.lose();
97 }
98 },
99 //完成一轮方向输入
100 finish : function(){
101
102 this.actcount += 1;
103 document.getElementById('actcount').innerHTML = this.actcount;
104 this.actEffor();
105 //随机下轮出现的方向数
106 this.count = parseInt(Math.random()*4+5,10);
107 //重置
108 this.reset();
109 //显示方向
110 this.showDirection();
111 //清理一些手尾
112 this.onend();
113 },
114 //用户输入错误或者时间到
115 lose : function(){
116 alert('您输了,战绩为:'+this.actcount+"连击");
117
118 this.count = 4;
119 this.actcount = 0;
120 document.getElementById('actcount').innerHTML = this.actcount;
121 this.reset();
122
123 this.onend();
124 this.onlose();
125 },
126 //用户正确输入一轮方向后,连击数的效果
127 actEffor : function(){
128
129 var flag = 0,
130 colorMap = {
131 0:"Red",
132 1:"Blue",
133 2:"Orange",
134 3:"White"
135 };
136
137 var process = function(){
138
139 document.getElementById('actcount').style.color = colorMap[flag];
140 flag++;
141
142 if(flag <= 3){
143 setTimeout(process,100);
144 }
145 }
146 process();
147 },
148 //重置
149 reset : function(){
150
151 this.clearDirection();
152 this.inputNum = 0;
153 },
154 onend : function(){},
155 onlose: function(){}
156 }
3:Game类,游戏控制类,控制游戏的开始结束,以及倒计时等。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 //游戏控制类
2 var Game = {
3 //背景类的dom
4 panel : null,
5 //时间进度条dom
6 range : null,
7 //每轮时间,毫秒
8 rangetime : 3000,
9 //目前进度
10 nowrange : 0,
11 //时间进度循环ID
12 rangid : null,
13 //开始按钮
14 startbtn : null,
15 //初始化
16 init : function(){
17 //获取进度条
18 this.range = document.getElementById('range');
19 //新建游戏背景
20 this.panel = new Panel();
21 //清理手尾事件
22 this.panel.onend = function(){
23
24 Game.nowrange = 0;
25 Game.range.style.width = 0 + 'px';
26 };
27 //游戏输了触发事件
28 this.panel.onlose = function(){
29 clearInterval(Game.rangid);
30
31 Game.startbtn.disabled = '';
32 Game.startbtn.focus();
33 };
34 //显示方向
35 this.panel.showDirection();
36 //开始计时
37 this.startTime();
38 },
39 //计时
40 startTime : function(){
41
42 var per = 10,ftime = this.rangetime/20,_this = this;
43
44 var process = function(){
45
46 _this.nowrange += 5;
47 if(_this.nowrange <= 100){
48 _this.range.style.width = _this.nowrange * 2 + 'px';
49 }
50 else {
51 _this.panel.lose();
52 }
53 }
54 this.rangid = setInterval(process,ftime);
55 },
56 //开始
57 start : function(obj){
58
59 this.startbtn = obj;
60 this.startbtn.disabled = 'true';
61
62 if(!this.panel){
63 this.init();
64 }
65 else {
66 this.startTime();
67 this.panel.showDirection();
68 this.panel.dom.focus();
69 }
70 }
71 }
2 var Game = {
3 //背景类的dom
4 panel : null,
5 //时间进度条dom
6 range : null,
7 //每轮时间,毫秒
8 rangetime : 3000,
9 //目前进度
10 nowrange : 0,
11 //时间进度循环ID
12 rangid : null,
13 //开始按钮
14 startbtn : null,
15 //初始化
16 init : function(){
17 //获取进度条
18 this.range = document.getElementById('range');
19 //新建游戏背景
20 this.panel = new Panel();
21 //清理手尾事件
22 this.panel.onend = function(){
23
24 Game.nowrange = 0;
25 Game.range.style.width = 0 + 'px';
26 };
27 //游戏输了触发事件
28 this.panel.onlose = function(){
29 clearInterval(Game.rangid);
30
31 Game.startbtn.disabled = '';
32 Game.startbtn.focus();
33 };
34 //显示方向
35 this.panel.showDirection();
36 //开始计时
37 this.startTime();
38 },
39 //计时
40 startTime : function(){
41
42 var per = 10,ftime = this.rangetime/20,_this = this;
43
44 var process = function(){
45
46 _this.nowrange += 5;
47 if(_this.nowrange <= 100){
48 _this.range.style.width = _this.nowrange * 2 + 'px';
49 }
50 else {
51 _this.panel.lose();
52 }
53 }
54 this.rangid = setInterval(process,ftime);
55 },
56 //开始
57 start : function(obj){
58
59 this.startbtn = obj;
60 this.startbtn.disabled = 'true';
61
62 if(!this.panel){
63 this.init();
64 }
65 else {
66 this.startTime();
67 this.panel.showDirection();
68 this.panel.dom.focus();
69 }
70 }
71 }
希望大家喜欢。。。有什么问题随时联系我。。。