JavaScript强化教程 - 六步实现贪食蛇

本文介绍了一个使用HTML5和JavaScript实现的贪食蛇游戏教程。该教程详细讲解了如何创建游戏地图、蛇身和食物元素,并实现了蛇的移动、碰撞检测及用户交互等功能。
本文为 H5EDU 机构官方的 HTML5培训 教程,主要介绍贪食蛇
JavaScript强化教程
 
1.首先创建div 并且给div加样式
<div id="pannel" style="width: 500px;height: 500px;z-index: 1;opacity: 0.5"></div>
给 <style...> 地图(div和表格)、所有的块(蛇头,食物身体加样式)
2.创建地图
    document.write("<table cellspacing='0px'>");
    for (var i = 0; i < 10; i++) {... }
    document.write("</table>");
3.调用createNode函数创建块
 var pannel = document.getElementById("pannel");
    function createNode(type) {... } //[i][b]根据type创建块(0头部 1食物 2身体)
[/b][/i]    //申请一些变量以便以后调用
    var allNode = new Array();//存所有吃到的身体
    var fooldNode = null;//指向食物a
    var headNode = null;//指向头部b
    headNode = createNode(0);//创建头部A
    headNode.value = 39;//给头部一个方向  37左 38上 39右 40下
    fooldNode = createNode(1);//创建食物B
4.定时器
function moveNode() {...};
 
setInterval(moveNode, 500);启动定时器
5.
document.onkeydown = function () {通过
event.keyCode改变headNode.value
实现用户按键改变蛇头自动移动的方向}
6.核心逻辑 
在第4中的 function moveNode() {...}; 定时执行此函数
实现了:1.移动所有身体
     2.移动蛇头
     3.创建新块并且 新块在蛇尾产生,方向与蛇尾相同
------------------------------------------------------------------------------------------------
  • 实现源码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        * {
            padding: 0;
            margin: 0;
        }

        td {
            width: 48px;
            height: 48px;
            border: solid 1px darkorange;
        }

        div {
            position: absolute;
            width: 50px;
            height: 50px;
        }

    </style>
</head>
<body>

<div id="pannel" style="width: 500px;height: 500px;z-index: 1;opacity: 0.5"></div>

<script>
    document.write("<table cellspacing='0px'>");
    for (var i = 0; i < 10; i++) {
        document.write("<tr>");
        for (var j = 0; j < 10; j++) {
            document.write("<td></td>");
        }
        document.write("</tr>");
    }
    document.write("</table>");
    //创建头部
    var pannel = document.getElementById("pannel");
    function createNode(type) {
        var div = document.createElement("div");
        pannel.appendChild(div);

        div.style.left = parseInt(Math.random() * 10) * 50 + "px";
        div.style.top = parseInt(Math.random() * 10) * 50 + "px";

        switch (type) {
            case 0:
                div.style.background = "red";//头
                break;
            case 1:
                div.style.background = "blue";//食物
                break;
            case 2:
                div.style.background = "yellow";//身体
                break;
        }
        return div;
    }
    var allNode = new Array();
    var fooldNode = null;
    var headNode = null;
    headNode = createNode(0);
    headNode.value = 39;
    fooldNode = createNode(1);
    function moveNode() {

//移动所有身体
        if (allNode.length > 0) {
            for (var n = allNode.length - 1; n >= 0; n--) {
                switch (parseInt(allNode[n].value)) {
                    case 37:
                        allNode[n].style.left = parseInt(allNode[n].style.left) - 50 + "px";
                        break;
                    case 38:
                        allNode[n].style.top = parseInt(allNode[n].style.top) - 50 + "px";
                        break;
                    case 39:
                        allNode[n].style.left = parseInt(allNode[n].style.left) + 50 + "px";
                        break;
                    case 40:
                        allNode[n].style.top = parseInt(allNode[n].style.top) + 50 + "px";
                        break;
                }
                if(n>0){
                    allNode[n].value = allNode[n-1].value;
                }else {
                    allNode[n].value = headNode.value;
                }
            }
        }

        var px = parseInt(headNode.style.left);
        var py = parseInt(headNode.style.top);
        switch (headNode.value) {
            case 37:
                headNode.style.left = px - 50 + "px";
                break;
            case 38:
                headNode.style.top = py - 50 + "px";
                break;
            case 39:
                headNode.style.left = px + 50 + "px";
                break;
            case 40:
                headNode.style.top = py + 50 + "px";
                break;
        }

        //碰撞检测
        if (headNode.style.left == fooldNode.style.left &&
                headNode.style.top == fooldNode.style.top) {
            var newbody = createNode(2);
            var lastbody = null;
            if (allNode.length == 0) {
                lastbody = headNode;
            } else {
                lastbody = allNode[allNode.length - 1];
            }
            newbody.value = lastbody.value;
//            lastbody.style.left = parseInt(lastbody.style.left)-50+"px";
            switch (parseInt(lastbody.value)) {
                case 37:
                    newbody.style.left = parseInt(lastbody.style.left) + 50 + "px";
                    newbody.style.top = lastbody.style.top;
                    break;
                case 38:
                    newbody.style.top = parseInt(lastbody.style.top) + 50 + "px";
                    newbody.style.left = lastbody.style.left;
                    break;
                case 39:
                    newbody.style.left = parseInt(lastbody.style.left) - 50 + "px";
                    newbody.style.top = lastbody.style.top;
                    break;
                case 40:
                    newbody.style.top = parseInt(lastbody.style.top) - 50 + "px";
                    newbody.style.left = lastbody.style.left;
                    break;
            }

            allNode.push(newbody);
            fooldNode.style.left = parseInt(Math.random() * 10) * 50 + "px";
            fooldNode.style.top = parseInt(Math.random() * 10) * 50 + "px";
        }//碰撞end

    }
    setInterval(moveNode, 500);
    document.onkeydown = function () {
        switch (event.keyCode) {
            case 37:
                headNode.value = 37;
                break;
            case 38:
                headNode.value = 38;
                break;
            case 39:
                headNode.value = 39;
                break;
            case 40:
                headNode.value = 40;
                break;
        }
    }

