ホームページ  >  記事  >  ウェブフロントエンド  >  ネイティブ JavaScript で連聯館ゲームを実装

ネイティブ JavaScript で連聯館ゲームを実装

高洛峰
高洛峰オリジナル
2016-11-28 13:32:031216ブラウズ

首先看一下html的布局方式在index.html文件中:

 

[html]  

 

 

     

         

        连连看  

       

     

     

       

 

           

 

               

 

                   

 

                   

 

               

 

               

 

               

 

                    分  数  

               

 

               

 

                    0  

               

 

               

 

                    时  间  

               

 

               

 

                    0  

               

 

               

 

                     

                     

               

                 

           

 

 

 

 

 

 

 

css文件夹下のindex.css文件如下:

[css]

body {

font-size : 16px;  

font-weight : 太字;  

色: グレー;  

}

#whole {

border : 1px double #999999;  

border-width : 5px;  

幅: 800px;  

高さ: 505px;  

位置 : 相対的。  

}

#gamePanel {

margin: 1px 1px 1px 1px;  

幅: 602px;  

高さ: 502px;  

背景: url(../img/background.gif) 繰り返し;  

位置 : 絶対的。  

}

#個 {

margin-top : 35px;  

境界線: 1px 実線 #999999;  

幅: 546px;  

高さ: 434px;  

位置: 相対的。  

}

#個 .piece {

width : 32px;  

高さ: 36px;  

位置 : 相対的。  

カーソル : ポインタ;  

float : 左;  

}

#個 .track {

width : 32px;  

高さ: 36px;  

位置 : 相対的。  

float : 左;  

}

#個 .track2 {

width : 32px;  

高さ: 36px;  

位置 : 相対的。  

float : 左;  

背景: 赤;  

}

#gameLogo {

margin-top : 60px;  

境界線: 1px 実線 #999999;  

左: 607px;  

幅: 187px;  

高さ: 73px;  

背景 : url(../img/logo.gif);  

位置: 絶対的。  

}

#scorePanel {

境界線 : 1px 実線 #999999;  

左: 607px;  

トップ: 200ピクセル;  

幅: 187px;  

高さ: 30px;  

位置 : 絶対的。  

}

#score {

境界線 : 1px 実線 #999999;  

左: 607px;  

トップ: 240ピクセル;  

幅: 187px;  

高さ: 30px;  

位置 : 絶対的。  

}

#timePanel {

境界線 : 1px 実線 #999999;  

左: 607px;  

トップ: 300ピクセル;  

幅: 187px;  

高さ: 30px;  

位置 : 絶対的。  

}

#time {

境界線 : 1px 実線 #999999;  

左: 607px;  

トップ: 340ピクセル;  

幅: 187px;  

高さ: 30px;  

位置 : 絶対的。  

}

#button {

境界線 : 1px 実線 #999999;  

左: 607px;  

トップ: 400ピクセル;  

幅: 187px;  

height : 30px;

Position :Absolute;

コアの js 部分の実装コードを見てみましょう。 .js、map.js、および Piece.js のソース ファイルはクラスに対応します。このゲームは、ゲーム クラスを使用してマップと画像のピース オブジェクトを操作します。

game.js コードは次のとおりです。 javascript]

// ゲーム コントロール クラス

