php中文网 | cnphp.com

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 764|回复: 0

(完整源码)H5贪吃蛇小游戏——HTML+CSS+JavaScript实现

[复制链接]

3150

主题

3160

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

UID
1
威望
0
积分
7976
贡献
0
注册时间
2021-4-14
最后登录
2024-11-24
在线时间
763 小时
QQ
发表于 2022-1-21 20:21:25 | 显示全部楼层 |阅读模式
最近因为帮助大一的学妹做网页,又接触了一下前端方面的知识。(学妹已经成了女朋友!!!,嘻嘻)感谢自己当年认真学习,大三了好多东西还能拾起来,哈哈。我翻出了我当年写的代码,还真不少呢。今天复习复习,看一看那时候写的一个贪吃蛇的代码。当时用了一整天,跟着今日头条上推送给我的一个视频一点一点手敲的…… 两年半了,我记得这么清楚,是因为写这个太痛苦了,记忆犹新啊!!!大一手敲着不知道为什么的代码,一遍一遍的报错,一遍一遍的改错误……

现在感觉起来,装好插件的VS code配合上Chrome调试,真的是爽到爆啊。当时太年轻,不知道这么先进的工具,可能有人会说Sublime Text更好用,我承认,我选择VS code 仅仅因为是插件安装方便。

大概看了看这个贪吃蛇的代码,主要用了HTML5中的canvas(画布)实现游戏界面,蛇的控制逻辑用JavaScript。定时调用函数使得蛇动起来。代码简单易懂,分享出来,供初学者参考学习。省的手敲代码,遇到各种错误,学习的热情被各种八阿哥拒之门外,先让程序跑起来,带有兴趣的研究代码,效率应该更高吧。(个人观点,纯属扯淡)话不多说,直接上代码:

HTML页面内容:
[mw_shl_code=applescript,true]<!DOCTYPE html>
<html>
<head>
        <title>贪吃蛇</title>
        <meta charset="UTF-8">
        <meta name="keywords" content="贪吃蛇">
        <meta name="Description" content="这是一个初学者用来学习的小游戏">
        <style type="text/css">
        *{margin:0;}
        .map{margin:100px auto;
                height:600px;
                width:900px;
                background:#00D0FF;
                border:10px solid #AFAEB2;
                border-radius:8px;
        }
        </style>



</head>

<body>
<div class="map">
<canvas id="canvas" height="600" width="900">
       
</canvas>
</div>

<script src="javascript/snake.js">

</script>
</body>
</html>[/mw_shl_code]
javascript代码:

