• 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); 
    	
    }
    

      

    游戏效果图:

  • 相关阅读:
    Excel Formulas-Vlookup
    C#字符串与unicode互相转换
    string.IsNullOrWhiteSpace
    CREATE SEQUENCE sqlserver
    error CS1056
    WebExceptionStatus
    运维踩坑记
    C# 快捷命令
    sqlserver2019安装教程
    sql server 数据库mdf文件和log文件过大问题
  • 原文地址:https://www.cnblogs.com/wenruo/p/4690765.html
Copyright © 2020-2023  润新知