var Game = {

// ゲームの背景

gamePanel: null,

// スコア

スコア: 0、

// 時間

time: 0,

// 画像マッピングテーブル

PieceMap: null,

// 画像リスト

PieceList: [],

pieceimglist: [],

// 画像はランダムです番号ランダムリスト:[]、

//軌跡リスト

トラックリスト:[]、

//ゲームが開始されるかどうか初めてクリックします

rset:function(){document.getElementById( "start")。 "リセット")。

this.initImgPieces();

document.getElementById("time").innerHTML = 0; ;

Document.getElementById("スコア")

this.isGameReset =

// 初期化

init : function() {

if (this .isGameBegin) {

var _this;

this.time = 0;

これ。 gamePanel = document.getElementById("ピース"); (); this.initImgPieces(); This.isGameBegin = true

},

机付き // ランダムに生成された 150 枚の画像をキャンバスに追加します

Initpieces: Function () {

var _This = This.IntrandomList()

var x = (i%17); var y = Math.floor(i/17);

Piece.setPosition(x, y) ; if(x == 0 || x == y == 0 || y == 11) ; ) {

e Piece.Setatedge (true);

}

this.pieceimglist.push (piece)

// 画像を初期化する

initImgPieces : function() {

ImgList[ i].initImg();

This.pieceImgList[i].img.src = "img/pieces/"+this.randomList[i]+".gif"

This.pieceImgList[i].setImgSrc(this.pieceImgList[i].img. src){int. random() *10000、10); this.randomlist.push(number); temp = this.randomList [i];

this.randomList[i] = this.randomList[数値];

var _this = これ; } else {

innerHTML = this.time; .isGameBegin = true;

setTimeout(function() {_this.startTime();}, 1000) }

;クリア

クリア : function() {

for (変数 i = 0; < this.pieceList.length i ++) {

i] .dom);

this.pieceImgList = [];

this.isGameOver = true; GameBegin = false; ("開始").無効 = false

;

document.getElementById("reset").disabled = true;

}

// ゲーム開始入口

function Start() {

Game.start();

}

//ゲームリセットエントリ

function Reset() {

Game.reset();

カスタマイズされた js バージョンマッピング構造体map.jsのソースファイルは次のとおりです:

[javascript]

var Map = function(){

this.data = [];

}

M ap.prototype = {

put : function(key, value) {

through ’ ’ s ’ using ’ s ’ ‐ ‐ ‐ ‐ ‐ function(key, value) { return this.data[key] },

isEmpty : function() {

return this.data .length == 0;

},

size: function() {

} return this.data.length }

}

photos クラスピース.js のソースファイルは次のとおりです:

[javascript]

var Piece = function(game) {

// ゲームobject

this.game = game;

// エッジ要素かどうか

this.isEdge = false; // エッジ要素の隣にあるかどうか

this.atEdge = false ;

// 画像要素

this.dom = null;

// 画像要素

this.img = null;

this.src = null ;

// トラック要素

this.track = null;

// トラックとして使用できるかどうか

This.isTracked = false; // チェックマーク要素

this. selected = null;

// 画像を横に配置します This.x = 0;

// 画像を縦に配置します

this.y = 0

// 画像フラッシュ ID

this.flashId = null;

// 画像がクリックされたかどうか

this.onClicked = false;

this.flashCount = 0;

}

Piece.prototype = {

// 初期化

init : function( ) {

This.dom = document.createElement("div"); This.dom.className = " Piece"; createElement("img");

},

// 初期化画像

initImg: function() {

this.img = document.createElement("img");

this.dom.appendChild(this.img);  

},

// 满足算法後の初期化track元素

initTrack : function() {

if (this.flashId != null) {

// 停止闪烁

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 = "トラック";  

this.dom.appendChild(this.track);  

},

// 位图片设置来源

setImgSrc : function(src) {

this.src = src;  

},

// 图片设置二维排列位置

setPosition : function(x, y) {

this.x = x;  

this.y = y;  

},

// 图片设置选中元素

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

}

},

// 設置が边であるかどうか缘元素

setEdge : function(isEdge) {

this.isEdge = isEdge;  

},

// 设置是否傍着边缘元素

setAtEdge : function(atEdge) {

this.atEdge = atEdge;  

},

// 开始闪烁

flash : function() {

var _this = これ;  

This.flashId = setInterval(function() {_this.setSelected();}, 500)

},

// 点滅を停止

stopFlash: function() {

clearInterval() this.flashId);

if (this.flashCount % 2 == 1) {

//this.dom.appendChild(this.img) ,

对 // オブジェクト内部関数

; onclick:function(){

{

}} var _this = this.img.onclick = function()if(_this.onclicked ) {

戻る

}}

(_this.checkpiece ()) {

戻る;

_this.flash ( ); _this.onClicked = true;

// クリックされた画像があるかどうかを確認します

checkPiece : function() {

i = 0; this.game.pieceList.length; {

)) {

//alert("同じ画像" ); [i]);

ピースリスト[i].stopFlash();

a.game.pieceList [i] ;

- this.x) == 1) && (piece.y == this.y)

|| (Math.abs(ピース.y - this.y) == 1) && (ピース.x ==これ; 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));  

続けます。  

} 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

//alert(" this.y == ピース.y: " + i + "," + ピース.y);  

if (this.game.pieceMap.get(i + "," + Piece.y).isPass()) {

b = true;  

this.game.trackList.push(this.game.pieceMap.get(i + "," + Piece.y));  

続けます。  

} else {

b = false

this.game.trackList = [ ];  

bを返す。  

}

}

}

|| を返します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);  

true を返します。  ️ && Corner_2.isPass()) {

//alert("corner_2: " + Piece .x + "," + this.y);  

this.game.trackList.push(corner_2);  

true を返します。  

}

false を返します。  

},

// 直接または途中一次弯搜索

isReach : function(piece) {

var a = this.isSストレートリーチ(ピース);  

var b = this.isReach1(個);  

|| を返します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 = [];  

休憩。  

}} else if(this.game.piecemap.get(i + "、" + this.y).isreach(fee)&& this.game.piecemap.get(i + "、" + this。 y).isPass()) {

this.game.trackList.push(this.game.pieceMap.get(i + "," + this.y));  

true を返します。  ️ for (var i = this.x - 1; i >= 0; i --) {

if (!this .game.pieceMap.get(i + "," + this.y).isPass()) {

this.game.trackList = [];  

休憩。  

}} else if(this.game.piecemap.get(i + "、" + this.y).isreach(fee)&& this.game.piecemap.get(i + "、" + this。 y).isPass()) {

this.game.trackList.push(this.game.pieceMap.get(i + "," + this.y));  

true を返します。  

}

}

// 沿線轴搜索

for (var i = this.y - 1; i >= 0; i --) {

if (!this.game.pieceMap.get(this. x + "," + i).isPass()) {

this.game.trackList = [];  

休憩。  

}} else if(this.game.piecemap.get(this.x + "、" + i).isreach(fee)&& this.game.piecemap.get(this.x + "、" + i).isPass()) {

this.game.trackList.push(this.game.pieceMap.get(this.x + "," + i));  

true を返します。  

}

}

// 沿線轴正向搜索

for (var i = this .y + 1; i

if (! this.game.pieceMap.get(this.x + "," + i).isPass()) {

this.game.trackList = [];  

休憩。  

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

true を返します。  

}

}

falseを返します。  

},

// 路径连接

linkTrack : function(piece) {

this.initTrack();  

Piece.initTrack();  

this.changeScore();  

this.showTrack(ピース);  

},

// 显示足迹

showTrack : function(piece) {

this.game.trackList.push(ピース);  

this.track.className = "track2";  

for (var i = 0; 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[i].track.className = "トラック";  

}

this.game.trackList = [];  

this.track.className = "トラック";  

this.isTracked = true;  

},

// 分数增加

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;  


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。