HTML 网页游戏 2048

新手只会一点html和css,javascript基本不会,更别提jQuery了= =

跟着慕课网的教学视频(视频地址:http://www.imooc.com/learn/76)一点点做的,由于自己没什么基础,又加上我的Dreamweaver出了点问题,我用notepad++写的,出了错查起来我都要哭了。。。

目前只看了一半,PC端网页部分。

觉得不仅学到了javascript,而且对游戏的逻辑,编程的设计方面学到了很多。

代码全部没有写注释。。大概说一下逻辑。

游戏有16个格子(div)做背景,格子上面有16个浮动的格子用来移动和显示数字,用一个数组来记录每个位置的数字,移动时上下左右分别判断,格子是真的移动走了(表示一开始吓坏了),通过移动后的坐标来确定格子的位置, board数字相加,然后刷新数字的显示。逻辑很简单,代码也很清晰。

HTML部分

<!DOCTYPE html>
<html>
<head>
	<title>2048</title>
	<link rel="stylesheet" type="text/css" href="2048.css" />
	
	<script type="text/javascript" src="http://libs.baidu.com/jquery/1.9.0/jquery.min.js"></script>
	<script type="text/javascript" src="support2048.js"></script>
	<script type="text/javascript" src="showanimation2048.js"></script>
	<script type="text/javascript" src="main2048.js"></script>
</head>
<body>
	<header>
		<h1>2048</h1>
		<a href="javascript:newgame();" id="newgamebutton">New Game</a>
		<p>score: <span id="score">0</span></p>
	</header>
	
	<div id="grid-container">
		
		<div class="grid-cell" id="grid-cell-0-0"></div>
		<div class="grid-cell" id="grid-cell-0-1"></div>
		<div class="grid-cell" id="grid-cell-0-2"></div>
		<div class="grid-cell" id="grid-cell-0-3"></div>
		<div class="grid-cell" id="grid-cell-1-0"></div>
		<div class="grid-cell" id="grid-cell-1-1"></div>
		<div class="grid-cell" id="grid-cell-1-2"></div>
		<div class="grid-cell" id="grid-cell-1-3"></div>
		<div class="grid-cell" id="grid-cell-2-0"></div>
		<div class="grid-cell" id="grid-cell-2-1"></div>
		<div class="grid-cell" id="grid-cell-2-2"></div>
		<div class="grid-cell" id="grid-cell-2-3"></div>
		<div class="grid-cell" id="grid-cell-3-0"></div>
		<div class="grid-cell" id="grid-cell-3-1"></div>
		<div class="grid-cell" id="grid-cell-3-2"></div>
		<div class="grid-cell" id="grid-cell-3-3"></div>
		<div id="showGameover"></div>
	</div>
	
	<p align="center">@wenruo</p>
</body>
</html>

  

CSS部分

header{
	display: block;
	margin: 0 auto;
	 500px;
	text-align: center;
}

header h1{
	font-family: Arial;
	font-size: 40px;
	font-weight: bold;
}

header #newgamebutton{
	display: block;
	margin: 20px auto;
	
	 100px;
	padding: 10px 10px;
	background-color: #8f7a66;
	
	font-family: Arial;
	color: white;
	
	border-radius: 10px;
	
	text-decoration: none;
}

header #newgamebutton:hover{
	background-color:#9f8b77;
}

header p{
	font-family: Arial;
	font-size: 25px;
	margin: 20px auto;
}

#grid-container{
	 460px;
	height: 460px;
	padding: 20px;
	
	margin: 50px auto;
	background-color: #bbada0;
	
	border-radius: 10px;
	position: relative;
}

.grid-cell{
	 100px;
	height: 100px;
	border-radius: 6px;
	background-color: #ccc0b3;
	
	position: absolute;
}

.number-cell{
	border-radius: 6px;
	
	font-family: Arial;
	font-weight: bold;
	font-size: 40px;
	line-height: 100px;
	text-align: center;
	
	position: absolute; /*通过js中函数来确定位置*/ 
}

#score{
	color: orange;
}

