使用jquery實現(xiàn)別踩白塊小游戲的方法實例
前言
掘金真的是太懂了,寫游戲的活動,想不參加都難!第一個,別踩白塊!
先來看效果~

如上圖所示,jkl三個鍵對應(yīng)三列,左上是得分,得分右邊是時間(沒做倒計時。。。)敲擊對應(yīng)的按鍵來進行游戲,如果敲錯了就會彈出得分與所用時間
接下來就開始肢解這個小游戲,來一步一步的分析究竟是怎么實現(xiàn)的,let's go~
html
<body>
<div class="main">
<div id="score">0</div>
<div id="time">00:00:00</div>
</div>
<div class="caption">別踩白塊!</div>
<div class="container">
<table id="tab">
<tr>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
</tr>
</table>
<span class="font one">J</span>
<span class="font two">K</span>
<span class="font three">L</span>
</div>
</body>其他地方就是普通的div,中間的主體部分是用表格實現(xiàn)的,jkl置于表格的上方顯示
首頁字體

width: 300px; font-size: 60px; font-weight: bold; text-align: center; position: relative; margin: 0 auto; -webkit-text-fill-color: transparent; /*文字的填充色*/ -webkit-text-stroke: 1.2px white;
重點的兩個屬性:最后兩個屬性-webkit-text-fill-color和-webkit-text-stroke,第一個是文字的填充顏色,第二個是文字的邊框顏色,最終形成這種效果
中間的表格

