jquery之别踩白块游戏的实现

  转载请注明出处http://www.cnblogs.com/Wxtrkbc/p/5687112.html

  前端学习要告一段落了,也没机会写什么像样的东西,然后无意中想起某人以前给我玩了一下别踩白块的游戏,手残还被嘲讽了下,现在想起来觉得这游戏实现起来也不难,于是上星期用jquery写了一个别踩白块的小游戏,就像当初学python的时候一样写了一个2048。然后今天正好抽个时间写个博客纪录下,算是对前一段时间学习的总结,没有玩过的可以去下一个原版的来玩一下,游戏很简单,就是从不断下落的方块中点击黑快,如果点击到百块或者有黑块没被点击到,游戏就算结束。游戏实现起来不难,都是一些小知识点。当时写的时候,脑袋有点糊,有一bug看了半天没解决,后来第二天早上脑袋清醒的时一看就看出来,顺便在这里提醒自己一定不要在脑袋不清醒的时候写代码。好了说了这么多先来看一下效果图,这里别吐槽我的css样式设计就好。。。

    

一、游戏html页面

游戏的html界面非常简单,分为4部分,

  • 得分标题栏,
  • 游戏界面主题容器,开始的时候为一个div,然后用jquery动态生成黑白格子
  • 开始暂停按钮一栏
  • 游戏结束时候显示的模态框

下面是代码部分

<!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容器要设置overflow: hidden,这一点需要注意下,然后其他的知识点也就是absolute,relative如何布局,模态框如何实现并居中,都不难,下面看下代码就好

*{
    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实现  

游戏最核心的部分就是jquery实现了,主要的功能如下

  • 游戏的初始化
  • 如何动态插入一行div和删除一行div
  • 开始暂停按钮的事件绑定
  • 游戏过程中点击百块和黑快的事件委托
  • 游戏如何移动以及如何得分
  • 如何自动增加白块下落速度
  • 如何判定游戏结束

  下面来看一下初始化代码的实现,初始化之前写了个函数,自动插入一行,并且在这一行4个div中某一个为随机的黑块供游戏中点击,剩下3个白块,怎么随机生成,怎么动态创建div这里需要点小技巧,具体看下面。生成一行div的函数完成后只需在初始化函数里面调用4次即可

function insertDiv() {
    var rand = Math.floor(Math.random() * 4);        // 生成一个0到3 的随机数,用来作为判断生成黑块的位置
    $("#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();
    });
}

  初始化完成后,我们需要做的就是如何让界面动起来,这里写了一个函数,每次调用该函数的话,游戏内容会自动向下移动几px,然后将该函数传给定时器,就可以不断的向下滑动,不过这里需要注意,下落过程中,如果下落的距离超过一行后,需要重新插入一行,然后将超出的那一行删除,而且需要将偏移的距离恢复到原来的位置,如果需要加速白块下落的速度,只需将每次向下移动加大即可,游戏后面的自动加速也是基于此来做的。下面来看一下这部分的代码

function move() {
    var ctop = parseInt($("#inner").offset().top);
    ctop += window.globalSpeed;            // 自定义的全局变量, 每次下落偏移的距离
    $("#inner").offset({top: ctop});
    if (ctop >= 114) {
        insertDiv();
        $("#inner").offset({top: 12});        // 刚好移动一个item后在上移一个item
        delDiv();
    }
}

之后就是写开始,暂停部分,这里主要是对计时器的使用,这里需要注意的是每次点击的时候,都要先判断定时器是否已经清除,否则这里会有bug,下面来直接看一下代码

function bindStart() {
    $("#begin").mouseover(function () {
        $(this).css("cursor", ‘pointer‘);
    }).click(function () {
        if(window.globalIsClearT1){        // 自定义的全局变量,看定时器是否清楚

        }else {
            clearInterval(window.globalT1);   //没有清除的话,先清除,避免两次按下开始按钮
        }
        window.globalT1 = setInterval(move, 30);
        window.globalStartClick = true;      //全局变量,是否开始标志位,只有开始了,才能点击
    })
}

function bindStop() {
    $("#stop").mouseover(function () {
        $(this).css("cursor", ‘pointer‘);
    }).click(function () {
        clearInterval(window.globalT1);
        window.globalStartClick = false;
        window.globalIsClearT1 = true;
    })
}

  写到这里,再就是看一下,每次点击的时候如何操作,是否得分,还是点错了游戏结束,下面来看一下代码,界面上有4*4个格子,需要事件委托,来判断是哪一个白块被点击,如果点击的是黑快,将其变为白块,并且加上一分即可,否则点错的话,游戏就结束 

function bindClick() {
    $("#inner").click(function (e) {
        if (window.globalStartClick) {
            var current = $(e.target);
            if (current.hasClass("black")) {
                current.removeClass("black");
                score();
            } else {
                gameOver();
            }
        }
    });
}

下面来看一下如何计算得分的代码,以及如何实现自动的加速,比较简单就不多说了

function score() {
    var score = parseInt($("#score").text());
    if(score%10 == 0){
        window.globalSpeed += 1;                //得到一定的分数后就自动加速
    }
    $("#score").text(score + 1);
}

  最后来看一下,游戏结束的时候如何处理,游戏结束的话,先暂停游戏下落,然后弹出模态对话框,让用户选择返回,还是重新来过,重新来过的话,分数清零,游戏界面清空,然后初始化再在自动触发开始按钮,开始下一轮游戏,  