#showGameover {
	position: absolute;
	text-align: center;
	line-height: 150px;
	font-size: 40px;
	color: black;
	z-index: 9;
	alpha(opacity=80); 
	-moz-opacity:0.8; 
	opacity: 0.8;
}

  

JavaScript部分

//main2048.js
var board = new Array();
var score = 0;
var hasConflicted = new Array();

$(document).ready(function(){
	newgame();
});

function newgame(){
	init();
	//在随机的两个格子里生成数字
	generateOneNumber();
	generateOneNumber();
}

function init(){
	for (var i = 0; i < 4; ++i)
		for (var j = 0; j < 4; ++j) {
			var gridCell = $("#grid-cell-"+i+"-"+j);
			gridCell.css('top', getPosTop(i, j));
			gridCell.css('left', getPosLeft(i, j));
			
		}
		
	for (var i = 0; i < 4; ++i) {
		board[i] = new Array();
		hasConflicted[i] = new Array();
		for (var j = 0; j < 4; ++j)
			board[i][j] = 0;
			hasConflicted[i][j] = false;
	}
	score = 0;
	updateScore(score);
	
// 自己初始化4096用来装B = =
// board[0][0] = 121;
// board[0][1] = 213;
// board[0][2] = 438;
// board[0][3] = 1024;
// board[1][0] = 8;
// board[1][1] = 8;
// board[1][2] = 16;
// board[1][3] = 16;
// board[2][0] = 32;
// board[2][1] = 64;
// board[2][2] = 512;
// board[2][3] = 8;
// board[3][0] = 2;
// board[3][1] = 512;
// board[3][2] = 2048;
// board[3][3] = 4096;	
	updateBoardView();
	var showGameover = $('#showGameover');
	showGameover.css('width', '0px');
	showGameover.css('height', '0px');
	showGameover.css('top', "250px");
	showGameover.css('left', "250px");
	showGameover.text("");
}

function updateBoardView() {
	$(".number-cell").remove();
	for (var i = 0; i < 4; ++i)
		for (var j = 0; j < 4; ++j) {
			$("#grid-container").append('<div class="number-cell" id="number-cell-'+i+'-'+j+'"></div>');//<-- @_@
			var theNumberCell = $('#number-cell-'+i+'-'+j);
			
			if (board[i][j] == 0) {
				theNumberCell.css('width', '0px');
				theNumberCell.css('height', '0px');
				theNumberCell.css('top', getPosTop(i, j) + 50);
				theNumberCell.css('left', getPosLeft(i, j) + 50);
			} else {
				theNumberCell.css('width', '100px');
				theNumberCell.css('height', '100px');
				theNumberCell.css('top', getPosTop(i, j));
				theNumberCell.css('left', getPosLeft(i, j));
				theNumberCell.css('background-color', getNumberBackgroundColor(board[i][j]));
				theNumberCell.css('color', getNumberColor(board[i][j]));
				theNumberCell.text(board[i][j]);
			}
			
			hasConflicted[i][j] = false;
			
		}
}

function generateOneNumber() {
	if (nospace(board))
		return false;
		
	//random position
	var randx = parseInt(Math.floor(Math.random() * 4)); // 0,1,2,3
	var randy = parseInt(Math.floor(Math.random() * 4)); 
	while (true) {
		if (board[randx][randy] == 0)
			break;
		
		var randx = parseInt(Math.floor(Math.random() * 4)); // 0,1,2,3
		var randy = parseInt(Math.floor(Math.random() * 4)); 
	}
	
	//random number
	var randNumber = Math.random() < 0.5 ? 2 : 4;
	
	board[randx][randy] = randNumber;
	showNumberWithAnimation(randx, randy, randNumber);
	
	return true;
}

