基于JS實現(xiàn)接粽子小游戲的示例代碼
端午節(jié)馬上就到了,聽說你們公司沒發(fā)粽子大禮包?沒關(guān)系,這里用 JS 實現(xiàn)了一個簡單的接粽子小游戲,能接到多少粽子,完全看你手速,不用擔(dān)心端午沒粽子了。
游戲設(shè)計
在游戲屏幕內(nèi),會隨機的從頂部掉落粽子,通過鼠標(biāo)移動到粽子上并點擊,成功接住粽子,得到積分。在設(shè)置面板中,可以設(shè)置游戲難度,分為簡單、很難、超級難三種等級,不同等級的積分也是不同的,玩家可根據(jù)自己的手速進行設(shè)置。游戲結(jié)束后,可看到自己的成績。實現(xiàn)出來的效果如下(可運行代碼已發(fā)到碼上掘金,鏈接在文章底部,可進入玩一玩):

游戲?qū)崿F(xiàn)
添加粽子元素
在游戲屏幕內(nèi),需要源源不斷的添加我們的主角--粽子大哥,可以讓玩家點擊,并且可以移除掉被點擊的粽子元素。
<div id="app"> <div class="main"></div> </div>
把 div.mian 來作為游戲主區(qū)域,粽子元素添加到該區(qū)域中。使用 document.createElement 來創(chuàng)建一個 img 元素,并設(shè)置圖片地址,樣式類,以及該粽子的初始位置。這里用 Math.random() 來給粽子一個隨機的初始 left 值。監(jiān)聽粽子元素的點擊事件,當(dāng)被點擊時則移除該元素,表示粽子已被玩家接住了。
let main = document.querySelector('.main');
function addElement(){
let elem = document.createElement('img');
elem.src = 'zongzi.png';
elem.classList.add('zongzi');
elem.style.left = Math.random()*730 + 'px';
main.appendChild(elem);
elem.addEventListener('click', function(){
main.removeChild(elem)
})
}.zongzi{
position: absolute;
top: -70px;
width: 70px;
height: 70px;
background-color: #ff9900;
border-radius: 50%;
}該樣式給粽子設(shè)置了寬高,當(dāng)我們設(shè)置游戲難度時,我們可以動態(tài)改變粽子的寬高,粽子越大,越容易被點擊到,所以難度越高時,可以調(diào)小粽子的寬高,需要更厲害的手速才有可能點擊到。
粽子掉落
掉落動畫沒加什么動效,所以比較簡單,用 animation 實現(xiàn)一個元素從上到下的直線移動過渡效果。
.main{
position: relative;
width: 800px;
height: 500px;
background-color: #2b4650;
overflow: hidden;
}
.zongzi{
... ...
animation: move 3s ease-in;
}
@keyframes move {
to{
transform: translateY(570px);
}
}translateY(570px) 縱向位移 570,是為了保證沒被點擊到的粽子完全離開了游戲主區(qū)域才算消失。
難度選擇
使用 input[type=radio] 元素供玩家選擇難度。平時用慣了組件,對于原生的 radio 選擇實現(xiàn),你還記得多少?跟著一起復(fù)習(xí)一遍吧
<div class="difficulty"> <span>難度:</span> <input type="radio" name="difficulty" value="1" checked>簡單 <input type="radio" name="difficulty" value="2">很難 <input type="radio" name="difficulty" value="3">超級難 </div>
let difficulty = 1; // 用來表示當(dāng)前難度等級
let radios = document.querySelectorAll('input[type=radio]');
radios.forEach(radio => {
radio.addEventListener('change', function(){
difficulty = radio.value;
})
})監(jiān)聽 radio 元素的 change 事件,而不是 click 事件,因為 click 重復(fù)點擊時還會繼續(xù)觸發(fā),不是我們需要的。只有在難度等級發(fā)生變化時才需要觸發(fā)。
當(dāng)難度變化時,主要是改變粽子的大小和下落速度來實現(xiàn)玩家更難接住粽子,根據(jù) difficulty 值來設(shè)置粽子元素的樣式類。
let elem = document.createElement('img');
elem.src = 'zongzi.png';
elem.classList.add('zongzi' + difficulty);.zongzi1{
... ...
width: 70px;
height: 70px;
animation: move 3s ease-in;
}
.zongzi2{
... ...
width: 50px;
height: 50px;
animation: move 2s ease-in;
}
.zongzi3{
... ...
width: 40px;
height: 40px;
animation: move 1s ease-in;
}開始游戲
游戲開始時,進入倒計時,粽子開始掉落,并計算玩家得分。
<div id="app"> <div class="main"> <div class="time"> 倒計時:<span>30</span>s </div> </div> <div class="setting"> <div class="difficulty mgb10"> ... ... </div> <div class="btn">開始游戲</div> <div class="result">總分:<span>0</span></div> </div> </div>
let result = 0;
let btn = document.querySelector('.btn');
let time = document.querySelector('.time span');
let isStart = false;
btn.addEventListener('click', function(){
if(!isStart){
isStart = true;
result = 0;
let elemId = setInterval(function(){
addElement();
}, 500)
let timeNumber = 30;
let numberId = setInterval(function(){
timeNumber -= 1;
time.innerHTML = timeNumber;
if(timeNumber <= 0){
clearInterval(numberId);
clearInterval(elemId);
isStart = false;
alert('游戲結(jié)束');
}
}, 1000)
}
})總結(jié)
整體實現(xiàn)還是比較簡單的,不過也還是存在很多可以優(yōu)化的地方。像點擊粽子后,可以有一些接住的效果后再消失,粽子的掉落路徑,可以多一些花樣等,可以給游戲增加一些樂趣。
到此這篇關(guān)于基于JS實現(xiàn)接粽子小游戲的示例代碼的文章就介紹到這了,更多相關(guān)JS接粽子游戲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JS實現(xiàn)將Asp.Net的DateTime Json類型轉(zhuǎn)換為標(biāo)準(zhǔn)時間的方法
這篇文章主要介紹了JS實現(xiàn)將Asp.Net的DateTime Json類型轉(zhuǎn)換為標(biāo)準(zhǔn)時間的方法,涉及javascript針對時間與日期操作的相關(guān)技巧,需要的朋友可以參考下2016-08-08
JS實現(xiàn)帶關(guān)閉功能的阿里媽媽網(wǎng)站頂部滑出banner工具條代碼
這篇文章主要介紹了JS實現(xiàn)帶關(guān)閉功能的阿里媽媽網(wǎng)站頂部滑出banner工具條代碼,可實現(xiàn)頂部banner窗口的浮動顯示及關(guān)閉隱藏功能,具有一定參考借鑒價值,需要的朋友可以參考下2015-09-09
js判斷數(shù)組中是否包含某個值的4種方法總結(jié)
這篇文章主要給大家總結(jié)介紹了關(guān)于js判斷數(shù)組中是否包含某個值的4種方法,數(shù)組是我們編程中經(jīng)常使用的的數(shù)據(jù)結(jié)構(gòu)之一,在處理數(shù)組時我們經(jīng)常需要在數(shù)組中查找特定的值,JavaScript 包含一些內(nèi)置方法來檢查數(shù)組是否有特定的值或?qū)ο?需要的朋友可以參考下2023-11-11
js完美解決IE6不支持position:fixed的bug
關(guān)于IE6,雖然它已被微軟拋棄很久了,但是由于大天朝的特殊行情(盜版)對于前端工程師來說,解決IE6兼容position:fixed的問題顯得很重要。特別是你需要用到頭尾懸停調(diào)用的時候2015-04-04
uniapp中使用vuex的過程(解決uniapp無法在data和template中獲取vuex數(shù)據(jù)問題)
這篇文章主要介紹了uniapp中使用vuex(解決uniapp無法在data和template中獲取vuex數(shù)據(jù)問題),本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-05-05
阿里巴巴技術(shù)文章分享 Javascript繼承機制的實現(xiàn)
這篇文章主要介紹了阿里巴巴技術(shù)文章,分享的是一篇關(guān)于Javascript實現(xiàn)繼承機制的文章,感興趣的小伙伴們可以參考一下2016-01-01

