js原生貪喫蛇遊戲

閒來無事,用js原生寫了一個貪喫蛇的遊戲,做之前網上查了下,貌似版本很多,這個只能算是一個較爲簡單的版本而已,總之只是爲了娛樂打發時間而已,閒話不多說,上代碼:

<!DOCTYPE html> 
<html> 
	<head> 
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
		<title>JS貪喫蛇</title> 
		<style type="text/css"> 
			#pannel table { 
			border-collapse: collapse;
			border-color: #000;
			} 
			#pannel table td { 
			border: 1px solid #555; 
			width: 10px; 
			height: 10px; 
			font-size: 0; 
			line-height: 0; 
			overflow: hidden; 
			} 
			#pannel table .snake { 
			background-color: blue; 
			} 
			#pannel table .food { 
			background-color: blue; 
			} 
		</style> 
		<script type="text/javascript"> 
				var Direction = new function () { 
						this.UP = 38; 
						this.RIGHT = 39; 
						this.DOWN = 40; 
						this.LEFT = 37; 
				}; 
				var Common = new function () { 
				this.width = 20; /*水平方向方格數*/ 
				this.height = 20; /*垂直方向方格數*/ 
				this.speed = 250; /*速度 值越小越快*/ 
				this.workThread = null; 
				}; 
				var Main = new function () { 
					var control = new Control(); 
					window.onload = function () { 
						control.Init("pannel"); 
						/*開始按鈕*/ 
						document.getElementById("btnStart").onclick = function () { 
							control.Start(); 
							this.disabled = true;
						};
					}; 
				}; 
				/*控制器*/ 
				function Control() { 
					this.snake = new Snake(); 
					this.food = new Food(); 
					/*初始化函數,創建表格*/ 
					this.Init = function (pid) { 
						var html = []; 
						html.push('<table>'); 
						for (var y = 0; y < Common.height; y++) { 
							html.push("<tr>"); 
							for (var x = 0; x < Common.width; x++) { 
								html.push('<td id="box_' + x + "_" + y + '"> </td>'); 
							} 
							html.push("</tr>"); 
						} 
						html.push("</table>"); 
						this.pannel = document.getElementById(pid); 
						this.pannel.innerHTML = html.join(""); 
					}; 
					/*開始遊戲 - 監聽鍵盤、創建食物、刷新界面線程*/ 
					this.Start = function () { 
						var me = this; 
						this.MoveSnake = function (ev) { 
							var evt = window.event || ev; 
							me.snake.SetDir(evt.keyCode); 
						}; 
						try { 
							document.attachEvent("onkeydown", this.MoveSnake); 
						} catch (e) { 
							document.addEventListener("keydown", this.MoveSnake, false); 
						} 
						this.food.Create(); 
						Common.workThread = setInterval(function () { 
							me.snake.Eat(me.food); me.snake.Move(); 
						}, Common.speed); 
					}; 
				} 
				/*蛇*/ 
				function Snake(){ 
					this.isDone = false; 
					this.dir = Direction.RIGHT; 
					this.pos = new Array(new Position()); 
					/*移動 - 擦除尾部,向前移動,判斷遊戲結束(咬到自己或者移出邊界)*/ 
					this.Move = function () { 
					document.getElementById("box_" + this.pos[0].X + "_" + this.pos[0].Y).className = ""; 
					//所有 向前移動一步 
					for (var i = 0; i < this.pos.length - 1; i++) { 
						this.pos[i].X = this.pos[i + 1].X; 
						this.pos[i].Y = this.pos[i + 1].Y; 
					} 
					//重新設置頭的位置 
					var head = this.pos[this.pos.length - 1]; 
					switch (this.dir) { 
						case Direction.UP: 
						head.Y--; 
						break; 
						case Direction.RIGHT: 
						head.X++; 
						break; 
						case Direction.DOWN: 
						head.Y++; 
						break; 
						case Direction.LEFT: 
						head.X--; 
						break; 
					} 
					this.pos[this.pos.length - 1] = head; 
					//遍歷畫蛇,同時判斷遊戲結束 
					for (var i = 0; i < this.pos.length; i++) { 
						var isExits = false; 
						for (var j = i + 1; j < this.pos.length; j++) 
						if (this.pos[j].X == this.pos[i].X && this.pos[j].Y == this.pos[i].Y) { 
							isExits = true; 
							break; 
						} 
						if (isExits) { this.Over();/*咬自己*/ break; } 
						var obj = document.getElementById("box_" + this.pos[i].X + "_" + this.pos[i].Y); 
						if (obj) obj.className = "snake"; else { this.Over();/*移出邊界*/ break; } 
					} 
						this.isDone = true; 
					}; 
					/*遊戲結束*/ 
					this.Over = function () { 
						clearInterval(Common.workThread); 
						alert("遊戲結束!"); 
					} 
					/*喫食物*/ 
					this.Eat = function (food) { 
						var head = this.pos[this.pos.length - 1]; 
						var isEat = false; 
						switch (this.dir) { 
							case Direction.UP: 
							if (head.X == food.pos.X && head.Y == food.pos.Y + 1) isEat = true; 
							break; 
							case Direction.RIGHT: 
							if (head.Y == food.pos.Y && head.X == food.pos.X - 1) isEat = true; 
							break; 
							case Direction.DOWN: 
							if (head.X == food.pos.X && head.Y == food.pos.Y - 1) isEat = true; 
							break; 
							case Direction.LEFT: 
							if (head.Y == food.pos.Y && head.X == food.pos.X + 1) isEat = true; 
							break; 
						} 
						if (isEat) { 
							this.pos[this.pos.length] = new Position(food.pos.X, food.pos.Y); 
							food.Create(this.pos); 
						} 
					}; 
					/*控制移動方向*/ 
					this.SetDir = function (dir) { 
						switch (dir) { 
							case Direction.UP: 
							if (this.isDone && this.dir != Direction.DOWN) { this.dir = dir; this.isDone = false; } 
							break; 
							case Direction.RIGHT: 
							if (this.isDone && this.dir != Direction.LEFT) { this.dir = dir; this.isDone = false; } 
							break; 
							case Direction.DOWN: 
							if (this.isDone && this.dir != Direction.UP) { this.dir = dir; this.isDone = false; } 
							break; 
							case Direction.LEFT: 
							if (this.isDone && this.dir != Direction.RIGHT) { this.dir = dir; this.isDone = false; } 
							break; 
						} 
					}; 
				} 
				/*食物*/ 
				function Food() { 
					this.pos = new Position(); 
					/*創建食物 - 隨機位置創建立*/ 
					this.Create = function (pos) { 
						document.getElementById("box_" + this.pos.X + "_" + this.pos.Y).className = ""; 
						var x = 0, y = 0, isCover = false; 
						/*排除蛇的位置*/ 
						do { 
							x = parseInt(Math.random() * (Common.width - 1)); 
							y = parseInt(Math.random() * (Common.height - 1)); 
							isCover = false; 
							if (pos instanceof Array) { 
								for (var i = 0; i < pos.length; i++) { 
									if (x == pos[i].X && y == pos[i].Y) { 
										isCover = true; 
										break; 
									} 
								} 
							} 
						} while (isCover); 
						this.pos = new Position(x, y); 
						document.getElementById("box_" + x + "_" + y).className = "food"; 
					}; 
				} 
				function Position(x, y) { 
					this.X = 0; 
					this.Y = 0; 
					if (arguments.length >= 1) this.X = x; 
					if (arguments.length >= 2) this.Y = y; 
				} 
		</script> 
	</head> 
	<body> 
		<div id="pannel" style="margin-bottom: 10px;"></div> 
			<input type="button" id="btnStart" value="點擊開始遊戲" /> 
		</div>
	</body> 
</html> 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章