js實(shí)現(xiàn)翻牌小游戲
本文實(shí)例為大家分享了js實(shí)現(xiàn)翻牌小游戲的具體代碼,供大家參考,具體內(nèi)容如下
效果圖

需求分析
1、生成兩組順序隨機(jī)的1-8數(shù)據(jù)
2、卡片需要有翻轉(zhuǎn)效果
3、兩次翻轉(zhuǎn)數(shù)據(jù)不相等,回復(fù)原狀
4、兩次翻轉(zhuǎn)數(shù)據(jù)相等,卡片相等,不能再被點(diǎn)擊
5、當(dāng)所有卡片不能被點(diǎn)擊游戲結(jié)束
6、限制最大點(diǎn)擊次數(shù)50次
HTML結(jié)構(gòu)
<div class="wrap"> <div> <p class="top"></p> <p class="bottom"></p> </div> <div> <p class="top"></p> <p class="bottom"></p> </div> <div> <p class="top"></p> <p class="bottom"></p> </div> <div> <p class="top"></p> <p class="bottom"></p> </div> <div> <p class="top"></p> <p class="bottom"></p> </div> <div> <p class="top"></p> <p class="bottom"></p> </div> <div> <p class="top"></p> <p class="bottom"></p> </div> <div> <p class="top"></p> <p class="bottom"></p> </div> <div> <p class="top"></p> <p class="bottom"></p> </div> <div> <p class="top"></p> <p class="bottom"></p> </div> <div> <p class="top"></p> <p class="bottom"></p> </div> <div> <p class="top"></p> <p class="bottom"></p> </div> <div> <p class="top"></p> <p class="bottom"></p> </div> <div> <p class="top"></p> <p class="bottom"></p> </div> <div> <p class="top"></p> <p class="bottom"></p> </div> <div> <p class="top"></p> <p class="bottom"></p> </div> </div>
css布局
實(shí)現(xiàn)卡片翻轉(zhuǎn)效果需要3個關(guān)鍵屬性
1.perspective: 1000px; 透視深度,形成3d視角
2.transform: rotateY(180deg);旋轉(zhuǎn)
3.backface-visibility: hidden; 元素背面不可見
* {
margin: 0;
padding: 0;
}
body,
html {
height: 100%;
}
.wrap {
perspective: 1000px;
width: 320px;
height: 320px;
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
margin: auto;
display: flex;
justify-content: center;
text-align: center;
flex-wrap: wrap;
}
.wrap div {
/* box-shadow: 5px 5px 10px #000; */
transition: 1s;
position: relative;
text-align: center;
line-height: 60px;
height: 60px;
width: 60px;
border-radius: 10px;
margin: 10px 10px;
}
.wrap div .active1 {
transform: rotateY(180deg);
}
.wrap div .active2 {
transform: rotateY(360deg);
}
.wrap p {
border-radius: 10px;
background-color: blueviolet;
transition: 1s;
backface-visibility: hidden;
display: block;
height: 60px;
width: 60px;
position: absolute;
/* transform: rotateY(180deg); */
}
.wrap .bottom {
transform: rotateY(180deg);
}
h3{
text-align: center;
width: 200px;
height: 30px;
margin: 150px auto;
}
js
class Game {
constructor(selector) {
this.init(selector);
}
init(selector) {
let arr = this.randomArr();
this.nodes = [...document.querySelectorAll(selector)];//獲取每一個卡片
this.step = 50;//定義可以被點(diǎn)擊的次數(shù)
this.tit = document.querySelector("h3");
this.nodes.forEach((item,index) => {//初始化卡片的值,并保存在num屬性中
item.children[1].innerHTML = arr[index];
item.num = arr[index];
var that = this
item.onclick = function () {//給每一個卡片綁定事件
that.handle(this);
}
})
}
handle(ele) {
if(this.step === 0){
alert('游戲結(jié)束')
return
}
if(ele.active !== true){
this.step--;
this.tit.innerText = `剩余步數(shù):${this.step}`
}
ele.children[0].classList.add('active1');//卡片翻轉(zhuǎn)
ele.children[1].classList.add('active2');
let res = this.nodes.filter(item => item.children[0].classList.contains('active1')&& item.active !== true); //獲取翻過來的且沒有配對成功的卡片
if(res.length === 2 && res[0].num !== res[1].num){//如果有兩張并且數(shù)值不相等,恢復(fù)原狀
setTimeout(()=>{
res[0].children[0].classList.remove('active1');
res[0].children[1].classList.remove('active2');
res[1].children[0].classList.remove('active1');
res[1].children[1].classList.remove('active2');
},1000)//延遲一秒形成動畫
}else if(res.length === 2 && res[0].num === res[1].num){//如果數(shù)值相等則配對成功
res[0].active = true;//鎖定卡片
res[1].active = true;
}
}
randomArr() {
let arr = [];
for (let i = 0, n = 8; i < n; i++) {
do {
var item = randomInt(1, 8);
} while (arr.indexOf(item) !== -1)
arr.push(item);
}
arr.push(...arr);
return arr;
}
}
new Game('.wrap div')
function randomInt(min, max) {//產(chǎn)生[min,max]范圍內(nèi)的整數(shù)
return Math.round(Math.random() * (max - min)) + min
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
微信小程序?qū)崿F(xiàn)獲取手機(jī)號60s倒計(jì)時
這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)獲取手機(jī)號60s倒計(jì)時,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-07-07
JavaScript自定義Webpack配置實(shí)現(xiàn)流程介紹
本系列主要整理前端面試中需要掌握的知識點(diǎn)。本節(jié)介紹webpack如何優(yōu)化前端性能,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-10-10
使用3D引擎threeJS實(shí)現(xiàn)星空粒子移動效果
這篇文章主要為大家詳細(xì)介紹了使用3D引擎threeJS實(shí)現(xiàn)星空粒子移動效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-11-11
JavaScript中使用Async實(shí)現(xiàn)異步控制
async提供了很多函數(shù)用于異步流程控制,下面是async核心的幾個函數(shù),大家通過本文學(xué)習(xí)下,對使用async 實(shí)現(xiàn)異步控制相關(guān)知識,感興趣的朋友一起看看吧2017-08-08
JS移動端/H5同時選擇多張圖片上傳并使用canvas壓縮圖片
這篇文章主要介紹了JS移動端/H5同時選擇多張圖片上傳并使用canvas壓縮圖片,需要的朋友可以參考下2017-06-06

