zoukankan      html  css  js  c++  java
  • JS小游戏:贪吃蛇(附源码)


    javascript小游戏:贪吃蛇


    此小游戏采用的是面向对象的思想,将蛇,食物,和游戏引擎分为3个对象来写的。


    为方便下载,我把js写在了html中,


    源码中暂时没有注释,等有空我在添加点注释吧。


    游戏玩法:直接打开html文件即可开始游戏,用键盘的上下左右键控制蛇的移动。


    代码:

    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="UTF-8">
    		<title>贪吃蛇</title>
    		<style type="text/css">
    			*{
    				margin:0; padding:0;
    			}
    			#tab{
    				margin:50px auto;
    				border:1px solid #000;
    				border-collapse:collapse;
    			}
    			#tab td{
    				20px; height:20px;
    				border:1px solid #555;
    			}
    			.cover{
    				background:#000;
    			}
    			.food{
    				background:#f00;
    			}
    		</style>
    		<script src="../js/common.js" type="text/javascript" charset="utf-8"></script>
    		<script type="text/javascript">
    			window.onload = function(){
    				
    				var tab = document.getElementById('tab');
    				
    				for(var i = 0;i<20;i++){					
    					var temptr = document.createElement('tr');					
    					for(var j = 0;j<20;j++){						
    						var temptd = document.createElement('td');
    						temptr.appendChild(temptd);						
    					}
    					tab.appendChild(temptr);
    				}
    							
    				new Game().start();			
    			}
    			
    			function Game(){
    				
    				if(Game.instance) {
    					return Game.instance;
    				}
    				
    				var self = this;
    				this.flag = true;
    				this.keyJudge = true;
    				this.body = $('#tab');
    				this.start = function(){
    					
    					this.flag = true;
    					new food().show();
    					this.snk = new snake().print().move();
    					this.listener();
    					
    				}
    				this.stop = function(){
    					
    					this.flag = false;
    					alert("Game Over!");
    					
    				}
    				
    				this.getDom = function(pos){
    					
    					return this.body.children[pos.row].children[pos.col];
    				}
    				
    				this.listener = function(){
    					
    					document.addEventListener("keydown",function(e){
    						if(self.keyJudge == true){
    							
    							switch(e.keyCode){
    							
    								case 37: self.snk.dir = self.snk.dir ==3? 3:1; break;
    								case 38: self.snk.dir = self.snk.dir ==4? 4:2; break;
    								case 39: self.snk.dir = self.snk.dir ==1? 1:3; break;
    								case 40: self.snk.dir = self.snk.dir ==2? 2:4; break;
    							
    							}
    							self.keyJudge = false;
    							
    						}
    						
    					});
    					
    				}
    				
    				Game.instance = this;
    				
    			}
    			
    			function snake(){
    				
    				var self = this;
    				this.body = [{row:randomInt(0,19),col:randomInt(0,19)}];
    				this.dir = randomInt(1,4);
    				
    				this.print = function(){
    					 
    					 this.body.forEach(function(pos){
    					 	
    					 	new Game().getDom(pos).className = "cover";
    					 	
    					 });
    					
    					return this;
    					
    				}
    				
    				this.step = function(){
    						
    						switch(this.dir){
    							
    							case 1: this.next = {col:this.body[0].col-1,row:this.body[0].row}; break;
    							case 2: this.next = {col:this.body[0].col, row:this.body[0].row-1}; break;
    							case 3: this.next = {col:this.body[0].col+1, row:this.body[0].row}; break;
    							case 4: this.next = {col:this.body[0].col, row: this.body[0].row+1}; break;
    							
    						}
    						
    						if(this.next.col<0||this.next.col>19||this.next.row<0||this.next.row>19){
    							
    							new Game().stop();
    							
    						}else if(new Game().getDom(this.next).className == "food"){
    							
    							this.body.unshift(this.next);
    							new food().show();
    							
    						}else if(new Game().getDom(this.next).className == "cover"){
    							
    							new Game().stop();
    							
    						}else{
    							
    							this.body.unshift(this.next);
    							var del = this.body.pop();
    							new Game().body.children[del.row].children[del.col].className = "";
    							
    						}
    						
    						this.print();
    					
    						return this;
    				}
    				
    				this.move = function(){
    					
    					this.speed = 300;
    					setTimeout(function(){
    						
    						switch(self.body.length){
    							
    							case 5: self.speed = 250; break;
    							case 10: self.speed = 200; break;
    							case 15: self.speed = 150; break;
    							case 20: self.speed = 100; break;
    							case 30: self.speed = 70;
    							
    						}
    						
    						if(new Game().flag ){	
    							self.step();
    							new Game().keyJudge = true;
    							setTimeout(arguments.callee,self.speed);
    						}
    						
    					}.bind(this),self.speed)
    
    					return this;
    				}
    				
    			}
    			
    			
    			function food(){
    				
    				this.show = function(){
    					
    					this.body = {row:randomInt(0,19),col:randomInt(0,19)};
    					
    					while(new Game().getDom(this.body).className == "cover"){
    						this.body = {row:randomInt(0,19),col:randomInt(0,19)};						
    					}
    					
    					 new Game().getDom(this.body).className = "food";
    					 	
    					 return this;
    				
    				}
    										
    			}
    			
    			
    			
    		</script>
    	</head>
    	<body>
    		<table id = "tab" >
    		</table>
    	</body>
    </html>
    




  • 相关阅读:
    从官方下载 Bootstrap 版本 并写 第一个页面
    南阳477
    南阳463
    南阳455
    南阳399
    南阳276
    南阳275
    南阳268
    南阳264
    南阳263
  • 原文地址:https://www.cnblogs.com/chengzp/p/7757849.html
Copyright © 2011-2022 走看看