$(document).keydown(function(event){
	switch(event.keyCode) {
		case 37: //left
			if(moveLeft()) {
				setTimeout("generateOneNumber()", 210);
				setTimeout("isgameover()", 300);
			}
			break;
		case 38: //up
			if(moveUp()) {
				setTimeout("generateOneNumber()", 210);
				setTimeout("isgameover()", 300);
			}
			break;
		case 39: //right
			if(moveRight()) {
				setTimeout("generateOneNumber()", 210);
				setTimeout("isgameover()", 300);
			}
			break;	
		case 40: //down
			if(moveDown()) {
				setTimeout("generateOneNumber()", 210);
				setTimeout("isgameover()", 300);
			}
			break;
		default:
			break;
	}
});

function isgameover() {
	if (nospace(board) && !canMoveLeft(board) 
		&& !canMoveRight(board) && !canMoveUp(board) && !canMoveRight(board)) {
		gameover();
		return true;
	}
		
	return false;
}

function gameover() {
	showGameOver();
}

function moveLeft() {
	if(!canMoveLeft(board))
		return false;
	for (var i = 0; i < 4; ++i)
		for (var j = 1; j < 4; ++j) {
			if (board[i][j] != 0) {
				for (var k = 0; k < j; ++k) {
					if (board[i][k] == 0 && noBlockHorizontal(i, k, j, board)) {
						showMoveAnimation(i, j, i, k);
						board[i][k] = board[i][j];
						board[i][j] = 0;
					} else if(board[i][k] == board[i][j] && noBlockHorizontal(i, k, j, board)
								&& hasConflicted[i][k] == false){
						//add
						showMoveAnimation(i, j, i, k);
						board[i][k] += board[i][j];
						board[i][j] = 0;
						score += board[i][k];
						updateScore(score);
						hasConflicted[i][k] = true;
					}
				}
			}
		}
		
	setTimeout("updateBoardView()", 200);
	return true;
}

function moveRight(){
	if (!canMoveRight(board))
		return false;
	for (var i = 0; i < 4; ++i) {
		for (var j = 2; j >= 0; --j) {
			if (board[i][j] != 0) {
				for (var k = 3; k > j; --k) {
					if (board[i][k] == 0 && noBlockHorizontal(i, j, k, board)) {
						showMoveAnimation(i, j, i, k);
						board[i][k] = board[i][j];
						board[i][j] = 0;
					} else if (board[i][k] == board[i][j] && noBlockHorizontal(i, j, k, board)
								&& hasConflicted[i][k] == false){
						showMoveAnimation(i, j, i, k);
						board[i][k] += board[i][j];
						board[i][j] = 0;
						score += board[i][k];
						updateScore(score);
						hasConflicted[i][k] = true;
					}
				}
			}
		}
	}
	setTimeout("updateBoardView()", 200);
	return true;
}


function moveUp() {
	if (!canMoveUp(board))
		return false;
	for (var i = 0; i < 4; ++i) 
		for (var j = 1; j < 4; ++j) 
			if (board[j][i]) {
				for (var k = 0; k < j; ++k) {
					if (board[k][i] == 0 && noBlockVertical(i, k, j, board)) {
						showMoveAnimation(j, i, k ,i);
						board[k][i] = board[j][i];
						board[j][i] = 0;
					} else if (board[k][i] == board[j][i] && noBlockVertical(i, k, j, board)
								&& hasConflicted[k][i] == false) {
						showMoveAnimation(j, i, k ,i);
						board[k][i] += board[j][i];
						board[j][i] = 0;
						score += board[k][i];
						updateScore(score);
						hasConflicted[k][i] = true;
					}
				}
			}
	setTimeout("updateBoardView()", 200);
	return true;
}

function moveDown() {
	if (!canMoveDown(board)) 
		return false;
	for (var i = 0; i < 4; ++i) {
		for (var j = 2; j >= 0; --j) {
			if (board[j][i]) {
				for (var k = 3; k > j; --k) {
					if (board[k][i] == 0 && noBlockVertical(i, j, k, board)) {
						showMoveAnimation(j, i, k ,i);
						board[k][i] = board[j][i];
						board[j][i] = 0;
					} else if (board[k][i] == board[j][i] && noBlockVertical(i, j, k, board)
								&& hasConflicted[k][i] == false) {
						showMoveAnimation(j, i, k ,i);
						board[k][i] += board[j][i];
						board[j][i] = 0;
						score += board[k][i];
						updateScore(score);
						hasConflicted[k][i] = true;
					}
				}
			}
		}
	}
	setTimeout("updateBoardView()", 200);
	return true;
}

  

