js實(shí)現(xiàn)簡(jiǎn)單拼圖游戲
本文實(shí)例為大家分享了js實(shí)現(xiàn)簡(jiǎn)單拼圖游戲的具體代碼,供大家參考,具體內(nèi)容如下
HTML僅有一個(gè)id為game的div,并且沒(méi)有編寫(xiě)css樣式,只需要在img文件夾中放置一個(gè)圖片文件就行,此處我放置的是LOL皇子的圖片,圖片名為'lol.png'
<div id="game">? </div>
以下為實(shí)現(xiàn)后的效果圖

多的不說(shuō),直接上js代碼
/**
?* 游戲配置
?*/
var gameConfig = {
? ? width: 500,
? ? height: 500,
? ? rows: 3, //行數(shù)
? ? cols: 3, //列數(shù)
? ? isOver: false, //游戲是否結(jié)束
? ? imgurl: "img/lol.png", //圖片路徑,注意:相對(duì)的是頁(yè)面路徑
? ? dom: document.getElementById("game") //游戲的dom對(duì)象
};
//每一個(gè)小塊的寬高
gameConfig.pieceWidth = gameConfig.width / gameConfig.cols;
gameConfig.pieceHeight = gameConfig.height / gameConfig.rows;
//小塊的數(shù)量
gameConfig.pieceNumber = gameConfig.rows * gameConfig.cols;
?
var blocks = []; //包含小方塊信息的數(shù)組
?
function isEqual(n1, n2) {
? ? return parseInt(n1) === parseInt(n2);
}
?
/**
?* 小方塊的構(gòu)造函數(shù)
?* @param {*} left?
?* @param {*} top?
?* @param {*} isVisible 是否可見(jiàn)
?*/
function Block(left, top, isVisible) {
? ? this.left = left; //當(dāng)前的橫坐標(biāo)
? ? this.top = top; //當(dāng)前的縱坐標(biāo)
? ? this.correctLeft = this.left; //正確的橫坐標(biāo)
? ? this.correctTop = this.top; //正確的縱坐標(biāo)
? ? this.isVisible = isVisible; //是否可見(jiàn)
? ? this.dom = document.createElement("div");
? ? this.dom.style.width = gameConfig.pieceWidth + "px";
? ? this.dom.style.height = gameConfig.pieceHeight + "px";
? ? this.dom.style.background = `url("${gameConfig.imgurl}") -${this.correctLeft}px -${this.correctTop}px`;
? ? this.dom.style.position = "absolute";
? ? this.dom.style.border = "1px solid #fff";
? ? this.dom.style.boxSizing = "border-box";
? ? this.dom.style.cursor = "pointer";
? ? // this.dom.style.transition = ".5s"; //css屬性變化的時(shí)候,在0.5秒中內(nèi)完成
? ? if (!isVisible) {
? ? ? ? this.dom.style.display = "none";
? ? }
? ? gameConfig.dom.appendChild(this.dom);
?
? ? this.show = function () {
? ? ? ? //根據(jù)當(dāng)前的left、top,重新設(shè)置div的位置
? ? ? ? this.dom.style.left = this.left + "px";
? ? ? ? this.dom.style.top = this.top + "px";
? ? }
? ? //判斷當(dāng)前方塊是否在正確的位置上
? ? this.isCorrect = function () {
? ? ? ? return isEqual(this.left, this.correctLeft) && isEqual(this.top, this.correctTop);
? ? }
?
? ? this.show();
}
?
/**
?* 初始化游戲
?*/
function init() {
? ? //1. 初始化游戲的容器
? ? initGameDom();
? ? //2. 初始化小方塊
? ? //2.1 準(zhǔn)備好一個(gè)數(shù)組,數(shù)組的每一項(xiàng)是一個(gè)對(duì)象,記錄了每一個(gè)小方塊的信息
? ? initBlocksArray();
? ? //2.2 數(shù)組洗牌
? ? shuffle();
? ? //3. 注冊(cè)點(diǎn)擊事件
? ? regEvent();
?
? ? /**
? ? ?* 處理點(diǎn)擊事件
? ? ?*/
? ? function regEvent() {
? ? ? ? //找到看不見(jiàn)的方塊
? ? ? ? var inVisibleBlock = blocks.find(function (b) {
? ? ? ? ? ? return !b.isVisible;
? ? ? ? });
? ? ? ? blocks.forEach(function (b) {
? ? ? ? ? ? b.dom.onclick = function () {
? ? ? ? ? ? ? ? if (gameConfig.isOver) {
? ? ? ? ? ? ? ? ? ? return;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? //判斷是可以交換
? ? ? ? ? ? ? ? if (b.top === inVisibleBlock.top &&
? ? ? ? ? ? ? ? ? ? isEqual(Math.abs(b.left - inVisibleBlock.left), gameConfig.pieceWidth)
? ? ? ? ? ? ? ? ? ? ||
? ? ? ? ? ? ? ? ? ? b.left === inVisibleBlock.left &&
? ? ? ? ? ? ? ? ? ? isEqual(Math.abs(b.top - inVisibleBlock.top), gameConfig.pieceHeight)) {
? ? ? ? ? ? ? ? ? ? //交換當(dāng)前方塊和看不見(jiàn)的方塊的坐標(biāo)位置
? ? ? ? ? ? ? ? ? ? exchange(b, inVisibleBlock);
? ? ? ? ? ? ? ? ? ? //游戲結(jié)束判定
? ? ? ? ? ? ? ? ? ? isWin();
? ? ? ? ? ? ? ? }
?
? ? ? ? ? ? ? ? //交換當(dāng)前方塊和看不見(jiàn)的方塊的坐標(biāo)位置
? ? ? ? ? ? ? ? // exchange(b, inVisibleBlock);
? ? ? ? ? ? ? ? // //游戲結(jié)束判定
? ? ? ? ? ? ? ? // isWin();
? ? ? ? ? ? }
? ? ? ? })
? ? }
?
? ? /**
? ? ?* 游戲結(jié)束判定
? ? ?*/
? ? function isWin() {
? ? ? ? var wrongs = blocks.filter(function (item) {
? ? ? ? ? ? return !item.isCorrect();
? ? ? ? });
? ? ? ? if (wrongs.length === 0) {
? ? ? ? ? ? gameConfig.isOver = true;
? ? ? ? ? ? //游戲結(jié)束,去掉所有邊框
? ? ? ? ? ? blocks.forEach(function (b) {
? ? ? ? ? ? ? ? b.dom.style.border = "none";
? ? ? ? ? ? ? ? b.dom.style.display = "block";
? ? ? ? ? ? });
? ? ? ? }
? ? }
?
? ? /**
? ? ?* 隨機(jī)數(shù),能取到最大值
? ? ?* @param {*} min?
? ? ?* @param {*} max?
? ? ?*/
? ? function getRandom(min, max) {
? ? ? ? return Math.floor(Math.random() * (max + 1 - min) + min);
? ? }
?
? ? /**
? ? ?* 交換兩個(gè)方塊的left和top
? ? ?* @param {*} b1?
? ? ?* @param {*} b2?
? ? ?*/
? ? function exchange(b1, b2) {
? ? ? ? var temp = b1.left;
? ? ? ? b1.left = b2.left;
? ? ? ? b2.left = temp;
?
? ? ? ? temp = b1.top;
? ? ? ? b1.top = b2.top;
? ? ? ? b2.top = temp;
?
? ? ? ? b1.show();
? ? ? ? b2.show();
? ? }
?
? ? /**
? ? ?* 給blocks數(shù)組洗牌
? ? ?*/
? ? function shuffle() {
? ? ? ? for (var i = 0; i < blocks.length - 1; i++) {
? ? ? ? ? ? //隨機(jī)產(chǎn)生一個(gè)下標(biāo)
? ? ? ? ? ? var index = getRandom(0, blocks.length - 2);
? ? ? ? ? ? //將數(shù)組的當(dāng)前項(xiàng)與隨機(jī)項(xiàng)交換left和top值
? ? ? ? ? ? exchange(blocks[i], blocks[index]);
? ? ? ? }
? ? }
?
? ? /**
? ? ?* 初始化一個(gè)小方塊的數(shù)組
? ? ?*/
? ? function initBlocksArray() {
? ? ? ? for (var i = 0; i < gameConfig.rows; i++) {
? ? ? ? ? ? for (var j = 0; j < gameConfig.cols; j++) {
? ? ? ? ? ? ? ? //i 行號(hào),j 列號(hào)
? ? ? ? ? ? ? ? var isVisible = true;
? ? ? ? ? ? ? ? if (i === gameConfig.rows - 1 && j === gameConfig.cols - 1) {
? ? ? ? ? ? ? ? ? ? isVisible = false;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? var b = new Block(j * gameConfig.pieceWidth, i * gameConfig.pieceHeight, isVisible);
? ? ? ? ? ? ? ? blocks.push(b);
? ? ? ? ? ? }
? ? ? ? }
? ? }
?
? ? /**
? ? ?* 初始化游戲容器
? ? ?*/
? ? function initGameDom() {
? ? ? ? gameConfig.dom.style.width = gameConfig.width + "px";
? ? ? ? gameConfig.dom.style.height = gameConfig.height + "px";
? ? ? ? gameConfig.dom.style.border = "2px solid #ccc";
? ? ? ? gameConfig.dom.style.position = "relative";
? ? }
}
?
init();?以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
TypeScript中的交叉類型和聯(lián)合類型示例講解
交叉類型簡(jiǎn)單來(lái)說(shuō)就是通過(guò)&符號(hào)將多個(gè)類型進(jìn)行合并成一個(gè)類型,然后用type來(lái)聲明新生成的類型,聯(lián)合類型和交叉類型比較相似,聯(lián)合類型通過(guò)|符號(hào)連接多個(gè)類型從而生成新的類型,本文就這兩個(gè)類型結(jié)合示例代碼詳細(xì)講解,感興趣的朋友跟隨小編一起學(xué)習(xí)吧2022-12-12
實(shí)例學(xué)習(xí)JavaScript讀取和寫(xiě)入cookie
本篇內(nèi)容主要給大家通過(guò)實(shí)例講述了JavaScript讀取和寫(xiě)入cookie的相關(guān)知識(shí)點(diǎn),有這方面需要的朋友參考下吧。2018-01-01
深入淺析JavaScript中prototype和proto的關(guān)系
prototype,每一個(gè)函數(shù)對(duì)象都有一個(gè)顯示的prototype屬性,而proto每個(gè)對(duì)象都有一個(gè)名為_(kāi)proto_內(nèi)部隱藏屬性。本文給大家介紹JavaScript中prototype和proto的關(guān)系,需要的朋友參考下2015-11-11
javascript高級(jí)學(xué)習(xí)筆記整理
打算做一個(gè)js面向?qū)ο蟮呢澇陨?但是最終是流產(chǎn)了,整理了下廢棄的代碼,回顧了下PPT.想學(xué)習(xí)js面向?qū)ο蟮呐笥岩部梢詤⒖枷隆?/div> 2011-08-08
前端layui?table表格勾選事件以及常見(jiàn)模塊詳解
Layui 是一個(gè)非常流行的前端框架,其中的table組件可以幫助您實(shí)現(xiàn)復(fù)選框功能,下面這篇文章主要給大家介紹了關(guān)于前端layui?table表格勾選事件以及常見(jiàn)模塊的相關(guān)資料,需要的朋友可以參考下2024-08-08
js開(kāi)發(fā)一個(gè)類似ChatGPT的AI應(yīng)用助手
一位創(chuàng)業(yè)朋友想做一個(gè)垂直領(lǐng)域的AI助手,經(jīng)過(guò)一個(gè)月的開(kāi)發(fā)迭代,我們成功上線了第一個(gè)版本,這篇文章分享了開(kāi)發(fā)一個(gè)類似ChatGPT的應(yīng)用的過(guò)程,包括技術(shù)選型、架構(gòu)設(shè)計(jì)和實(shí)戰(zhàn)經(jīng)驗(yàn),實(shí)現(xiàn)了流式響應(yīng)、上下文記憶系統(tǒng)和優(yōu)化提示詞,應(yīng)用得到了用戶的高度評(píng)價(jià)2024-12-12
淺析js設(shè)置控件的readonly與enabled屬性問(wèn)題
本篇文章是對(duì)js設(shè)置控件的readonly與enabled屬性問(wèn)題進(jìn)行了介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-12-12最新評(píng)論

