使用HTML实现贪吃蛇游戏

news2024/12/28 20:37:41
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>贪吃蛇游戏</title>
    <style>
        canvas {
            display: block;
            margin: 20px auto;
            border: 1px solid #000;
        }
    </style>
</head>
<body>
    <canvas id="gameCanvas" width="400" height="400"></canvas>
    <script>
        const canvas = document.getElementById('gameCanvas');
        const ctx = canvas.getContext('2d');
        const boxSize = 20;
        let snake = [{x: 10, y: 10}];
        let food = {x: 15, y: 15};
        let dx = 0, dy = 0;

        function draw() {
            ctx.clearRect(0, 0, canvas.width, canvas.height);
            drawSnake();
            drawFood();
        }

        function drawSnake() {
            snake.forEach(segment => {
                ctx.fillStyle = 'green';
                ctx.fillRect(segment.x * boxSize, segment.y * boxSize, boxSize, boxSize);
            });
        }

        function drawFood() {
            ctx.fillStyle = 'red';
            ctx.fillRect(food.x * boxSize, food.y * boxSize, boxSize, boxSize);
        }

        function update() {
            const head = {x: snake[0].x + dx, y: snake[0].y + dy};
            snake.unshift(head);
            if (head.x === food.x && head.y === food.y) {
                food = {x: Math.floor(Math.random() * (canvas.width / boxSize)), y: Math.floor(Math.random() * (canvas.height / boxSize))};
            } else {
                snake.pop();
            }
        }

        function checkCollision() {
            const head = snake[0];
            if (head.x < 0 || head.x >= canvas.width / boxSize || head.y < 0 || head.y >= canvas.height / boxSize) {
                return true;
            }
            for (let i = 1; i < snake.length; i++) {
                if (head.x === snake[i].x && head.y === snake[i].y) {
                    return true;
                }
            }
            return false;
        }

        function gameLoop() {
            if (checkCollision()) {
                alert('游戏结束');
                document.location.reload();
                return;
            }
            update();
            draw();
            setTimeout(gameLoop, 100);
        }

        document.addEventListener('keydown', (e) => {
            switch (e.key) {
                case 'ArrowUp':
                    if (dy === 0) { dx = 0; dy = -1; }
                    break;
                case 'ArrowDown':
                    if (dy === 0) { dx = 0; dy = 1; }
                    break;
                case 'ArrowLeft':
                    if (dx === 0) { dx = -1; dy = 0; }
                    break;
                case 'ArrowRight':
                    if (dx === 0) { dx = 1; dy = 0; }
                    break;
            }
        });

        gameLoop();
    </script>
</body>
</html>

        上述代码实现了一个基本的贪吃蛇游戏,包括蛇的移动、食物的生成、碰撞检测和游戏循环。你可以通过方向键来控制蛇的移动。游戏会在蛇撞到墙壁或自身时结束,并提示“游戏结束”。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2076527.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【题解】【模拟】—— [CSP-J 2021] 小熊的果篮

【题解】【模拟】—— [CSP-J 2021] 小熊的果篮 [CSP-J 2021] 小熊的果篮题目描述输入格式输出格式输入输出样例输入 #1输出 #1输入 #2输出 #2输入 #3输出 #3 提示 思路1.数组模拟&#xff08;70分&#xff09;1.1.题意解析1.2.参考代码 思路2.双向链表模拟&#xff08;60分&am…

FastCGI简述

FastCGI (FCGI) 是一种协议&#xff0c;用于改善 Web 服务器和应用程序之间的通信效率。它是在 CGI&#xff08;Common Gateway Interface&#xff09;的基础上发展起来的&#xff0c;旨在解决 CGI 在处理大量并发请求时存在的性能问题。 CGI的由来 最早的Web服务器只能简单地…

Java入门:06.Java中的方法--扩展(值传递和址传递与主方法传参)

1 值传递和址传递 值传递 方法调用时&#xff0c;如果传递的实际参数是一个基本类型的数据&#xff0c;那么如果只有形式参数发生改变的话&#xff0c;实参是不会发生变化的&#xff0c;因为我们传递的是变量中具体的数据。 main(){int i 10 ;t1(i) ; //值传递System.out.p…

Nacos源码分析

Nacos源码分析 1.下载Nacos源码并运行 要研究Nacos源码自然不能用打包好的Nacos服务端jar包来运行&#xff0c;需要下载源码自己编译来运行。 1.1.下载Nacos源码 Nacos的GitHub地址&#xff1a;https://github.com/alibaba/nacos 如果需要研究其他版本的&#xff0c;也可以…

自动化代码报错:ElementClickInterceptedException 解决方案

在自动化测试中&#xff0c;如果有多个弹窗出现&#xff0c;代码执行可能会遇到ElementClickInterceptedException的错误&#xff0c;表明元素点击被拦截&#xff1a; 一般由于以下原因&#xff1a; 一、页面加载未完成 在页面尚未完全加载完成时尝试点击某个元素&#xff0c…

Vue3基础1

1、optionsApi 与 Composition Api 选项式与组合式 组合就是一个一个 的函数 &#xff0c;每个函数里都有 data&#xff0c;methods&#xff0c;compute 等等 2、拉开序幕的setup setup执行时机 在 beforeCreate之前 <template><div class"person">&l…

Qt:玩转QPainter序列四补充(裁剪家族)