//support2048.js
function getPosTop(i, j){
	return 20 + i * 120;
}

function getPosLeft(i ,j){
	return 20 + j * 120;
}

function getNumberBackgroundColor(number) {
	switch(number) {
		case 2: return "#eee4da";break;
		case 4: return "#ede0c8";break;
		case 8: return "#f2b179";break;
		case 16: return "#f59563";break;
		case 32: return "#f67c5f";break;
		case 64: return "#f65e3b";break;
		case 128: return "#edcf72";break;
		case 256: return "#edcc61";break;
		case 512: return "#09c";break;
		case 1024: return "#33b5e5";break;
		case 2048: return "#09c";break;
		case 4096: return "#a6c";break;
		case 8192: return "#93c";break;
	}

	return "black";
}

function getNumberColor(number) {
	if (number <= 4)
		return "#776e65";
	return "white";
}

function nospace(board){
	for (var i = 0; i < 4; ++i)
		for (var j = 0; j < 4; ++j)
			if (board[i][j] == 0)
			return false;
	return true;
}

function canMoveLeft(board) {
	for (var i = 0; i < 4; ++i) 
		for (var j = 1; j < 4; ++j)
			if (board[i][j] != 0)
				if (board[i][j - 1] == 0 || board[i][j - 1] == board[i][j])
					return true;
	return false;
}

function canMoveRight(board) {
	for (var i = 0; i < 4; ++i) 
		for (var j = 0; j < 3; ++j)
			if (board[i][j] != 0){
				if (board[i][j + 1] == 0 || board[i][j] == board[i][j + 1])
					return true;
			}
	return false;
}

function canMoveUp(board) {
	for (var i = 0; i < 4; ++i) {
		for (var j = 1; j < 4; ++j) {
			if (board[j][i])
				if (board[j - 1][i] == 0 || board[j - 1][i] == board[j][i])
					return true;
		}
	}
	return false;
}

function canMoveDown(board) {
	for (var i = 0; i < 4; ++i) {
		for (var j = 0; j < 3; ++j) {
			if (board[j][i])
				if (board[j + 1][i] == 0 || board[j + 1][i] == board[j][i])
					return true;
		}
	}
	return false;
}

function noBlockVertical(col, row1, row2, board) {
	for (var i = row1 + 1; i < row2; ++i)
		if (board[i][col] != 0)
			return false;
	return true;
}

function noBlockHorizontal(row, col1, col2, board) {
	for (var i = col1 + 1; i < col2; ++i)
		if (board[row][i] != 0)
			return false;
	return true;
}

  

//showanimation2048.js
function showNumberWithAnimation(i, j, randNumber) { //coord
	var numberCell = $('#number-cell-' + i + "-" + j);
	
	numberCell.css('background-color', getNumberBackgroundColor(randNumber));
	numberCell.css('color', getNumberColor(randNumber));
	numberCell.text(randNumber);
	
	numberCell.animate({
		"100px",
		height:"100px",
		top: getPosTop(i, j),
		left: getPosLeft(i, j)
	}, 50); //动画在50毫秒以内完成
}

function showMoveAnimation(fromx, fromy, tox, toy) {
	var numberCell = $("#number-cell-" + fromx + "-" + fromy);
	numberCell.animate({
		top: getPosTop(tox, toy),
		left: getPosLeft(tox, toy)
	}, 200);
}

function updateScore(score) {
	$("#score").text(score);
}

function showGameOver() {
	var showGameover = $("#showGameover");

	showGameover.css('background-color','yellow');
	showGameover.text('Game Over!');
	showGameover.animate({
		"250px",
		height:"150px",
		top: "175px",
		left: "125px"
	}, 200); 
	
}

  

游戏效果图:

原文地址:https://www.cnblogs.com/wenruo/p/4690765.html