Use non-html5 to implement js board Lianliankan game sample code_javascript skills WBOY Original
2016-05-16 17:21:54 1272browse
Let me share with you how to implement the js version of the Lianliankan game, as shown in the figure below: First look at the html layout in the index.html file:
Lianliankan < ;div id="gamePanel" tabindex="0">
score
0
0
< /body>
The index.css file in the css folder is as follows:
body { font-size : 16px; font-weight : bold; color : gray; } #whole { border : 1px double #999999; border-width : 5px; width : 800px; height : 505px ; position : relative; } #gamePanel { margin: 1px 1px 1px 1px; width : 602px; height : 502px ; background : url(../img/background.gif) repeat; position : absolute; } #pieces { margin- top : 35px; border : 1px solid #999999; width : 546px; height : 434px; position: relative; } #pieces .piece { width : 32px; height : 36px; position : relative; cursor : pointer; float : left; } #pieces .track { width : 32px; height : 36px; position : relative; float : left; } #pieces .track2 { width : 32px; height : 36px; position : relative; float : left; background : red; } #gameLogo { margin-top : 60px; border : 1px solid #999999; left : 607px; width : 187px; height : 73px; background : url(../img/logo.gif); position: absolute; } #scorePanel { border : 1px solid #999999; left : 607px; top : 200px; width : 187px; height : 30px; position : absolute; } #score { border : 1px solid #999999; left : 607px; top : 240px; width : 187px; height : 30px; position : absolute; } #timePanel { border : 1px solid #999999; left : 607px; top : 300px; width : 187px; height : 30px; position : absolute; } #time { border : 1px solid #999999; left : 607px; top : 340px; width : 187px; height : 30px; position : absolute; } #button { border : 1px solid #999999; left : 607px; top : 400px; width : 187px; height : 30px; position : absolute; }
Let’s take a look at the core js part implementation code. The js part is divided into three source files, namely game.js, map.js, piece Each .js source file corresponds to a class. This game uses the game class to manipulate map and picture piece objects:
The game.js code is as follows:
// Game control class var Game = { // Game background gamePanel: null, // Score score: 0 , // Time time: 0, // Picture mapping table pieceMap: null, // Picture list pieceList: [], //The picture list does not contain pictures pieceImgList: [], // The picture random number list randomList: [], // Track list trackList: [], // Whether the game starts isGameBigin: false, // Whether the game ends isGameOver: false, // Whether the game is reset isGameReset: false, // Whether the picture element is clicked for the first time isFirstClick: true, // Start the game start : function() { document.getElementById("start").disabled = true; document.getElementById("reset").disabled = false; if (this.isGameReset) { this.isGameOver = false; this.startTime(); return; } else if (this.isGameBegin) { return; } else { this.init(); return; } }, reset : function() { document.getElementById("start").disabled = false; document.getElementById("reset").disabled = true; this.clear(); this.initPieces(); this.initImgPieces(); this.time = 0; document.getElementById("time"). innerHTML = 0; this.score = 0; document.getElementById("score").innerHTML = 0; this.isGameReset = true; this.isGameBegin = true; }, // Initialization init : function() { if (this.isGameBegin) { return; } this.pieceMap = new Map(); var _this = this; this.time = 0; this. startTime(); this.gamePanel = document.getElementById("pieces"); this.initPieces(); this.initImgPieces(); this.isGameBegin = true; }, // Add 150 randomly generated pictures to the canvas initPieces: function() { var _this = this; this.initRandomList(); //Disrupt the random list sorting this.messRandomList(); for (var i = 0; i < 204; i ) { var piece = new Piece(this); this.pieceList.push(piece); var x = (i ); var y = Math.floor(i/17); this.pieceMap.put(x "," y, piece); piece.setPosition(x, y); this.gamePanel.appendChild(piece.dom); if (x == 0 || x == 16 || y == 0 || y == 11) { piece.track = document.createElement("div"); piece.track.className = "track"; piece.dom.appendChild(piece.track); piece.isTracked = true; continue; } else { if (x == 1 || x == 15 || y == 1 || y == 10) { piece.setAtEdge(true); } this.pieceImgList.push(piece); } } }, //Initialize pictures initImgPieces: function() { for (var i = 0; i < this.pieceImgList.length; i ) { this.pieceImgList[i].initImg(); this.pieceImgList[i].img.src = "img/pieces/" this.randomList[i] ".gif" this.pieceImgList[i].setImgSrc(this.pieceImgList[i].img.src); // Execute image click event this.pieceImgList[i].onClick(); } }, // Initialize the random table initRandomList: function() { // Get the random number sequence, appearing in pairs for (var i = 0; i < 75; i ) { var random = parseInt(Math.random()*22*10000, 10); var number = random#; this.randomList.push(number); this.randomList.push(number); } }, // Disrupt the random table messRandomList : function() { for (var i = 0; i < this.randomList.length; i ) { var random = parseInt(Math.random()* 15*10000, 10); var number = random 0; var temp; temp = this.randomList[i]; this.randomList[i] = this. randomList[number]; this.randomList[number] = temp; } }, // Start timing startTime : function() { var _this = this; if (this.isGameOver) { return; } else { this. time ; document.getElementById("time").innerHTML = this.time; this.isGameBegin = true; setTimeout(function() {_this.startTime();}, 1000); } }, // Clear clear : function() { for (var i = 0; i < this. pieceList.length; i ) { this.gamePanel.removeChild(this.pieceList[i].dom); } this.pieceList = []; this.randomList = []; this.pieceImgList = []; this.isGameOver = true; this.isGameBegin = false; } } window.onload = function() { document.getElementById("start").disabled = false; document.getElementById("reset").disabled = true; } // Game start entry function Start() { Game.start(); } //Game reset entry function Reset() { Game.reset(); }
The customized js version mapping structure map.js source file is as follows:
var Map = function(){ this.data = []; } Map.prototype = { put : function(key, value) { this.data[key] = value; }, get : function(key) { return this. data[key]; }, remove : function(key) { this.data[key] = null; }, isEmpty : function() { return this.data.length == 0; }, size : function() { return this. data.length; } }
The picture class piece.js source file is as follows:
var Piece = function(game) { // Game object this.game = game; // Whether it is an edge element this. isEdge = false; // Whether it is next to the edge element this.atEdge = false; // Image dom element this.dom = null; // Image element this.img = null; // Image element source this.src = null; // Track element this. track = null; // Whether it can be used as a track this.isTracked = false; // Check mark element this.selected = null; // Pictures are arranged horizontally this.x = 0; // Pictures are arranged vertically this.y = 0; // Picture flashing Id this .flashId = null; // Whether the image is clicked this.onClicked = false; // Number of flashes this.flashCount = 0; this.init(); } Piece.prototype = { // Initialization init: function() { this. dom = document.createElement("div"); this.dom.className = "piece"; this.selected = document.createElement("img"); } , //Initialize image initImg: function() { this.img = document.createElement("img"); this.dom.appendChild (this.img); }, // Initialize the track element after satisfying the algorithm initTrack: function() { if (this.flashId != null) { // Stop flashing this.stopFlash(); } //alert("initTrack middle"); if ( this.track != null) { return; } this.onClicked = false; this.dom.removeChild(this.img); this.track = document.createElement("div"); this.track.className = "track"; this.dom.appendChild(this.track); }, // Bit image setting source setImgSrc : function(src) { this.src = src; }, //Set the two-dimensional arrangement position for the picture setPosition : function(x, y) { this.x = x; this.y = y; } , //Set the selected element for the image setSelected : function() { if (this.flashCount % 2 == 0) { //this .dom.removeChild(this.img); //this.selected.src = "img/selected.gif"; //this.dom.appendChild(this.selected); this. img.src = "img/pieces/flash.gif"; } else { //if (this.selected != null) { // this .dom.removeChild(this.selected); //} this.img.src = this.src; //this.dom.appendChild(this.img) ; } }, // Set whether it is an edge element setEdge: function(isEdge) { this.isEdge = isEdge ; }, // Set whether it is next to the edge element setAtEdge: function(atEdge) { this.atEdge = atEdge; }, // Start flashing flash : function() { var _this = this; this.flashId = setInterval(function() {_this.setSelected( );}, 500); }, // Stop flashing stopFlash: function() { clearInterval(this.flashId); if (this.flashCount % 2 == 1) { //if (this.selected != null) { // this.dom.removeChild(this.selected ); //} this.img.src = this.src; //this.dom.appendChild(this.img); } }, // The internal function of the selected object onClick: function() { if (this.onClicked) { return; } var _this = this; this.img.onclick = function() { if (!document.getElementById(" start").disabled) { return; } if (_this.onClicked) { return; } if (_this.checkPiece()) { return; } _this.flash(); _this.onClicked = true ; }; }, // Check whether there is a clicked picture checkPiece: function() { for (var i = 0; i < this.game.pieceList.length; i ) { if (this.game.pieceList[i].onClicked && !this.game.pieceList[i].equal(this )) { if (this.game.pieceList[i].equalImage(this)) { //alert("The same Image"); this.searchTrack( this.game.pieceList[i]); } else { this.game.pieceList[i].stopFlash(); this.game.pieceList[i]. onClicked = false; this.onClicked = false; return false; } return true; } else { continue; } } return false; }, // Whether it is the same object equal : function(piece) { return (this.x == piece.x && this.y == piece.y); }, // Whether it is the same picture equalImage : function(piece) { return this.src == piece.src; }, // Search Path searchTrack: function(piece) { if (this.isNear(piece)) { this.linkTrack(piece); return; } if (this.isReach(piece) || this.isReach2(piece)) { this.linkTrack(piece); return; } }, // Whether adjacent isNear : function(piece) { var a = (Math.abs(piece.x - this. x) == 1) && (piece.y == this.y) || (Math.abs(piece.y - this.y) == 1) && (piece.x == this.x) ; return a; }, // 直线 isStraightReach : function(piece) { //alert("isStraightReach"); if (this.isNear(piece)) { return true; } var a = false; var b = false; // 沿y轴方向搜索 if (this.x == piece.x) { //alert("!!!!!!!!!!!"); for (var i = this.min(this.y, piece.y) 1; i < this.max(this.y, piece.y); i ) { //alert("this.x == piece.x: " piece.x "," i); if (this.game.pieceMap.get(piece.x "," i).isPass()) { a = true; this.game.trackList.push(this.game.pieceMap.get(piece.x "," i)); continue; } else { a = false; this.game.trackList = []; return a; } } } // 沿x轴方向搜索 if (this.y == piece.y) { //alert("!!!!!!!!!!!"); for (var i = this.min(this.x, piece.x) 1; i < this.max(this.x, piece.x); i ) { //alert("this.y == piece.y: " i "," piece.y); if (this.game.pieceMap.get(i "," piece.y).isPass()) { b = true; this.game.trackList.push(this.game.pieceMap.get(i "," piece.y)); continue; } else { b = false this.game.trackList = []; return b; } } } return a || b; }, // 拐一次弯搜索 isReach1 : function(piece) { //alert("isReach1"); var corner_1 = this.game.pieceMap.get(this.x "," piece.y); var corner_2 = this.game.pieceMap.get(piece.x "," this.y); var _this = this; if ((_this.isStraightReach(corner_1)) && (corner_1.isStraightReach(piece)) && corner_1.isPass()) { //alert("corner_1: " this.x "," piece.y); this.game.trackList.push(corner_1); return true; } if ((_this.isStraightReach(corner_2)) && (corner_2.isStraightReach(piece)) && corner_2.isPass()) { //alert("corner_2: " piece.x "," this.y); this.game.trackList.push(corner_2); return true; } return false; }, // 直接或拐一次弯搜索 isReach : function(piece) { var a = this.isStraightReach(piece); var b = this.isReach1(piece); return a || b; }, // 拐两次弯搜索 isReach2 : function(piece) { // 沿x轴正向搜索 for (var i = this.x 1; i < 17; i ) { if (!this.game.pieceMap.get(i "," this.y).isPass()) { this.game.trackList = []; break; } else if (this.game.pieceMap.get(i "," this.y).isReach(piece) && this.game.pieceMap.get(i "," this.y).isPass()) { this.game.trackList.push(this.game.pieceMap.get(i "," this.y)); return true; } } // 沿x轴搜索 for (var i = this.x - 1; i >= 0; i --) { if (!this.game.pieceMap.get(i "," this.y).isPass()) { this.game.trackList = []; break; } else if (this.game.pieceMap.get(i "," this.y).isReach(piece) && this.game.pieceMap.get(i "," this.y).isPass()) { this.game.trackList.push(this.game.pieceMap.get(i "," this.y)); return true; } } // 沿y轴搜索 for (var i = this.y - 1; i >= 0; i --) { if (!this.game.pieceMap.get(this.x "," i).isPass()) { this.game.trackList = []; break; } else if (this.game.pieceMap.get(this.x "," i).isReach(piece) && this.game.pieceMap.get(this.x "," i).isPass()) { this.game.trackList.push(this.game.pieceMap.get(this.x "," i)); return true; } } // 沿y轴正向搜索 for (var i = this.y 1; i < 12; i ) { if (!this.game.pieceMap.get(this.x "," i).isPass()) { this.game.trackList = []; break; } else if (this.game.pieceMap.get(this.x "," i).isReach(piece) && this.game.pieceMap.get(this.x "," i).isPass()) { this.game.trackList.push(this.game.pieceMap.get(this.x "," i)); return true; } } return false; }, // 路径连接 linkTrack : function(piece) { this.initTrack(); piece.initTrack(); this.changeScore(); this.showTrack(piece); }, // 显示足迹 showTrack : function(piece) { this.game.trackList.push(piece); this.track.className = "track2"; for (var i = 0; i < this.game.trackList.length; i ) { //alert(i); this.game.trackList[i].track.className = "track2"; } var _this = this; setTimeout(function() {_this.hideTrack()}, 500); }, // 隐匿足迹 hideTrack : function() { for (var i = 0; i < this.game.trackList.length; i ) { this.game.trackList[i].track.className = "track"; } this.game.trackList = []; this.track.className = "track"; this.isTracked = true; }, //Score increase changeScore: function() { this.game.score = 100; document.getElementById("score").innerHTML = this. game.score; }, min : function(a, b) { if (a < b) { return a; } else { return b; } }, max : function(a, b) { if (a > b) { return a; } else { return b; } }, // Determine whether isPass: function() { return this.track != null; } }
The above is the code of the source file. For the specific implementation code, please pay attention to zhangjinpeng66 download in CSDN. Let’s talk about the core part of the Lianliankan game, the search path implemented in js.
The first and simplest thing to implement the search path algorithm in js is to judge whether two pictures can reach the function code in a straight line as follows:
// Straight line isStraightReach: function(piece) { //alert("isStraightReach"); if (this.isNear( piece)) { return true; } var a = false; var b = false; // along the y-axis Direction search if (this.x == piece.x) { //alert("!!!!!!!!!!!!"); for (var i = this.min (this.y, piece.y) 1; i < this.max(this.y, piece.y); i ) { //alert("this.x == piece.x: " piece. x "," i); if (this.game.pieceMap.get(piece.x "," i).isPass()) { a = true; this.game.trackList.push(this.game.pieceMap.get(piece.x "," i)); continue; } else { a = false; this.game.trackList = []; return a; } } } // Along the x-axis Direction search if (this.y == piece.y) { //alert("!!!!!!!!!!!!"); for (var i = this.min (this.x, piece.x) 1; i < this.max(this.x, piece.x); i ) { //alert("this.y == piece.y: " i " ," piece.y); if (this.game.pieceMap.get(i "," piece.y).isPass()) { b = true; this.game .trackList.push(this.game.pieceMap.get(i "," piece.y)); continue; } else { b = false this .game.trackList = []; return b; } } } return a || b; },
This function implements the simplest step of Lianliankan to determine whether two pictures meet the connection conditions, and then performs a roundabout search.
// Search around a corner isReach1: function (piece) { //alert("isReach1"); var corner_1 = this.game.pieceMap.get(this.x "," piece.y); var corner_2 = this.game .pieceMap.get(piece.x "," this.y); var _this = this; if ((_this.isStraightReach(corner_1)) && (corner_1.isStraightReach(piece)) && corner_1.isPass()) { //alert("corner_1: " this.x "," piece.y); this.game .trackList.push(corner_1); return true; } if ((_this.isStraightReach(corner_2)) && (corner_2.isStraightReach(piece)) && corner_2.isPass()) { //alert("corner_2: " piece.x "," this.y); this.game.trackList.push(corner_2); return true; } return false; },
The direct search function is called in the search function, which is also the most complicated. The two-turn search will also call the function of one-turn search.
// 拐两次弯搜索 isReach2 : function(piece) { // 沿x轴正向搜索 for (var i = this.x 1; i < 17; i ) { if (!this.game.pieceMap.get(i "," this.y).isPass()) { this.game.trackList = []; break; } else if (this.game.pieceMap.get(i "," this.y).isReach(piece) && this.game.pieceMap.get(i "," this.y).isPass()) { this.game.trackList.push(this.game.pieceMap.get(i "," this.y)); return true; } } // 沿x轴搜索 for (var i = this.x - 1; i >= 0; i --) { if (!this.game.pieceMap.get(i "," this.y).isPass()) { this.game.trackList = []; break; } else if (this.game.pieceMap.get(i "," this.y).isReach(piece) && this.game.pieceMap.get(i "," this.y).isPass()) { this.game.trackList.push(this.game.pieceMap.get(i "," this.y)); return true; } } // 沿y轴搜索 for (var i = this.y - 1; i >= 0; i --) { if (!this.game.pieceMap.get(this.x "," i).isPass()) { this.game.trackList = []; break; } else if (this.game.pieceMap.get(this.x "," i).isReach(piece) && this.game.pieceMap.get(this.x "," i).isPass()) { this.game.trackList.push(this.game.pieceMap.get(this.x "," i)); return true; } } // 沿y轴正向搜索 for (var i = this.y 1; i < 12; i ) { if (!this.game.pieceMap.get(this.x "," i).isPass()) { this.game.trackList = []; break; } else if (this.game.pieceMap.get(this.x "," i).isReach(piece) && this.game.pieceMap.get(this.x "," i).isPass()) { this.game.trackList.push(this.game.pieceMap.get(this.x "," i)); return true; } } return false; },
该函数以点击的图片为中心分别沿x轴,y轴展开搜索。
以上是本游戏代码的全部内容。具体游戏源码请到CSDN中zhangjinpeng66的资源里下载。