</script>

</body>
</html>
├─01 第一章 线程基础│ ├─01 线程概述│ │ 01 认识线程.mp4│ │ 02 线程和进程的关系.mp4│ │ 03 并发和并行的区别.mp4│ │ 04 并发编程的应用场景和风险.mp4│ │ │ ├─02 线程的启动和终止│ │ 01 线程的启动一:继承Thread类.mp4│ │ 02 线程的启动二:实现Runnable接口.mp4│ │ 03 线程的启动三:实现Callable接口.mp4│ │ 04 三种启动方式调用上的区别.mp4│ │ 05 start调用run的底层原理.mp4│ │ 06 线程的终止:被弃用的stop方法.mp4│ │ 07 请求中断线程:interrupt方法.mp4│ │ 08 响应中断线程:isInterrupted方法.mp4│ │ 09 清除中断状态:interrupted方法.mp4│ │ 10 被中断异常:InterruptedException.mp4│ │ │ ├─03 线程的属性和常用API│ │ 01 线程的优先级.mp4│ │ 02 守护线程的特点和注意事项.mp4│ │ 03 JVM中的守护线程.mp4│ │ 04 守护线程的注意事项.mp4│ │ 05 线程组的基本使用.mp4│ │ 06 线程组的异常处理.mp4│ │ 07 yield方法的作用.mp4│ │ 08 join方法的使用.mp4│ │ 09 join方法的Java源码.mp4│ │ 10 join方法的JVM源码.mp4│ │ │ ├─04 线程的状态│ │ 01 线程的六种状态.mp4│ │ 02 线程状态的代码演示.mp4│ │ │ └─05 线程同步│ 01 多线程操作共享资源的安全问题.mp4│ 02 使用synchronized对象锁解决线程安全问题.mp4│ 03 线程的BLOCKED状态.mp4│ 04 对象锁和类锁.mp4│ 05 Lock框架之ReentrantLock.mp4│ 06 可重入锁ReentrantLock的锁定原理.mp4│ 07 可重入锁ReentrantLock之公平锁.mp4│ 08 对象条件1.mp4│ 09 对象条件2.mp4│ 10 条件对象的注意事项.mp4│ 11 等待唤醒机制的基本概念.mp4│ 12 等待唤醒的标准格式.mp4│ 13 死锁出现的原因和解决办法.mp4│ 14 锁与条件对象的核心.mp4│ 15 TheadLocal的基本概念.mp4│ 16 ThreadLocal的工作原理.mp4│ 17 ThreadLocal的注意事项.mp4│ 18 【总结】线程基础.mp4│ 19 【总结】线程同步.mp4│ ├─02 第二章 原子操作(资料在本章)│ ├─00 资料│ │ 【课程资料】Java并发编程原理精讲.exe│ │ │ └─01 原子操作│ 01 原子操作的基本概念.mp4│ 02 原子操作的实现原理.mp4│ 03 演示非原子操作的效果及解决方案.mp4│ 04 AtomicInteger的原子操作.mp4│ 05 AtomicIntegerArray的原子操作.mp4│ 06 AtomicReferenceArray的原子操作.mp4│ 07 AtomicReference的原子操作.mp4│ 08 使用AtomicStampedReference演示ABA问题.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值