jquery之別踩白塊游戲的簡(jiǎn)單實(shí)現(xiàn)
前端學(xué)習(xí)要告一段落了,也沒機(jī)會(huì)寫什么像樣的東西,然后無意中想起某人以前給我玩了一下別踩白塊的游戲,手殘還被嘲諷了下,現(xiàn)在想起來覺得這游戲?qū)崿F(xiàn)起來也不難,于是上星期用jquery寫了一個(gè)別踩白塊的小游戲,就像當(dāng)初學(xué)python的時(shí)候一樣寫了一個(gè)2048。然后今天正好抽個(gè)時(shí)間寫個(gè)博客紀(jì)錄下,算是對(duì)前一段時(shí)間學(xué)習(xí)的總結(jié),沒有玩過的可以去下一個(gè)原版的來玩一下,游戲很簡(jiǎn)單,就是從不斷下落的方塊中點(diǎn)擊黑快,如果點(diǎn)擊到百塊或者有黑塊沒被點(diǎn)擊到,游戲就算結(jié)束。游戲?qū)崿F(xiàn)起來不難,都是一些小知識(shí)點(diǎn)。當(dāng)時(shí)寫的時(shí)候,腦袋有點(diǎn)糊,有一bug看了半天沒解決,后來第二天早上腦袋清醒的時(shí)一看就看出來,順便在這里提醒自己一定不要在腦袋不清醒的時(shí)候?qū)懘a。好了說了這么多先來看一下效果圖,這里別吐槽我的css樣式設(shè)計(jì)就好。。。

