js貪喫蛇小遊戲

最近突然愛上了js,特地做幾個經典的小遊戲來玩一玩,學java學了這麼久,歡歡偷笑

snake.html:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>貪喫蛇</title>
<script language="javascript" src="js/jquery.1.8.1.js"></script>
<script language="javascript" src="js/snake.js"></script>
<link href="css/snake.css" rel="stylesheet" type="text/css"/>
</head>

<body>
	<table id="frameTable">
    	
    </table>
    <input type="button" value="開始" id="start"/>
</body>
</html>

snake.css:

/* CSS Document */
body{
	text-align:center;
}
#frameTable{
	width:530px;
	height:530px;
	border-collapse: collapse;
	border: 1px solid #000;
	margin:0 auto
}
tr td{
	border: 1px solid #000;
	padding:0px;
}
input{
	margin-top:20px;
	width:100px;
	height:30px;
}
snake.js:

// JavaScript Document
var game = {
	init:{
		rowNum : 20,//初始化表格的行
		colNum : 20,//初始化表格的列
		foodNum : 10,//初始化食物數量
		speed: 200,//初始化蛇的移動速度
		foodColor: 'red',//食物顏色
		snakeBodyColor: '#6F3',//蛇身體的顏色
		snakeHeadColor: 'black',//蛇頭的顏色
		backgroundColor: 'yellow',//表格的顏色
		direction : 'right',//默認蛇的移動方向,右
		state: '',
		snakePosition : ["10-7","10-8","10-9","10-10"],//蛇每節身體的座標,橫縱座標以-隔開
		initFrame:function() {//加載遊戲界面
			game.pfunction.loadWall();
			game.pfunction.loadSnake();
			game.pfunction.loadFood(game.init.foodNum);
			game.init.initEvent();
		},
		initEvent:function(){
			$("#start").unbind("click");
			$("#start").bind("click", function() {//開始按鈕事件
				if($(this).val() == "再來一局") {
					game.gamerestart();
					return;
				}
				game.init.direction = "right";
				$(this).hide();
				game.init.state = setInterval(function() {
					var len = game.pfunction.getSnakeSize();//得到蛇的長度
					if(game.init.direction == "right") {//向右移動
						//得到蛇頭的將要到達的座標,向右移動x座標不變,y座標+1
						var x = game.pfunction.getX(len-1);
						var y =game.pfunction.getY(len-1) + 1;
						if(y>=game.init.rowNum) {//判斷蛇是否撞到了牆
							game.gameover();return;
						}
					}else if(game.init.direction == "left") {//向左移動
						//得到蛇頭的將要到達的座標,向左移動x座標不變,y座標-1
						var x = game.pfunction.getX(len-1);
						var y =game.pfunction.getY(len-1) - 1;
						if(y<0) {
							game.gameover();return;
						}
					}else if(game.init.direction == "up") {//向上移動
						//得到蛇頭的將要到達的座標,向上移動x座標-1,y座標不變
						var x = game.pfunction.getX(len-1) - 1;
						var y =game.pfunction.getY(len-1);
						if(x<0) {
							game.gameover();return;
						}
					}else if(game.init.direction == "down") {//向下移動
						//得到蛇頭的將要到達的座標,向下移動x座標+1,y座標不變
						var x = game.pfunction.getX(len-1) + 1;
						var y =game.pfunction.getY(len-1);
						if(x>=game.init.colNum) {
							game.gameover();return;
						}
					}
					game.pfunction.judgeWhetherIsSnakeBody(x+"-"+y);//判斷蛇是都撞到了自己的身體,若是遊戲結束
					game.pfunction.judgeWhetherIsFood(x+"-"+y);//判斷將要前進的方向是否是食物
					game.pfunction.addHead(x+"-"+y);//蛇頭前一個位置變成蛇頭
					game.pfunction.createFood();//如果蛇喫掉了一個食物,重新產生一個食物,沒有則不產生
					game.pfunction.loadSnake();//重新把蛇顯示出來
				},game.init.speed);
			});
			
			$(document).keydown(function(event){ //鍵盤按下事件
				var e = event || window.event || arguments.callee.caller.arguments[0];
          		if(e && e.keyCode==87){ // 按 w 
					if(game.init.direction == "down") {
						game.init.direction = "down"
						return;
					}
               		game.init.direction = "up";
              	}
              	if(e && e.keyCode==65){ // 按 a 
					if(game.init.direction == "right") {
						game.init.direction = "right"
						return;
					}
                  	game.init.direction = "left";
                }            
             	if(e && e.keyCode==83){ // 按 s
					if(game.init.direction == "up") {
						game.init.direction = "up"
						return;
					}
                	game.init.direction = "down";
           		}
				if(e && e.keyCode==68){ // 按 d
					if(game.init.direction == "left") {
						game.init.direction = "left"
						return;
					}
               		game.init.direction = "right";
           		}
			}); 
		}
	},
	pfunction:{
		loadWall:function() {//動態產生整個表格,也就是蛇活動的區域
			for(var i=0;i<game.init.rowNum;i++) {
				$TR = $("<tr/>").attr("id",i);
				for(var j=0;j<game.init.colNum;j++) {
					$TD = $("<td/>").attr("id",i+"-"+j).attr("class","empty")
									.css("background",game.init.backgroundColor);
					$TR.append($TD);
				}
				$("#frameTable").append($TR);
			}
		},
		loadSnake:function() {//遍歷蛇身的座標,把蛇在界面上顯示出來
			for(var i=0;i<game.pfunction.getSnakeSize();i++) {
				var position = game.init.snakePosition[i];
				if(i == game.pfunction.getSnakeSize()-1) {
					$("#"+position).css("background",game.init.snakeHeadColor);
				}else {
					$("#"+position).css("background",game.init.snakeBodyColor);
				}
				$("#"+position).attr("class","snake");
			}
		},
		loadFood:function(foodNum) {//隨機產生foodNum個食物
			var i = 0;
			while(i<foodNum) {
				var x = parseInt(Math.random()*19);
				var y = parseInt(Math.random()*19);
				var seat = x+"-"+y;
				if($("#"+seat).attr("class") == "snake" || $("#"+seat).attr("class") == "food") {
					continue;
				}
				$("#"+seat).css("background",game.init.foodColor);
				$("#"+seat).attr("class","food");
				i++;	
			}
		},
		getX:function(index) {
			return parseInt(game.init.snakePosition[index].split("-")[0]);
		},
		getY:function(index) {
			return parseInt(game.init.snakePosition[index].split("-")[1])
		},
		removeFoot:function() {//移除蛇尾
			return game.init.snakePosition.splice(0,1);
		},
		addHead:function(head) {//添加蛇頭
			game.init.snakePosition.push(head);
		},
		getSnakeSize:function() {//得到此時蛇的長度
			return game.init.snakePosition.length;
		},
		judgeWhetherIsFood:function(pre) {
			if($("#"+pre).attr("class") != "food") {
				var foot = game.pfunction.removeFoot();
				$("#"+foot).css("background",game.init.backgroundColor);
				$("#"+foot).attr("class","empty");
			}
		},
		judgeWhetherIsSnakeBody:function(pre) {
			if($("#"+pre).attr("class") == "snake") {
				game.gameover();
			}
		},
		createFood:function() {//遍歷整個界面的食物,如果食物少了一個,重新產生一個食物
			var foodNo = 0;
			for(var i=0;i<game.init.rowNum;i++) {
				for(var j=0;j<game.init.colNum;j++) {
					if($("#"+i+"-"+j).attr("class") == "food") {
						foodNo++;
					}
				}
			}
			if(foodNo<game.init.foodNum) {
				game.pfunction.loadFood(1);
			}
		},
	},
	gamerestart:function() {//再來一局,重新初始化界面
		for(var i=0;i<game.init.rowNum;i++) {
			for(var j=0;j<game.init.colNum;j++) {
				$("#"+i+"-"+j).attr("class","empty").css("background",game.init.backgroundColor);
			}
		}	
		game.init.snakePosition = ["10-7","10-8","10-9","10-10"];
		game.pfunction.loadSnake();
		game.pfunction.loadFood(game.init.foodNum);
		$("#start").val("開始");
	},
	gameover:function() {//遊戲結束
		clearInterval(game.init.state);
		$("#start").val("再來一局");
		$("#start").show();
		alert("game over");
	}
};

$(function() {
	game.init.initFrame();
});
運行截圖:




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