主體用的是table做的,四行三列,每一行都有一個黑塊在隨機的一列生成
Math.ceil(Math.random() * 3) - 1
Math.random()會取0-1的隨機小數(shù),乘3是為了獲取1-3內(nèi)的隨機小數(shù),Math.ceil()向上取整,在減1,最后可以拿到三個可能的結(jié)果:0 1 2
實現(xiàn)每一行的黑塊隨機顯示
新建dom元素hang
var Game={
...
hang: document.getElementsByTagName('tr');
...
}為每一行的隨機列添加黑塊
//獲取列--------------------------------------------- Game.hang[0].children[Math.ceil(Math.random() * 3) - 1].style.background = 'black'; Game.hang[1].children[Math.ceil(Math.random() * 3) - 1].style.background = 'black'; Game.hang[2].children[Math.ceil(Math.random() * 3) - 1].style.background = 'black'; Game.hang[3].children[Math.ceil(Math.random() * 3) - 1].style.background = 'black';
按鍵事件
鍵盤按下事件調(diào)用了兩個方法,一個是主方法key事件,另外一個是負(fù)責(zé)顯示jkl的color事件
key事件
key: function () {
onkeydown = function (event) {
if (Game.bool == true && (event.key == 'j' || event.key == 'k' || event.key == 'l')) {
Game.int = setInterval(Game.times, 10);
Game.bool = false;
}
switch (event.key) {
case 'j':
if (Game.hang[3].children[0].style.background == 'black') {
Game.speed();
Game.scores();
} else {
Game.over();
Game.begin()
}
break;
case 'k':
if (Game.hang[3].children[1].style.background == 'black') {
Game.speed();
Game.scores();
} else {
Game.over();
Game.begin()
}
break;
case 'l':
if (Game.hang[3].children[2].style.background == 'black') {
Game.speed();
Game.scores();
} else {
Game.over();
begin()
}
break;
}
Game.color();
}
}第一塊if語句負(fù)責(zé)控制游戲的開始和結(jié)束,當(dāng)按下的按鍵是jkl的時候游戲開始,Game.times是一個計時器的方法,每一秒去執(zhí)行一下
times
times: function () {
Game.mis += 1;
if (Game.mis > 99) {
Game.mis = 0;
Game.sec += 1;
}
if (Game.sec > 59) {
Game.sec = 0;
Game.min += 1;
}
if (Game.min > 23) {
Game.min = 0;
}
Game.begin();
},switch語句里為主要邏輯,每個按鍵分為成功和失敗,如果當(dāng)前按下的按鍵為黑色的話,執(zhí)行speed方法和score方法
speed方法
speed: function () {
Game.adds();
Game.speedup();
// 下面有介紹
},score方法
scores: function () {
Game.score += 1;
Game.sco.innerHTML = Game.score;
},將已經(jīng)定好的score +1,返回給頁面
如果判斷按下的按鈕不是黑塊的話,執(zhí)行結(jié)束的操作,即調(diào)用over()和begin()
over方法
over: function () {
alert('游戲結(jié)束,得分:' + Game.score + ';用時' + Game.time.innerHTML);
clearInterval(Game.int);
Game.mis = 0;
Game.sec = 0;
Game.min = 0;
Game.score = 0;
Game.sco.innerHTML = Game.score;
Game.time.innerHTML = (Game.min < 10 ? "0" + Game.min : Game.min) + ":" + (Game.sec < 10 ? "0" + Game.sec : Game.sec) + ":" + (Game.mis < 10 ? "0" + Game.mis : Game.mis);
Game.bool = true;
},顯示游戲結(jié)束的提示,將計時器,分?jǐn)?shù),游戲狀態(tài)置為初始化,以便下次的重新開始
adds
adds: function () {
Game.tab.insertRow(0);
for (var i = 0; i < 3; i++) {
Game.hang[0].insertCell();
}
Game.hang[0].children[Math.ceil(Math.random() * 3) - 1].style.background = 'black';
},此方法與下面的方法就是表格往下移動的主要函數(shù)
- 在最上面新增一行tr
- 給tr循環(huán)插入三個td
- 給三個td的隨機一個設(shè)置為黑色
speedup
speedup: function () {
if (Game.btn == 0 || Game.btn % 150 != 0) {
Game.tab.style.bottom = -Game.btn - 5 + 'px';
Game.btn += 5;
setTimeout(Game.speedup, 1);
} else {
clearTimeout(Game.speedup);
Game.btn += 5;
}
},speedup方法給予了向下移動時的動畫效果
源碼
直接扔進一個html里就能玩
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>實驗</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
width: 100%;
margin: 0 auto;
background: linear-gradient(-45deg, purple, blue);
}
.container {
margin: 0 auto;
width: 470px;
height: 630px;
overflow: hidden;
position: relative;
}
table {
width: 464px;
height: 612px;
position: absolute;
right: 0;
bottom: 0;
border-collapse: collapse;
}
td {
width: 150px;
height: 150px;
border: 6px solid pink;
}
.main {
color: white;
text-align: center;
/* vertical-align: middle; */
font-size: 50px;
position: absolute;
top: 0;
left: 0;
}
#score {
display: inline-block;
padding-right: 200px;
}
#time {
display: inline-block;
}
.caption {
width: 300px;
font-size: 60px;
font-weight: bold;
text-align: center;
position: relative;
margin: 0 auto;
-webkit-text-fill-color: transparent;
/*文字的填充色*/
-webkit-text-stroke: 1.2px white;
}
.font {
color: transparent;
display: inline-block;
font-size: 60px;
font-weight: bold;
position: absolute;
}
.one {
left: 14.5%;
top: 81%;
}
.two {
left: 45%;
top: 81%;
}
.three {
left: 79%;
top: 81%;
}
</style>
</head>
<body>
<div class="main">
<div id="score">0</div>
<div id="time">00:00:00</div>
</div>
<div class="caption">別踩白塊!</div>
<div class="container">
<table id="tab">
<tr>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
</tr>
</table>
<span class="font one">J</span>
<span class="font two">K</span>
<span class="font three">L</span>
</div>
</body>
<script>
var Game = {
// 屬性
int: null,
mis: 0,
sec: 0,
min: 0,
score: 0,
bool: true,
btn: 0,
tab: document.getElementsByTagName('table')[0],
font: document.getElementsByTagName('span'),
sco: document.getElementById('score'),
time: document.getElementById('time'),
hang: document.getElementsByTagName('tr'),
// 方法
times: function () {
Game.mis += 1;
if (Game.mis > 99) {
Game.mis = 0;
Game.sec += 1;
}
if (Game.sec > 59) {
Game.sec = 0;
Game.min += 1;
}
if (Game.min > 23) {
Game.min = 0;
}
Game.begin();
},
color: function () {
if (Game.hang[3].children[0].style.background == 'black') {
Game.font[0].style.color = 'white';
} else {
Game.font[0].style.color = 'transparent';
}
if (Game.hang[3].children[1].style.background == 'black') {
Game.font[1].style.color = 'white';
} else {
Game.font[1].style.color = 'transparent';
}
if (Game.hang[3].children[2].style.background == 'black') {
Game.font[2].style.color = 'white';
} else {
Game.font[2].style.color = 'transparent';
}
},
adds: function () {
Game.tab.insertRow(0);
for (var i = 0; i < 3; i++) {
Game.hang[0].insertCell();
}
Game.hang[0].children[Math.ceil(Math.random() * 3) - 1].style.background = 'black';
},
speedup: function () {
if (Game.btn == 0 || Game.btn % 150 != 0) {
Game.tab.style.bottom = -Game.btn - 5 + 'px';
Game.btn += 5;
setTimeout(Game.speedup, 1);
} else {
clearTimeout(Game.speedup);
Game.btn += 5;
}
},
speed: function () {
Game.adds();
Game.speedup();
},
scores: function () {
Game.score += 1;
Game.sco.innerHTML = Game.score;
},
over: function () {
alert('游戲結(jié)束,得分:' + Game.score + ';用時' + Game.time.innerHTML);
clearInterval(Game.int);
Game.mis = 0;
Game.sec = 0;
Game.min = 0;
Game.score = 0;
Game.sco.innerHTML = Game.score;
Game.time.innerHTML = (Game.min < 10 ? "0" + Game.min : Game.min) + ":" + (Game.sec < 10 ? "0" + Game.sec : Game.sec) + ":" + (Game.mis < 10 ? "0" + Game.mis : Game.mis);
Game.bool = true;
},
key: function () {
onkeydown = function (event) {
if (Game.bool == true && (event.key == 'j' || event.key == 'k' || event.key == 'l')) {
Game.int = setInterval(Game.times, 10);
Game.bool = false;
}
switch (event.key) {
case 'j':
if (Game.hang[3].children[0].style.background == 'black') {
Game.speed();
Game.scores();
} else {
Game.over();
}
break;
case 'k':
if (Game.hang[3].children[1].style.background == 'black') {
Game.speed();
Game.scores();
} else {
Game.over();
}
break;
case 'l':
if (Game.hang[3].children[2].style.background == 'black') {
Game.speed();
Game.scores();
} else {
Game.over();
}
break;
}
Game.color();
}
}
}
//獲取列---------------------------------------------
Game.hang[0].children[Math.ceil(Math.random() * 3) - 1].style.background = 'black';
Game.hang[1].children[Math.ceil(Math.random() * 3) - 1].style.background = 'black';
Game.hang[2].children[Math.ceil(Math.random() * 3) - 1].style.background = 'black';
Game.hang[3].children[Math.ceil(Math.random() * 3) - 1].style.background = 'black';
//--------------------------------------------------
//鍵盤按下事件----------------------------------------
Game.color();
Game.key();
//---------------------------------------------------
</script>
</html>至此這個小游戲也就完成了啦,希望對你有所幫助,再見~
總結(jié)
到此這篇關(guān)于使用jquery實現(xiàn)別踩白塊小游戲的文章就介紹到這了,更多相關(guān)jquery別踩白塊小游戲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JQuery EasyUI Layout 在from布局自適應(yīng)窗口大小的實現(xiàn)方法
下面小編就為大家?guī)硪黄狫Query EasyUI Layout 在from布局自適應(yīng)窗口大小的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-05-05
jQuery實現(xiàn)圖片上傳和裁剪插件Croppie
這篇文章主要介紹了jQuery實現(xiàn)圖片上傳和裁剪插件Croppie,實現(xiàn)最常見的各用戶系統(tǒng)要求用戶上傳和裁剪頭像的應(yīng)用,感興趣的小伙伴們可以參考一下2015-11-11
jQuery EasyUI API 中文文檔 - ValidateBox驗證框
jQuery EasyUI API 中文文檔 - ValidateBox驗證框,使用jQuery EasyUI的朋友可以參考下。2011-10-10
jQuery中each和js中forEach的區(qū)別分析
這篇文章主要介紹了jQuery中each和js中forEach的區(qū)別,結(jié)合實例形式較為詳細(xì)的分析了jQuery中each和js中forEach針對數(shù)組與對象遍歷的相關(guān)操作技巧與注意事項,需要的朋友可以參考下2019-02-02
JQuery搜索框自動補全(模糊匹配)功能實現(xiàn)示例
這篇文章主要介紹了JQuery搜索框自動補全(模糊匹配)功能實現(xiàn)示例沒使用JQuery UI的autocomplete插件,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-01-01