一、游戲html頁面
游戲的html界面非常簡(jiǎn)單,分為4部分,
得分標(biāo)題欄,
游戲界面主題容器,開始的時(shí)候?yàn)橐粋€(gè)div,然后用jquery動(dòng)態(tài)生成黑白格子
開始暫停按鈕一欄
游戲結(jié)束時(shí)候顯示的模態(tài)框
下面是代碼部分
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link href="../css/game.css" rel="stylesheet" type="text/css">
</head>
<body>
<div class="main">
<h3>Score:<span id="score">0</span></h3>
<div id="content" class="content">
<div id="inner"></div>
</div>
<div class="btn">
<div class="container">
<button id="begin">開始</button>
<button id="stop">暫停</button>
</div>
</div>
<div class="shadow hide"></div>
<div class="alert-box hide">
<div class="game-over">
<img style="opacity: 0.8" src="../pic/gg.jpg">
</div>
<div class="btn">
<button id="again">重新開始</button>
<button id="back">返回</button>
</div>
</div>
</div>
<script src="../js/jquery-1.12.4.js"></script>
<script src="../js/game.js"></script>
</body>
</html>
二、css布局
寫完了html然后就是css,這里主要用到 absolute布局,然后需要注意的是就是游戲過程由于需要不停的生成一欄新div,所以div容器要設(shè)置overflow: hidden,這一點(diǎn)需要注意下,然后其他的知識(shí)點(diǎn)也就是absolute,relative如何布局,模態(tài)框如何實(shí)現(xiàn)并居中,都不難,下面看下代碼就好
*{
margin: 0;
padding: 0;
}
.main{
width: 808px;
margin: 50px auto;
background: gray;
min-height: 544px;
position: relative;
}
.content{
width: 408px;
margin: 0 auto;
height:408px;
border: 2px solid green;
background-color: white;
position: relative;
top:0;
overflow: hidden;
}
#inner{
position: relative;
top:-102px;
}
.item{
height: 102px;
}
.item *{
float: left;
height: 100px;
width: 100px;
background-color: white;
border: 1px solid black;
}
.black{
background-color: black;
}
h3{
text-align: center;
padding-top: 20px;
padding-bottom: 20px;
}
h3 span{
color:brown;
}
.hide{
display: none;
}
.shadow{
position: absolute;
left: 0;
bottom: 0;
right: 0;
top: 0;
background-color: gray;
opacity: 0.6;
}
.alert-box{
position: absolute;
width: 300px;
height: 300px;
left: 50%;
top:50%;
margin-left: -150px;
margin-top: -150px;
background-color: white;
}
.alert-box .game-over{
margin-left: 20px;
margin-top: 30px;
}
.alert-box .btn{
width: 150px;
position: relative;
margin-left: auto;
margin-right: auto;
margin-top: 20px;
}
.main .btn .container{
width: 150px;
margin: 20px auto;
}
button{
cursor: pointer;
border: 0;
display: inline-block;
width: 70px;
height: 30px;
line-height: 30px;
text-align: center;
background-color: cyan;
}
三、jquery實(shí)現(xiàn)
游戲最核心的部分就是jquery實(shí)現(xiàn)了,主要的功能如下
•游戲的初始化
•如何動(dòng)態(tài)插入一行div和刪除一行div
•開始暫停按鈕的事件綁定
•游戲過程中點(diǎn)擊百塊和黑快的事件委托
•游戲如何移動(dòng)以及如何得分
•如何自動(dòng)增加白塊下落速度
•如何判定游戲結(jié)束
下面來看一下初始化代碼的實(shí)現(xiàn),初始化之前寫了個(gè)函數(shù),自動(dòng)插入一行,并且在這一行4個(gè)div中某一個(gè)為隨機(jī)的黑塊供游戲中點(diǎn)擊,剩下3個(gè)白塊,怎么隨機(jī)生成,怎么動(dòng)態(tài)創(chuàng)建div這里需要點(diǎn)小技巧,具體看下面。生成一行div的函數(shù)完成后只需在初始化函數(shù)里面調(diào)用4次即可
function insertDiv() {
var rand = Math.floor(Math.random() * 4); // 生成一個(gè)0到3 的隨機(jī)數(shù),用來作為判斷生成黑塊的位置
$("#inner").prepend("<div class='item'></div>");
$.each([0, 1, 2, 3], function (k, v) {
if (v == rand) {
$("#inner .item").first().append("<div class='black col'></div>");
} else {
$("#inner .item").first().append("<div class='col'></div>");
}
})
}
function init() { // 初始生成4*4的div
$.each([0, 1, 2, 3], function () {
insertDiv();
});
}
初始化完成后,我們需要做的就是如何讓界面動(dòng)起來,這里寫了一個(gè)函數(shù),每次調(diào)用該函數(shù)的話,游戲內(nèi)容會(huì)自動(dòng)向下移動(dòng)幾px,然后將該函數(shù)傳給定時(shí)器,就可以不斷的向下滑動(dòng),不過這里需要注意,下落過程中,如果下落的距離超過一行后,需要重新插入一行,然后將超出的那一行刪除,而且需要將偏移的距離恢復(fù)到原來的位置,如果需要加速白塊下落的速度,只需將每次向下移動(dòng)加大即可,游戲后面的自動(dòng)加速也是基于此來做的。下面來看一下這部分的代碼
function move() {
var ctop = parseInt($("#inner").offset().top);
ctop += window.globalSpeed; // 自定義的全局變量, 每次下落偏移的距離
$("#inner").offset({top: ctop});
if (ctop >= 114) {
insertDiv();
$("#inner").offset({top: 12}); // 剛好移動(dòng)一個(gè)item后在上移一個(gè)item
delDiv();
}
}
之后就是寫開始,暫停部分,這里主要是對(duì)計(jì)時(shí)器的使用,這里需要注意的是每次點(diǎn)擊的時(shí)候,都要先判斷定時(shí)器是否已經(jīng)清除,否則這里會(huì)有bug,下面來直接看一下代碼
function bindStart() {
$("#begin").mouseover(function () {
$(this).css("cursor", 'pointer');
}).click(function () {
if(window.globalIsClearT1){ // 自定義的全局變量,看定時(shí)器是否清楚
}else {
clearInterval(window.globalT1); //沒有清除的話,先清除,避免兩次按下開始按鈕
}
window.globalT1 = setInterval(move, 30);
window.globalStartClick = true; //全局變量,是否開始標(biāo)志位,只有開始了,才能點(diǎn)擊
})
}
function bindStop() {
$("#stop").mouseover(function () {
$(this).css("cursor", 'pointer');
}).click(function () {
clearInterval(window.globalT1);
window.globalStartClick = false;
window.globalIsClearT1 = true;
})
}
寫到這里,再就是看一下,每次點(diǎn)擊的時(shí)候如何操作,是否得分,還是點(diǎn)錯(cuò)了游戲結(jié)束,下面來看一下代碼,界面上有4*4個(gè)格子,需要事件委托,來判斷是哪一個(gè)白塊被點(diǎn)擊,如果點(diǎn)擊的是黑快,將其變?yōu)榘讐K,并且加上一分即可,否則點(diǎn)錯(cuò)的話,游戲就結(jié)束
function bindClick() {
$("#inner").click(function (e) {
if (window.globalStartClick) {
var current = $(e.target);
if (current.hasClass("black")) {
current.removeClass("black");
score();
} else {
gameOver();
}
}
});
}
下面來看一下如何計(jì)算得分的代碼,以及如何實(shí)現(xiàn)自動(dòng)的加速,比較簡(jiǎn)單就不多說了
function score() {
var score = parseInt($("#score").text());
if(score%10 == 0){
window.globalSpeed += 1; //得到一定的分?jǐn)?shù)后就自動(dòng)加速
}
$("#score").text(score + 1);
}
最后來看一下,游戲結(jié)束的時(shí)候如何處理,游戲結(jié)束的話,先暫停游戲下落,然后彈出模態(tài)對(duì)話框,讓用戶選擇返回,還是重新來過,重新來過的話,分?jǐn)?shù)清零,游戲界面清空,然后初始化再在自動(dòng)觸發(fā)開始按鈕,開始下一輪游戲,
function gameOver() {
//暫停游戲,顯示模態(tài)框
$("#stop").trigger('click');
window.globalIsClearT1 = true;
$(".shadow").removeClass('hide').next().removeClass('hide');
$("#again").click(function () {
clearInterval(window.globalT1);
$(".shadow").addClass('hide').next().addClass('hide');
$("#score").text(0);
clearAll();
init();
$("#begin").trigger('click');
// window.globalT1 = setInterval(move, 30)
});
到這里,基本整個(gè)游戲都算實(shí)現(xiàn)了,游戲不復(fù)雜,但是要完全運(yùn)行起來,沒有bug也不是那么簡(jiǎn)單,有興趣的也可以去寫寫,如果上面代碼有什么問題的話,可以向我提出來。
以上這篇jquery之別踩白塊游戲的簡(jiǎn)單實(shí)現(xiàn)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
jQuery控制文本框只能輸入數(shù)字和字母及使用方法
這篇文章主要介紹了jQuery控制文本框只能輸入數(shù)字和字母及使用方法的相關(guān)資料,非常不錯(cuò)而且實(shí)用性也很高,需要的朋友可以參考下2016-05-05
jquery獲取easyui日期控件的值實(shí)現(xiàn)方法
下面小編就為大家?guī)硪黄猨query獲取easyui日期控件的值實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-11-11
文本框水印提示效果的簡(jiǎn)單實(shí)現(xiàn)代碼
本篇文章主要是對(duì)文本框水印提示效果的簡(jiǎn)單實(shí)現(xiàn)代碼進(jìn)行了介紹,需要的朋友可以過來參考下,希望對(duì)大家有所幫助2014-02-02
jquery實(shí)現(xiàn)類似淘寶星星評(píng)分功能實(shí)例
這篇文章主要介紹了jquery實(shí)現(xiàn)類似淘寶星星評(píng)分功能,詳細(xì)介紹了相應(yīng)jQuery事件的用法實(shí)例,需要的朋友可以參考下2014-09-09
jquery對(duì)象和DOM對(duì)象的區(qū)別介紹
jquery對(duì)象和DOM對(duì)象在使用過程很頻繁,正是因?yàn)槿绱?,好多朋友都不知道它們之間有什么區(qū)別,下面為大家詳細(xì)介紹下,希望對(duì)大家有所幫助2013-08-08
jquery實(shí)現(xiàn)手風(fēng)琴案例
這篇文章主要為大家詳細(xì)介紹了jquery實(shí)現(xiàn)手風(fēng)琴案例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-05-05
非常漂亮的相冊(cè)集 使用jquery制作相冊(cè)集
這篇文章主要為大家詳細(xì)介紹了使用jquery制作非常漂亮的相冊(cè)集,步驟詳細(xì),細(xì)節(jié)介紹完整,感興趣的小伙伴們可以參考一下2016-04-04