function gameOver() {
    //暂停游戏,显示模态框
    $("#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)
    });  

到这里,基本整个游戏都算实现了,游戏不复杂,但是要完全运行起来,没有bug也不是那么简单,有兴趣的也可以去写写,如果上面代码有什么问题的话,可以向我提出来。  

  

时间: 2024-10-08 19:06:02

jquery之别踩白块游戏的实现的相关文章

C++用EGE简单实现别踩白块游戏

本项目已开源:https://github.com/wmpscc/AvoidBlank 关于EGE 介绍:EGE(Easy Graphics Engine),是windows下的简易绘图库,是一个类似BGI(graphics.h)的面向C/C++语言新手的图形库,它的目标也是为了替代TC的BGI库而存在. 详情见EGE官网 下载:官网提供的下载地址 安装方法一 简单示例 #include <graphics.h> int main() { //初始化为640*480大小 initgraph(6

2cocos2dx别踩白块游戏案例

 1 建立一个别踩白块的项目dtwb(Don'ttouch white block) 2 修改main.cpp中的代码 3 修改AppDelegate.cpp中的代码 4 案例代码 Block.h #ifndef __BLOCK_H__ #define __BLOCK_H__ #include "cocos2d.h" USING_NS_CC; class Block :public CCSprite { public: //分別表示块大小,块颜色,块中的字符串,字的大小,颜色 st

自学easeljs 根据别踩白块游戏规则自己写的代码

主要基于       -------easeljs-0.7.1.min.js-----   去制作这个游戏 思路:主要思路是以行为单位 绑定可点击行 选中则讲 移动最外层容器继续绑定可点击行的下一行 否则结束游戏 HTML页面布局 <script src="js/easeljs-0.7.1.min.js"></script> <script src="easeljs/drawZfx.js"></script> <

游戏——网页版别踩白块

一 项目简介 主要知识点:JavaScript.HTML.CSS这是一个主要用JS实现的网页版小游戏,游戏规则很简单,通过点击不断下落的黑块来消灭它并获取分数,如果不幸黑块掉落下来或点到了白色区域那么游戏就会终止.游戏截图如下: 二 游戏框架 整个游戏可分为以下几个步骤实现:1. HTML和CSS画出静态的游戏框架:2. DOM结构说明:游戏元素使用嵌套的div元素来实现,是一个4*4的方格地图:最外层容器main(一个) > 次外层容器container(一个) > 行容器row(四行) &

小游戏--别踩白块

有图有真相,先上图再说 照旧贴出代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <title>别踩白块</title> <style type="text/cs

JS实现别踩白块小游戏

最近有朋友找我用JS帮忙仿做一个别踩白块的小游戏程序,但他给的源代码较麻烦,而且没有注释,理解起来很无力,我就以自己的想法自己做了这个小游戏,主要是应用JS对DOM和数组的操作. 程序思路:如图:将游戏区域的CSS设置为相对定位.溢出隐藏;两块“游戏板”上分别排布着24块方格,黑色每行随机产生一个,“游戏板”向下滚动并交替显示,将每个操作板的黑块位置存入数组,每次点击时将数组pop出来进行比对(我觉得亮点在这……). 这里是游戏的GitHub地址,大家可以到里点击中部菜单最右边的的Downloa

JS游戏–别踩白块–教学视频

[布尔教育 PHP就业班 课堂案例 ] 玩游戏,不如自己写游戏! 打开浏览器,打开编辑器(sublime,editplus,notepad都行), 花上2个小时,写个"别踩白块"玩一玩. JS游戏_别踩白块(1) 思路分析.wmv JS游戏_别踩白块(2) 框架搭建.wmv JS游戏_别踩白块(3) 之随机黑白块.wmv JS游戏_别踩白块(4) 方块动起来.wmv JS游戏_别踩白块(5) 方块无缝滚动.wmv JS游戏_别踩白块(6) 得分.wmv JS游戏_别踩白块(7) 犯规处

GameBuilder开发游戏应用系列之100行代码实现别踩白块

在线预览:http://osgames.duapp.com/apprun.html?appid=osgames1-961421749977376 在线编辑:http://osgames.duapp.com/gamebuilder.php?appid=osgames1-961421749977376 微信扫描: 游戏截图: 别踩白块是一款非常流行的游戏,该游戏于2014年4月16日上线App Store.并在全球40多个国家.地区免费游戏榜登顶榜首[4] ,超过一百个国家或地区排名前十 ,5月份荣

cocos2dx游戏开发——别踩白块学习笔记(二)——经典模式的实现

一.创建GameScene以及GameLayer 就是简单创建一个Scene而已,在此就不多说啦~,可以参照我的打飞机的学习笔记(2). 二.添加一个开始栏 很简单,就是调用Block中的create方法就可以啦~,只是需要传入大小和颜色等等的参数即可. void GameLayer::addStartLine() { auto block = Block::createWithArgs(Color3B::YELLOW, Size(visibleSize.width,visibleSize.he