麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > JavaScript > 正文

javascript實現數字配對游戲的實例講解

2019-11-19 14:44:05
字體:
來源:轉載
供稿:網友

游戲效果如下圖所示:

配對游戲

規則:

在4X5的格子中,有隨機的互不相等的10個數,每個數據有兩份(也就是20個數,有兩兩相等的十對),隨機分布在20個格子中。游戲開始,彈出二十個數的序列。每次點擊格子會顯示當前格子中的數據并暫時保留顯示,直到下一次點擊,如果下一次點擊顯示的數據與保留的數據不同,則之前點擊保留的數據會消失(仍然存在于該格子但不顯示)。如果連續點擊顯示的兩個數據一樣,則兩個數據都會顯示并且不會再消失。

直到所有數據都通過連續點擊相同數據的方式顯示出來,就算游戲結束,報出游戲用時。此時可以點擊開始游戲或刷新來繼續。

分析:

1:二十個格子對應二十個數據,產生兩組相等的十個隨機數并放入數組,數組下標決定顯示位置。

2:每個格子的狀態的三種:數據隱藏,暫時保留數據和永久顯示。數據隱藏的格子通過點擊的下一次狀態是暫時保留。暫時保留數據的格子通過點擊下一次狀態是永久顯示或數據隱藏,這里要根據連續兩次獲取的數據是否相等來判斷。永久顯示之后狀態已經不可變,只能永久顯示出來,此時對點擊是無效的。

3 :計時從點擊開始按鈕之后,點擊第一個格子時開始。直到游戲完成或點擊刷新重開,期間計時器不能停止。

4 :得出,這里需要一個布爾值,記錄游戲是否已經開始,已經開始的游戲對開始按鈕應該拒絕,計時器運行直到游戲完成。游戲完成時,改變布爾值,計時器停止工作,顯示游戲用時,開始按鈕可用。

實現:

表格通過script創建,其中的元素先默認顯示為“”空字符串。通過對應的點擊來顯示。CSS樣式可自行設定。

