jquery实现小游戏

基础知识:jq+c3的基本知识
由于有部分已知bug,就直接贴代码?

静态页面

<!doctype html>
<html >
 <head>
  	<meta charset="UTF-8">
  	<title>过关小游戏</title>
    <link href="css/style.css" rel="stylesheet"/>
    <script src="js/jquery-1.8.3.min.js"></script>
	 <script src="js/jquery-randomcolor.js"></script>
	<script src="js/play.js"></script>
 </head>
 <body class="bg2">
 	<!-- 放关卡和主菜单的盒子 -->
	<div class="set-text">
			<ul class="play-list">
			</ul>
		<a href="index.html">主菜单</a>
	</div>
	<!-- 中间的按钮 -->
	<a href="javascript:void(0);" class="btnClick"></a>
	<!-- 下半部分放棍子,英雄,柱子的盒子 -->
	<div class="container">
		<!-- 放棍子 -->
		<div class="stick"></div>
		<!-- 放英雄 -->
		<div class="man">
			<img src="img/stick_stand.png"/>
		</div>
		<!-- 放柱子 -->
		<div class="well-box"></div>
	</div>

	<!-- 成功或失败时的弹框 -->
	<div class="dialog" style="display:none">
		<!-- 放提示文字 -->
		<p class="name"></p>
		<!-- 放按钮 -->
		<p class="dialog-btn"></p>
	</div>
	<!--游戏音效-->
	<audio class="game-audio" src="#"></audio>
 </body>
</html>

js部分

