在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美

當前位置:雨林木風下載站 > 網頁設計教程 > 詳細頁面

如何使用原生的JavaScript來完成一個容易的拼圖小游戲

如何使用原生的JavaScript來完成一個容易的拼圖小游戲

更新時間:2025-12-08 文章作者:未知 信息來源:網絡 閱讀次數:

網頁的本質就是超級文本標記語言,通過結合使用其他的Web技術(如:腳本語言、公共網關接口、組件等),可以創造出功能強大的網頁。因而,超級文本標記語言是萬維網(Web)編程的基礎,也就是說萬維網是建立...
網頁的本質就是超級文本標記語言,通過結合使用其他的Web技術(如:腳本語言、公共網關接口、組件等),可以創造出功能強大的網頁。因而,超級文本標記語言是萬維網(Web)編程的基礎,也就是說萬維網是建立在超文本基礎之上的。超級文本標記語言之所以稱為超文本標記語言,是因為文本中包含了所謂“超級鏈接”點。
本篇文章的內容是關于如何利用原生的 JavaScript來實現一個簡單的拼圖小游戲,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

一、游戲的基礎邏輯

想用一門語言來開發游戲,必須先了解如何使用這門語言來實現一些基礎邏輯,比如圖像的繪制、交互的處理、定時器等。

1、圖形繪制

圖形繪制是一切的基礎,這里使用 JavaScriptcanvas 上進行繪制。即先在 html 中創建 canvas 元素,然后在 JavaScript 中,通過 id 拿到這個元素,并且通過 canvas 拿到對應的上下文環境 context ,為后續的繪圖做好準備。

<canvas id="background" width="450px" height="450px"></canvas>
var background = document.getElementById("background");
var context = background.getContext('2d');

通過 contextdrawImage 方法可以繪制圖片,這里進行了相應的封裝:

注:這里要等圖片加載完畢后再進行繪制,即在 onload 中去調用 drawImage 方法,否則會繪制失敗。

var drawImageItem = function(index, position) {
    var img = new Image();
    img.src = './image/dog_0' + String(index+1) + '.jpg';
    img.onload = () => {
        var rect = rectForPosition(position);
        context.drawImage(img, rect[0], rect[1], rect[2], rect[3]);
    }
}

在繪制圖片之后,我們還需要去動態刷新視圖,否則 canvas 就只是一張靜態的圖片。如果是簡單的圖形刷新,只需在原來的位置重新繪制,進行覆蓋即可。但有時候我們只需要將原來已存在的圖形清除掉,而不需要繪制新圖案。比如在拼圖游戲中,將一個方塊移動到另一個位置后,需要清空原來的位置。

通過 contextclearRect 方法可以達到清除的目的。以下是清除 canvas 的某個區域的代碼:

var originRect = rectForPosition(origin);
context.clearRect(originRect[0], originRect[1], originRect[2], originRect[3]);

2、事件處理

有了圖形的繪制后,我們還需要處理玩家的輸入事件,然后根據輸入事件,來決定什么時候刷新視圖。輸入事件可以分為 3 種:在手機上有觸屏事件;在 PC 上,有鼠標和鍵盤事件。

JavaScript 中對觸屏和鼠標點擊的監聽是一樣的,都是通過 canvasonclick 事件進行回調,具體如下:

// 屏幕點擊
background.onclick = function(e) {
};

我們可以通過 e.offsetXe.offsetY 來獲取觸控點在 canvas 中的位置。

注: canvas 的坐標原點在左上角,即左上角的坐標是 (0, 0)

鍵盤的按鍵點擊則是通過 documentonkeyuponkeydown 等事件進行回調。 onkeyup 是指按鍵的抬起事件, onkeydown 是指按鍵的按下事件。我們可以通過 keyCode 知道當前具體是哪一個按鍵,然后根據不同的按鍵去處理不同的邏輯,如下:

if (event.keyCode == '37') {  // 左
    // do something
} else if (event.keyCode == '38') { // 上
    // do something
} else if (event.keyCode == '39') { // 右
    // do something
} else if (event.keyCode == '40') { // 下
    // do something
}

3、定時器

有時候,除了在玩家輸入的時候需要去刷新視圖,還需要每隔一段時間定時去刷新視圖。比如在一個貪吃蛇游戲中,就需要每隔一段時間就去刷新蛇的位置。

這個時候我們就需要一個定時器,讓它每隔一段時間去執行一段刷新視圖的代碼。我們通過 setInterval 方法來實現定時器功能:

setInterval("run()", 100);

上面這段代碼表示每隔 100 毫秒,去執行一次 run 方法。

二、拼圖的基礎邏輯

有了游戲的基礎邏輯,下面來看一下如何實現拼圖的邏輯。

1、生成隨機序列

因為不是任意序列都可以通過平移的方式來還原,所以我們不能簡單地生成一個隨機序列。比如 1、0、2、3、4、5、6、7、8 這個序列,無論怎么平移,都不可能還原。