前言 本文补充上篇缺失的裁剪家族。 正文 9.裁剪家族 QRegion clipRegion() const; 功能&#xff1a;返回当前的剪裁区域 (clip region)。剪裁区域限制了绘制操作的范围&#xff0c;只有在剪裁区域内的部分才会被绘制。返回值&#xff1a;一个 QRegion 对象&#xff0c;表…

【c语法】##__VA_ARGS__与__VA_ARGS__

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 文章目录 引言__VA_ARGS__ 引言 在调试过程中&#xff0c;我们经常会自定义打印&#xff0c;比如日志信息的输出&#xff0c;这时就会用VA_ARGS,接下来详细讲解&#xff01; VA_ARGS __VA_ARGS__是C语言设定…

数据展现新方式,Excel子弹图制作全攻略!

在做数据汇报时&#xff0c;如何让你的报告脱颖而出&#xff0c;瞬间吸引老板和同事的注意力&#xff1f;答案就是子弹图&#xff01;今天&#xff0c;我们就来教你如何利用Excel这个强大的工具&#xff0c;轻松制作出专业又美观的子弹图&#xff0c;不论你是数据小白还是职场老…

sqli-labs靶场通关攻略(31-35关)

第31关&#xff08; ") 闭合&#xff09; 查数据库 ?id") union select 1,2,database() -- 查表 ?id") union select 1,2,group_concat(table_name) from information_schema.tables where table_schemasecurity-- 查列 ?id") union select 1,2,gro…

量化交易backtrader实践(四)_评价统计篇(2)_评价输出

上节回顾 上一节我们对backtrader内置的一堆评价指标进行了实践&#xff0c;从视觉上对这些评价指标的输出参数有了个大概的了解。接下来&#xff0c;我们在循环对多支股票或多个策略进行回测的时候&#xff0c;就可以将评价的一些值进行输出了&#xff0c;这样就能对于股票和…

建筑企业如何搭建数据仓库?做好这三步,大幅节约企业成本!

在当今这个数据驱动的时代&#xff0c;建筑企业正面临着前所未有的挑战和机遇。随着项目规模的扩大和市场环境的复杂化&#xff0c;如何有效管理和分析海量数据&#xff0c;已经成为提升企业竞争力的关键。数据仓库作为企业数据管理的核心&#xff0c;不仅能够整合分散的数据资…

攻防世界 reverse_re3

前言&#xff1a;做题笔记。 下载解压 查壳。 64ida 打开 查找字符并跟进 wasd一看&#xff0c;这题就是关于迷宫的题。跟进看看。 懵。。。不过还是得仔细看看。 观察发现。 进去看看。 然后最开始&#xff0c;因为数据太多把我卡住了。。。 回过头仔细看看。 猜测dword_202…

企业建站技术路线探索

前言 企业站是指企业或公司创建的官方网站&#xff0c;用于展示企业信息、产品和服务。它通常包括公司简介、产品或服务介绍、联系方式、新闻更新等内容。企业站的目的是提升品牌形象、提供客户服务和促进业务发展。在跨境贸易中&#xff0c;企业建站尤为关键&#xff0c;因为…

数据库集群技术

源码安装mysql mysql.com [https://downloads.mysql.com/archives/community/]: 官网下载 安装依赖性&#xff1a; [rootmysql-node2 ~]# dnf install cmake gcc-c openssl-devel \ ncurses-devel.x86_64 libtirpc-devel-1.3.3-8.el9_4.x86_64.rpm rpcgen.x86_64 下载并解压源…

Netty系列-1 NioEventLoopGroup和NioEventLoop介绍

背景 从本文开始开启一个新的专题Netty系列&#xff0c;用于收集Netty相关的文章&#xff0c;内容包含Netty的使用方式、运行原理等。 基于io.netty:netty-all:4.1.49.Final版本进行介绍 1.NioEventLoopGroup 介绍NioEventLoopGroup之前&#xff0c;有几个相关的组件需要提前…

idea导入maven项目(别人的项目)爆红

作为一个经常学习交流的人&#xff0c;或者工作需要&#xff0c;我们都或多或少会把别人写好的代码拷贝过来学习或编辑&#xff0c;大多数时候都是把整个项目拿过来;但是往往把代码拿到之后放在自己电脑用 idea 打开的时候就会出现 pom.xml 文件红线报错&#xff0c;然后倒入的…

大模型企业应用落地系列》基于大模型的对话式推荐系统》技术架构设计全攻略

注&#xff1a;此文章内容均节选自充电了么创始人&#xff0c;CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》&#xff08;人工智能科学与技术丛书&#xff09;【陈敬雷编著】【清华大学出版社】 文章目录 大模型企业应用落地系列全貌基于大模型的对话式推荐系统》技术架…

如何使用ssm实现投稿系统+vue

TOC ssm231论文投稿系统vue 系统概述 1.1 研究背景 如今互联网高速发展&#xff0c;网络遍布全球&#xff0c;通过互联网发布的消息能快而方便的传播到世界每个角落&#xff0c;并且互联网上能传播的信息也很广&#xff0c;比如文字、图片、声音、视频等。从而&#xff0c;…

软件测试 | 概念(1)

目录 前言 需求的概念 开发模型 软件的生命周期 常见开发模型 瀑布模型 螺旋模型 增量模型&#xff0c;迭代模型 敏捷模型 Scrum模型 测试模型 V模型 W模型&#xff08;双V模型&#xff09; 前言 测试&#xff1a;验证软件的特性是否满足用户的需求。 用户的需求…