$(function () {
    //生成柱子 思路:设置柱子的宽度,一次性的创建柱子,添加到盒子里
    //柱子宽度
    var wellWidth = 100;
    // 柱子个数
    var wellNum = 5;
    //柱子位置
    var randomLeftSum = 0;//记录随机位置
    //柱子间最小间隙
    var minSpace = 100;
    //柱子间最大宽度
    var maxSpace = $(".container").offset().top;
    //需要创建的柱子
    var pillar = $("<div class='well'></div>");
    (function () {
        //1、随机背景
        $("body").css({
            "background-image": "url(https://api.mlwei.com/img/api/)",
            "background-size": "cover",
        });
        //循环遍历创建关卡
        for (var i = 0; i <= (wellWidth - 30) / 10; i++) {
            if (i == 0) {
                $("<li></li>").text("关卡" + (i + 1)).appendTo($(".play-list")).show();
                continue;
            }
            $("<li></li>").text("关卡" + (i + 1)).appendTo($(".play-list")).hide();
        }
        // 选择关卡
        $(".play-list li").click(function () {
            $(this).siblings().fadeToggle(500);
            pass = $(this).index() + 1;
            wellWidth = 100;
            wellWidth -= $(this).index() * 10;
            $(".dialog").hide();
            well();
            initPersonStick(true);
        });
    })();

    //封装生成柱子的方法
    function well() {
        //清空装柱子的盒子
        $(".well-box").empty().css("left", 0);
        var randomLeft = 0;
        for (var i = 0; i < wellNum; i++) {
            randomLeft = i == 0 ? 0 : randomWell();
            pillar.clone().css({
                width: wellWidth,
                left: randomLeft + i * wellWidth,
            }).appendTo($(".well-box")).randomColor();
        }
        randomLeftSum = 0;
    }

    //柱子的随机位置
    function randomWell() {
        randomLeftSum += Math.floor(Math.random() * (maxSpace - minSpace) + minSpace);
        return randomLeftSum;
    }

    //初始化柱子
    well();
//二、鼠标按下不动,棍子宽度变宽
    var flag = true;
    $(".btnClick").mousedown(function () {
        if (flag) {
            $(this).css("background-image","url(img/btn-bg-click.png)");
            var max = $(".container").offset().top;
            $(".stick").animate({width: max}, 2000).randomColor();
            flag=false;
        }
    });
    $(".btnClick").mouseup(function () {
        if (!flag) {
            $(this).css("background-image","url(img/btn-bg.png)");
            //停止动画,让棍子倒下来
            $(".stick").stop().addClass("stickDown");
            //调用小人跑起来的函数
            setTimeout(moveMan, 350);
            flag = true;
        }
    });

//3、小人跑起来的函数
    var index = 0;//记录柱子的索引
    var pass = 1;//关卡
    function moveMan() {
        var stickWidth = $(".stick").width();
        $(".man img").attr("src", "img/stick.gif").animate({
            "left": stickWidth
        }, 1500, function () {
            //判断小人是否挑战成功
            //失败:棍子的宽度小于两个柱子之间的距离或者大于两个柱子之间的距离+柱子的宽度

            //两个柱子之间的距离=后一个柱子的left值-前一个柱子的宽度
            var space = $(".well").eq(index + 1).offset().left - wellWidth;
            if (stickWidth < space || stickWidth > (space + wellWidth)) {
                fail();
            } else {
                suc();
            }
        });
    }

//封装失败的函数
    function fail() {
        //失败音效
        $(".game-audio").attr("src", info.audio_fail)[0].play();
        //1、小人掉下去,rotate的类选择器,小人隐藏
        $(".man img").addClass("rotate");
        //2、棍子的宽度为0,移除stickDown的样式
        $(".stick").width(5).removeClass("stickDown").hide();
        //3、显示弹框
        //4、设置弹框文本
        $(".dialog").show().find("p.name").text(randomTxt("fail")).end().find("p.dialog-btn").html("<a class='no-pass' style='cursor: pointer'>再试一次</a>");
        //游戏结束
        $("a.no-pass").click(function () {
            location.reload();
        });
    }

//成功的方法
    function suc() {
        //成功音效
        $(".game-audio").attr("src", info.audio_suc)[0].play();
        flag = true;
        //成功
        initPersonStick(false);
        var leftSpace = Math.abs($(".well-box").offset().left);
        index++;
        //3、柱子盒子整体移动,移动完跑下一个柱子index++
        $(".well-box").animate({
            "left": -($(".well").eq(index).offset().left + leftSpace)
        }, 1000, function () {
            if (index == wellNum - 1) {
                checkPass();
            } else {
                initPersonStick(true);
            }
        });
    }

//判断是否选择下一关
    function checkPass() {
        if (wellWidth == 30) {
            $(".dialog").show().find("p.name").text("恭喜你通过所有关卡?").end().find("p.dialog-btn").html("");
            flag = false;
            return;
        }
        flag = false;
        $(".dialog").show().find("p.name").text(randomTxt("suc")).end().find("p.dialog-btn").html(
            "<a class='play-agin' style='cursor: pointer'>重玩一局</a><a class='next' style='cursor: pointer'>下个关卡</a>"
        );
        $("a.next").click(function () {
            passNext();
        });
        $("a.play-agin").click(function () {
            location.reload();
        });
    }

//进入下一关
    function passNext() {
        flag = true;
        wellWidth -= 10;
        index = 0;
        pass++;
        $(".play-title").text("关卡" + pass);
        $(".well-box").empty().css("left", 0);
        $(".play-list li").eq(pass-1).fadeIn(500).siblings().hide();
        well();
        $(".dialog").hide();
        initPersonStick(true);
    }

//初始化小人和棍子
    function initPersonStick(show) {
        if (show) {
            $(".man img").css("left", 0);
            $(".stick").css("left", 100);
            $(".man img").css("left", "-=" + (pass - 1) * 10).show(500);
            $(".stick").css("left", "-=" + (pass - 1) * 10).show();
        } else {
            //1、小人站立的图片
            $(".man img").attr("src", "img/stick_stand.png").css(
                "left", -$(".well").eq(index).offset().left
            ).hide();
            //2、棍子初始化:棍子的宽度为0
            $(".stick").width(5).removeClass("stickDown").hide();
        }
    }
    //键盘控制
    $(document).keydown(function (e) {
        var e=e||window.event;
        if(flag&&e.keyCode==32){
            $(".btnClick").mousedown();
            flag=false;
        }
    });
    $(document).keyup(function (e) {
        var e=e||window.event;
        if(!flag&&e.keyCode==32){
            $(".btnClick").mouseup();
            flag=true;
        }
    });
//随机提示语
    function randomTxt(type) {
        var txt = {
            suc: [
                '勇敢坚毅真正之才智乃刚毅之志向。 —— 拿破仑',
                '志向不过是记忆的奴隶,生气勃勃地降生,但却很难成长。 —— 莎士比亚',
                '骏马是跑出来的,强兵是打出来的。',
                '只有登上山顶,才能看到那边的风光。',
                '如果惧怕前面跌宕的山岩,生命就永远只能是死水一潭。',
                '平时没有跑发卫千米,占时就难以进行一百米的冲刺。',
                '梯子的梯阶从来不是用来搁脚的,它只是让人们的脚放上一段时间,以便让别一只脚能够再往上登。',
                '没有激流就称不上勇进,没有山峰则谈不上攀登。',
                '真正的才智是刚毅的志向。 —— 拿破仑',
                '山路曲折盘旋,但毕竟朝着顶峰延伸。',
                '只有创造,才是真正的享受,只有拚搏,才是充实的生活。',
                '敢于向黑暗宣战的人,心里必须充满光明。',
                '种子牢记着雨滴献身的叮嘱,增强了冒尖的勇气。',
                '自然界没有风风雨雨,大地就不会春华秋实。',
                '只会幻想而不行动的人,永远也体会不到收获果实时的喜悦。',
                '勤奋是你生命的密码,能译出你一部壮丽的史诗。',
                '对于攀登者来说,失掉往昔的足迹并不可惜,迷失了继续前时的方向却很危险。',
                '奋斗者在汗水汇集的江河里,将事业之舟驶到了理想的彼岸。',
                '忙于采集的蜜蜂,无暇在人前高谈阔论。',
                '勇士搏出惊涛骇流而不沉沦,懦夫在风平浪静也会溺水。'
            ],
            fail: [
                '志在峰巅的攀登者,不会陶醉在沿途的某个脚印之中。',
                '海浪为劈风斩浪的航船饯行,为随波逐流的轻舟送葬。',
                '人生最重要的一点是,永远不要迷失自己。',
                '一个人承受孤独的能力有多大,他的能力就有多大。',
                '实力塑造性格,性格决定命运。',
                '普通人成功并非靠天赋,而是靠把寻常的天资发挥到不寻常的高度。',
                '对于强者,要关注他们的灵魂,对于弱者,他关注他们的生存。',
                '积极的人在每一次忧患中都看到一个机会,而消极的人则在每个机会都看到某种忧患。',
                '成功不是将来才有的,而是从决定去做的那一刻起,持续累积而成。',
                '当你感到悲哀痛苦时,最好是去学些什么东西。学习会使你永远立于不败之地。',
                '有的人一生默默无闻,有的人一生轰轰烈烈,甚至千古流芳,为什么会这样?因为默默无闻的人只是满足于现状,而不去想怎么轰轰烈烈过一生,不要求自己,去做,去行动,怎么能够成功?',
                '人性最可怜的就是:我们总是梦想着天边的一座奇妙的玫瑰园,而不去欣赏今天就开在我们窗口的玫瑰。',
                '在人生的道路上,即使一切都失去了,只要一息尚存,你就没有丝毫理由绝望。因为失去的一切,又可能在新的层次上复得。',
                '没有一劳永逸的开始;也没有无法拯救的结束。人生中,你需要把握的是:该开始的,要义无反顾地开始;该结束的,就干净利落地结束。',
                '生命的奖赏远在旅途终点,而非起点附近。我不知道要走多少步才能达到目标,踏上第一千步的时候,仍然可能遭到失败。但我不会因此放弃,我会坚持不懈,直至成功!',
                '不要认为只要付出就一定会有回报,这是错误的。学会有效地工作,这是经营自己强项的重要课程。',
                '苦心人天不负,卧薪尝胆,三千越甲可吞吴。有志者事竞成,破釜沉舟,百二秦川终属楚。',
                '生命本身是一个过程,成功与失败只是人生过程中一些小小的片段,若果把生命与成功或失败联系在一起,生命将失去本身该有的意义。',
                '我们不要哀叹生活的不幸,诅咒命运的不公。在命运面前,我们要做强者,掐住命运的咽喉,叩问命运,改变命运。',
                '努力和效果之间,永远有这样一段距离。成功和失败的唯一区别是,你能不能坚持挺过这段无法估计的距离。'
            ]
        }
        return txt[type][Math.floor(Math.random() * txt[type].length)];
    }

    var info = {
        audio_suc: "http://s.aigei.com/pvaud/aud/mp3/a5/a593ea12a3ad481fa49b98483a3d0f01.mp3?e=1550854620&token=P7S2Xpzfz11vAkASLTkfHN7Fw-oOZBecqeJaxypL:qoxNLNLW5gcfL9VyPWjOjgffKVE=",
        audio_fail: "http://s.aigei.com/pvaud/aud/mp3/7e/7e1505396c2043b6b18ec2d61c39a262.mp3?e=1550854980&token=P7S2Xpzfz11vAkASLTkfHN7Fw-oOZBecqeJaxypL:T3QWSHxZx-fQeLfh-MKmXt2JDpo="
    }
})
;

最终效果图:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值