這里采取的做法是:預先設置了 4 個可還原的序列,先從這 4 個序列中隨機選取一個,然后再對序列進行模擬平移若干步驟。以此來盡可能地保證初始序列的多樣性,也保證了序列的可還原性。具體代碼如下:

var setupRandomPosition = function() {
    var list1 = [4, 3, 2, 8, 0, 7, 5, 6, 1];
    var list2 = [2, 0, 5, 6, 8, 7, 3, 1, 4];
    var list3 = [3, 7, 2, 4, 1, 6, 8, 0, 5];
    var list4 = [3, 2, 4, 1, 7, 6, 5, 0, 8];
    var lists = [list1, list2, list3, list4];

    imageIndexForPosition = lists[parseInt(Math.random() * 4)];

    // 獲取空位位置
    var emptyPosition = 0;
    for (var i = imageIndexForPosition.length - 1; i >= 0; i--) {
        if (imageIndexForPosition[i] == lastIndex()) {
            emptyPosition = i;
            break;
        }
    }
    background.emptyPosition = emptyPosition;

    // 隨機移動次數
    var times = 10;
    while (times--) {
        // 獲取隨機數,決定空位哪個位置進行移動
        var direction = parseInt(Math.random() * 4);

        var target = -1;
        if (direction == 0) {
            target = topOfPosition(emptyPosition);  // 上
        } else if (direction == 1) {
            target = leftOfPosition(emptyPosition);  // 左 
        } else if (direction == 2) {
            target = rightOfPosition(emptyPosition);  // 右
        } else if (direction == 3) {
            target = bottomOfPosition(emptyPosition);  // 下
        }
        if (target < 0 || target > lastIndex()) {  // 位置不合法,繼續下一次循環
            continue;
        }
        var result = moveImageIfCanAtPosition(target);
        if (result >= 0) { // 如果移動成功,更新空位的位置
            emptyPosition = target;
        }
    }
}

2、判斷是否可以移動方塊

在保存順序的時候,是用 0~8 這 9 個數字來保存,而空白的方塊是數字 8 的位置。所以判斷可以移動的唯一條件是,目標位置的值是否為 8。代碼如下:

var isPositionEmpty = function(position) {
    if (position < 0 || position > lastIndex()) {
        return false;
    } 
    if (imageIndexForPosition[position] == lastIndex()) {
        return true;
    } else {
        return false;
    }
}

上面 lastIndex() 的值為 8。

3、實現方塊移動

方塊移動的實現很簡單,先將舊位置的圖形清除,然后在新的位置繪制。

var refreshImagePositions = function(origin, target) {
    var originRect = rectForPosition(origin);
    context.clearRect(originRect[0], originRect[1], originRect[2], originRect[3]);
    drawImageItem(imageIndexForPosition[target], target);
}

4、檢查是否完成

檢查圖案是否已經還原,只需要對數組進行一次遍歷,看是否有序即可。

var checkIfFinish = function() {
    for (var index = 0; index < imageIndexForPosition.length; index++) {
        if (index != imageIndexForPosition[index]) {
            return false;
        }
    }
    return true;
}

5、交互事件屏蔽

當圖案還原之后,我們不希望玩家還能通過鍵盤或鼠標來移動方塊,這個時候就需要對交互事件進行屏蔽。

只需要一個標志位就可以達到這個目的:

// 屏幕點擊
background.onclick = function(e) {
    if (isFinish) {
        return;
    }

    // do something
};

// 鍵盤按鈕事件
document.onkeyup = function(event) {
    if (isFinish) {
        return;
    }

    // do something
}

當圖案還原之后,標志位 isFinish 會被置為 true ,然后在屏幕點擊和鍵盤按鈕響應事件的開始處添加判斷,如果已經結束,則不繼續走方塊移動的邏輯。

以上就是如何利用原生的JavaScript來實現一個簡單的拼圖小游戲的詳細內容,更多請關注php中文網其它相關文章!