[mw_shl_code=applescript,true]
        //获取绘制工具
        /*
        var canvas = document.getElementById("canvas");
        var ctx = canvas.getContext("2d");//获取上下文
        ctx.moveTo(0,0);
        ctx.lineTo(450,450);*/
        var c=document.getElementById("canvas");
    var ctx=c.getContext("2d");
    /*ctx.beginPath();
    ctx.moveTo(0,0);
    ctx.lineTo(450,450);
    ctx.stroke();
    */

    var snake =[];//定义一条蛇,画蛇的身体
    var snakeCount = 6;//初始化蛇的长度
        var foodx =0;
        var foody =0;
    var togo =0;
    function drawtable()//画地图的函数
    {


            for(var i=0;i<60;i++)//画竖线
            {
                    ctx.strokeStyle="black";
                    ctx.beginPath();
                    ctx.moveTo(15*i,0);
                    ctx.lineTo(15*i,600);
                    ctx.closePath();
                    ctx.stroke();
            }
        for(var j=0;j<40;j++)//画横线
            {
                    ctx.strokeStyle="black";
                    ctx.beginPath();
                    ctx.moveTo(0,15*j);
                    ctx.lineTo(900,15*j);
                    ctx.closePath();
                    ctx.stroke();
            }
           
            for(var k=0;k<snakeCount;k++)//画蛇的身体
                        {
                        ctx.fillStyle="#000";
                        if (k==snakeCount-1)
                        {
                                ctx.fillStyle="red";//蛇头的颜色与身体区分开
                        }
                        ctx.fillRect(snake[k].x,snake[k].y,15,15);//前两个数是矩形的起始坐标,后两个数是矩形的长宽。
                       
                        }
                        //绘制食物       
                    ctx.fillStyle ="black";
             ctx.fillRect(foodx,foody,15,15);
             ctx.fill();
           
    }

   
    function start()//定义蛇的坐标
    {
            //var snake =[];//定义一条蛇,画蛇的身体
        //var snakeCount = 6;//初始化蛇的长度
               
                for(var k=0;k<snakeCount;k++)
                    {
                            snake[k]={x:k*15,y:0};
                           
            }
                       
                  drawtable();
          addfood();//在start中调用添加食物函数

    }

    function addfood()
        {
        foodx = Math.floor(Math.random()*60)*15; //随机产生一个0-1之间的数
        foody = Math.floor(Math.random()*40)*15;
               
                for (var k=0;k<snake;k++)
                {
                        if (foodx==snake[k].x&&foody==sanke[k].y)//防止产生的随机食物落在蛇身上
                        {       
                        addfood();
                        }
                }
       
       
        }       
                   
   function move()
   {
        switch (togo)
        {
        case 1: snake.push({x:snake[snakeCount-1].x-15,y:snake[snakeCount-1].y}); break;//向左走
        case 2: snake.push({x:snake[snakeCount-1].x,y:snake[snakeCount-1].y-15}); break;
        case 3: snake.push({x:snake[snakeCount-1].x+15,y:snake[snakeCount-1].y}); break;
        case 4: snake.push({x:snake[snakeCount-1].x,y:snake[snakeCount-1].y+15}); break;
        case 5: snake.push({x:snake[snakeCount-1].x-15,y:snake[snakeCount-1].y-15}); break;
        case 6: snake.push({x:snake[snakeCount-1].x+15,y:snake[snakeCount-1].y+15}); break;
        default: snake.push({x:snake[snakeCount-1].x+15,y:snake[snakeCount-1].y});
        }
    snake.shift();//删除数组第一个元素
           ctx.clearRect(0,0,900,600);//清除画布重新绘制
           isEat();
        isDead();
        drawtable();
   }                        
   
   function keydown(e)
   {
   switch(e.keyCode)
                {
         case 37: togo=1; break;
                 case 38: togo=2; break;
                 case 39: togo=3; break;
                 case 40: togo=4; break;
                 case 65: togo=5; break;
                 case 68: togo=6; break;
                }
   }
   
   function isEat()//吃到食物后长度加1
   {
    if(snake[snakeCount-1].x==foodx&&snake[snakeCount-1].y==foody)
   {
                addfood();
                snakeCount++;
                snake.unshift({x:-15,y:-15});
   }
   
   }
   
   function isDead()
   {
    if (snake[snakeCount-1].x>885||snake[snakeCount-1].y>585||snake[snakeCount-1].x<0||snake[snakeCount-1].y<0)
                {
                alert("You are dead,GAME OVER!!!");
                window.location.reload();
                }
   }
   
    document.onkeydown=function(e)
{
        keydown(e);

}
window.onload = function()//调用函数
{
        start();
        setInterval(move,150);
        drawtable();
       
       

}
           
[/mw_shl_code]
下面是程序运行截图:

image.png
image.png





上一篇:[JavaScript]解构赋值详解
下一篇:纯HTML CSS制作导航栏 下拉菜单
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|php中文网 | cnphp.com ( 赣ICP备2021002321号-2 )

GMT+8, 2024-11-24 18:21 , Processed in 0.354829 second(s), 36 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

申明:本站所有资源皆搜集自网络,相关版权归版权持有人所有,如有侵权,请电邮(fiorkn@foxmail.com)告之,本站会尽快删除。

快速回复 返回顶部 返回列表