<table border:1>  <script>   var rowlength = 4;   var collength = 5;   var str = '';   for (var i = 0; i < rowlength; i++) {    str += '<tr>'    for (var j = 0; j < collength; j++) {     //這里將每個td的id拼接為imgxx xx為元素索引     var index = i * collength + j;     var id = "img" + index;     //注意這里字符串 每個''是一個字符串進行輸出      str += '<td id="' + id + '" onclick="showImg(' + index + ')">';     str += '</td>';    }    str += '</tr>'   }   document.write(str);  </script> </table>

NEW_START記錄是否可以開始游戲的變量

times記錄已用時間

trans記錄每個格子的翻轉狀態 ,數組每個格子有三種狀態 0:隱藏-1:顯示(仍可翻轉)-2:顯示(不可翻轉)。也就是數組的每個元素只有三個可能的值0,1,2)

numArr三十個數的隨機序列數組

var NEW_START = true;  var times = 0;  var trans = [];  var numArr = [];

通過ID獲取到元素的方法:

 function $(id) {  return document.getElementById(id);   }

下面通過函數獲取到二十個隨機數,兩兩相等的十組(可參見:生成指定范圍隨機數)

function getNum() {    var index = 0;    var arrLength = rowlength * collength / 2;    var arr = new Array();    while (index < arrLength) {     var flag = true;     var num = parseInt(Math.random() * 100);     for (var i in arr) {      if (arr[i] == num || arr[i] < 1) {       flag = false;      }     }     if (flag == true) {      arr[index] = num;      index++;     }    }    //alert(arr.length);    //arr是十個互不相等的隨機數     // newArr數組就是每個隨機數都有兩個的數組    var newArr = new Array();    for (var i = 0; i < arrLength; i++) {     newArr[i] = arr[i];     newArr[arrLength + i] = arr[i];    }    return newArr;   }

創建表格,生成隨機數數組這些都是準備工作。

下面是具體的邏輯:

開始游戲的點擊函數

<input type="button" id="startButton" value="開始游戲" onclick="init()">

點擊開始游戲,需要初始化游戲相關的參數,注意如果已經開始,就需要拒絕處理。將數組元素用排序函數打亂做到隨機性。

function init() {    //如果已經開始 拒絕點擊    if (NEW_START == false) {     return;    }    //結束時用于顯示時間的h4標簽    $('end').innerHTML = '';    var count = rowlength * collength;    //將每個格子的數據隱藏 初始化每個格子的翻轉狀態    for (var i = 0; i < count; i++) {     $('img' + i).innerHTML = '';     trans[i] = 0;    }    //將游戲用時置為0    times = 0;    $('gametime').innerHTML = times + '秒';    //獲取隨機的三十個數的隨機序列數組 注意排序函數的使用    numArr = getNum().sort(function () {     return Math.random() - 0.5;    });    alert("已生成隨機數,按表格順序排列:" + numArr);   }

計時函數

在點擊第一個格子時,就需要開始計時。NEW_START=false表示已經開始,需要確保只在游戲進行中時才計時。每秒調用自身一次,并通過innerHTML把所用時間實時顯示出來。

用時:<span id="gametime">0秒</span> function countTime() {    if (NEW_START == false) {     setTimeout('countTime()', 1000);     $('gametime').innerHTML = times + "秒";     times++;    }   }

每個格子的點擊函數(超重點)

在未開始時拒絕點擊格子的(沒有效果)。進入游戲點擊第一個格子,游戲開始,狀態改變,NEW_START=false表示已經開始不可創建新游戲。計時開始。

后面的點擊事件就需要判斷點擊的格子來處理不同的邏輯:

點擊已永久顯示的元素,不處理return。

點擊剛顯示但不是永久顯示的元素,也不處理return。

(注意這里判斷是不是同一元素是直接通過狀態值在trans中將索引index查找出來后對比)

點擊未顯示元素,獲取值,與前一個顯示的元素對比:

相等,都將trans中對應索引的狀態值改為2,表示永久顯示

不等,新點擊元素在trans中對應索引狀態值改為1(暫時保留),前一個點擊的元素索引值為0(需要隱藏)。

設置完狀態值,就立馬需要更新顯示(refreshUI函數)。更新顯示時根據記錄狀態值的數組trans來操作的。

function showImg(index) {    //未點擊開始,還未初始化,退出    if (numArr[0] == undefined) {     return;    }    //初次點擊進入,開啟計時    if (NEW_START) {     NEW_START = false;     countTime();    }    //1-點擊已經徹底顯示的元素 退出    if (trans[index] == 2) {     return;    }    //將點擊的格子的元素顯示出來,并改變翻轉狀態    //alert(index);    //alert(numArr)    var clickEle = $('img' + index);    clickEle.innerHTML = numArr[index];    //已點擊元素的index    var transIndex;    for (var i in trans) {     if (trans[i] == 1) {      transIndex = i;     }    }    //2-如果點擊的是剛剛已顯示元素    if (transIndex == index) {     trans[index] = 1;     return;    }    //3-點擊新元素 與先前顯示元素對比 兩種情況-相等 不等    else {     if (numArr[transIndex] == numArr[index]) {      trans[transIndex] = 2;      trans[index] = 2;     } else {      trans[transIndex] = 0;      trans[index] = 1;     }    }    refreshUI();   }

根據狀態值設置顯示的函數refreshUI

根據trans中每個元素的值,改變對應索引的格子的值。注意,如果格子的數據永久顯示,需要記錄已經永久顯示的格子的數量,當等于所有格子數量時,表示已經全部顯示。需要判定游戲結束,顯示出游戲用時。

function refreshUI() {    //此處用fore循環會最后存在一個undefined    //count記錄已經被徹底顯示的個數    var count = 0;    for (var i = 0; i < trans.length; i++) {     if (trans[i] == 0) {      $('img' + i).innerHTML = '';     }     if (trans[i] == 1) {      $('img' + i).innerHTML = numArr[i];     }     if (trans[i] == 2) {      $('img' + i).innerHTML = numArr[i]      count++;     }    }    if (count == collength * rowlength) {     NEW_START = true;     var endTime = times;     $('end').innerHTML = '用時' + endTime + '秒??!游戲結束,點擊開始游戲繼續';     $('gametime').innerHTML = endTime + "秒";    }   }

通過數組和表格的配合,實現配對游戲,加深對表格創建和數組的運用。處理邏輯和數據顯示分離,根據狀態值做到不同顯示的狀態。

以上這篇javascript實現數字配對游戲的實例講解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 欧美毛片免费观看 | 亚州综合一区 | 毛片视频网站在线观看 | 成人做爰高潮片免费视频韩国 | 日韩电影av在线 | 午夜视频在线 | 91精品国产92久久久久 | 九九热在线精品视频 | 午夜视频在线观看免费视频 | 国产一区二区三区视频观看 | 国产高潮国产高潮久久久91 | 成年毛片 | arabxxxxvideos| 欧美一级特黄a | 日本人乱人乱亲乱色视频观看 | 黄污在线观看 | 精品国产亚洲人成在线 | 国产女厕一区二区三区在线视 | 国产午夜精品一区二区三区四区 | 精品国产一区二区三区成人影院 | 色播av在线 | 成人午夜网址 | 日韩色电影 | 99精品在线免费 | 最新影院| 成人午夜小视频 | 在线播放视频一区二区 | 日韩视频高清 | 久久久精品视 | 猫咪av在线 | 欧美在线成人影院 | 久久69精品久久久久久国产越南 | 日韩av电影在线免费观看 | 亚洲综合视频在线播放 | 欧美日本国产精品 | 国产资源在线视频 | 今井夏帆av一区二区 | 一级电影在线观看 | 在线观看免费毛片视频 | 午夜视频在线观看免费视频 | 久久久青青草 |