網站建設是一個廣義的術語,涵蓋了許多不同的技能和學科中所使用的生產和維護的網站。

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • 777久久久精品一区二区三区| 青青草原国产免费| 91在线第一页| 九色在线视频观看| 中文字幕乱码免费| 欧美伦理片在线看| 日韩中文字幕在线免费| 久久黄色片网站| 成人免费无码av| 日韩黄色短视频| 网站在线你懂的| 亚洲男人天堂2021| 黄页网站在线观看视频| 男人的天堂avav| 妺妺窝人体色www看人体| 午夜视频在线网站| 一本久道高清无码视频| 97在线免费视频观看| 亚洲日本黄色片| 美女一区二区三区视频| 已婚少妇美妙人妻系列| 欧美精品99久久| 麻豆传媒网站在线观看| 欧美丝袜在线观看| www.cao超碰| 国产又爽又黄ai换脸| 亚洲国产成人va在线观看麻豆| 日本男人操女人| 欧美视频免费播放| 老熟妇仑乱视频一区二区| 日本一本二本在线观看| 国产亚洲天堂网| 成熟了的熟妇毛茸茸| 99热在线这里只有精品| 日本免费黄视频| 2018中文字幕第一页| 国产乱淫av片杨贵妃| 成人黄色av片| 国产精品动漫网站| 亚洲美女爱爱视频| mm131午夜| 男人插女人视频在线观看| av免费观看大全| 国产成人无码一二三区视频| 成人黄色一区二区| 亚洲一级片免费观看| 男女啪啪的视频| 欧美一级视频免费看| 看欧美ab黄色大片视频免费 | 少妇高潮流白浆| 一区二区传媒有限公司| 九九热免费在线观看| 福利视频一二区| 亚洲综合在线一区二区| 久久国产成人精品国产成人亚洲| aaaaaaaa毛片| 精品999在线| 国产最新免费视频| 男人天堂新网址| 午夜影院免费版| 欧美女同在线观看| 激情婷婷综合网| 北条麻妃69av| 日韩一级性生活片| 日本精品免费视频| 偷拍盗摄高潮叫床对白清晰| 欧美日韩亚洲一二三| 国模无码视频一区二区三区| 黄色高清视频网站| 99久久久无码国产精品性色戒| 国产九九热视频| 午夜精品久久久久久久99热影院| www.中文字幕在线| 亚洲中文字幕无码专区| 黄色片网址在线观看| 精品欧美一区免费观看α√| 日本黄色片一级片| 97在线国产视频| 免费网站在线观看视频| 4444在线观看| 水蜜桃色314在线观看| 欧洲精品在线播放| 5月婷婷6月丁香| 亚洲国产精品久久久久爰色欲| 日本精品一区在线观看| 国产视频一区二区视频| 手机av在线网| 美女在线免费视频| 男人的天堂狠狠干| 亚洲精品中文字幕无码蜜桃| 日韩肉感妇bbwbbwbbw| 亚洲免费成人在线视频| 免费的一级黄色片| 欧洲黄色一级视频| 亚洲第一区第二区第三区| 99亚洲国产精品| 国产最新免费视频| 成人日韩在线视频| 免费看毛片的网址| 成人精品视频一区二区| 91看片破解版| 久无码久无码av无码| www.色偷偷.com| av影院在线播放| 欧美午夜性生活| 三级网在线观看| 日韩毛片在线免费看| 男人午夜视频在线观看| 亚洲美免无码中文字幕在线| 天天综合网久久| 黄色大片在线免费看| 国产欧美激情视频| 日韩av三级在线| 最近免费观看高清韩国日本大全| 奇米精品一区二区三区| 日本三级福利片| 成年人在线观看视频免费| 国产成人生活片| 国产精品嫩草影院8vv8| xxxx18hd亚洲hd捆绑| 熟女视频一区二区三区| 久久午夜夜伦鲁鲁一区二区| 妞干网在线视频观看| 韩国黄色一级大片| 污污视频网站在线| 欧美日韩黄色一级片| 在线观看污视频| 国产精品999.| 中文字幕在线综合| 成人亚洲精品777777大片| 男人添女人下面高潮视频| 国产免费内射又粗又爽密桃视频| 一区二区三区四区毛片| 麻豆一区二区三区视频| 苍井空浴缸大战猛男120分钟| 成人精品视频在线播放| 日本精品福利视频| 日本三日本三级少妇三级66| 免费成人黄色大片| 香蕉视频xxxx| 1314成人网| 日本成人在线不卡| 国产a级黄色大片| 成人网站免费观看入口| 女人被男人躁得好爽免费视频| 超碰超碰超碰超碰超碰| 免费看日b视频| 全黄性性激高免费视频| 性欧美大战久久久久久久| 青青青国产在线观看| 国产综合免费视频| 国产一区二区在线免费播放| 色片在线免费观看| 亚洲第一页在线视频| 日本黄网站色大片免费观看| 超碰人人爱人人| 国产午夜伦鲁鲁| 日本爱爱免费视频| 日韩 欧美 自拍| 国产手机免费视频| 噼里啪啦国语在线观看免费版高清版| 老熟妇仑乱视频一区二区 | 久久久久福利视频| 97视频久久久| 另类小说第一页| 天堂网成人在线| 免费毛片网站在线观看| 九热视频在线观看| 91九色国产ts另类人妖| 久久久精品在线视频| 亚洲怡红院在线| 欧美国产激情视频| 久久精品久久99| 日韩在线视频在线观看| 爱爱爱爱免费视频| aa在线观看视频| 日本国产一级片| 1024精品视频| www国产无套内射com| 日韩欧美国产片| 激情综合在线观看| 一二三四中文字幕| 欧美又黄又嫩大片a级| a√天堂在线观看| 精品视频在线观看一区二区| 一区二区三区国产免费| 精品成在人线av无码免费看| 国产永久免费网站| 91蝌蚪视频在线观看| 国产精品国产亚洲精品看不卡| 日韩av加勒比| 亚洲最大天堂网| 亚洲黄色小视频在线观看| 男人日女人逼逼| 日韩中字在线观看| 91网站在线观看免费| 一级黄色片在线免费观看| 岳毛多又紧做起爽| 欧美 日韩 激情| 日本欧美黄色片|