摸鱼时间,画个吃豆人玩一下

news2025/1/17 22:01:56

Ⅰ . 吃豆人小游戏

在这里插入图片描述

  1. Canvas API(画布)是在 HTML5 中新增的标签用于在网页实时生成图像;
  2. 是一个非常适合,做一些有趣的小游戏 和 动画;
  3. 下面我们来简单的写一下 这个小例子 👇

    文章目录

        • Ⅰ . 吃豆人小游戏
        • Ⅱ. 实现步骤
            • ① 让吃豆人嘴巴,动起来
            • ③ 监听 上下左右 让吃豆人动起来
            • ② 绘制随机出现的糖豆
            • ④ 添加积分器
        • Ⅱ. 整合最终代码

    在这里插入图片描述

Ⅱ. 实现步骤

① 让吃豆人嘴巴,动起来
  1. 先画一个扇形 , 然后让扇形有一个的开口
<body>
    <canvas id="cvs" width="1000" height="500"></canvas>
</body>
<script>
	const canvas = document.getElementById("cvs");
    const ctx = canvas.getContext('2d');
    let x = 500, y = 200; // 扇形的初始位置
    let start = Math.PI*1.95, end = Math.PI*0.1;  //扇形的开口弧度
    
    draw()
    function draw(){
		ctx.clearRect(0,0,1000,500);
        ctx.beginPath(); 
        ctx.fillStyle = "orange";
        ctx.arc(x,y,50,start,end,0);
        ctx.lineTo(x,y);
        ctx.fill();
        ctx.stroke();
	}
</script>
  1. 然后我们需要,吧吃豆人的嘴动起来
  2. 这时我们就要用到定时器 setInterval,每改变 嘴(扇形弧度), 重新绘制一遍

请添加图片描述

<body>
    <canvas id="cvs" width="1000" height="500"></canvas>
</body>
<script>
	const canvas = document.getElementById("cvs");
    const ctx = canvas.getContext('2d');
    let x = 500, y = 200; // 扇形的初始位置
    let start = Math.PI*1.95, end = Math.PI*0.1;  //扇形的开口弧度
    let isMax = true; // 弧度是否张开最大
    let num = 0; // 弧度改变的次数 
    
   
   setInterval(()=>{ setAngle();  draw(); },30);
  
    function setAngle() { // 修改圆的开口
      angle = isMax ? Math.PI*0.01:(-Math.PI*0.01) 
      start = start - angle 
      end   = end + angle 
      num++;
      if(num==10){
        isMax=!isMax;
        num = 0
      }
    }
    function draw(){ // 绘制圆
		ctx.clearRect(0,0,1000,500);
        ctx.beginPath(); 
        ctx.fillStyle = "orange";
        ctx.arc(x,y,50,start,end,0);
        ctx.lineTo(x,y);
        ctx.fill();
        ctx.stroke();
	}
</script>
③ 监听 上下左右 让吃豆人动起来
  1. 我们先要找到 上下左右按键 对应的 keyCode 分别是 37~39;
  2. 针对每个反向 改变下 “嘴” 的方向 [修改弧度];
  3. 在走到区域的末端,在反方向重新出现 👇
 // ....... 省略之前代码
  document.onkeydown = function(e){
     switch(e.keyCode){
         case 37: start = Math.PI*0.8,  end = Math.PI*1.1;  move('←');   reset();  break;
         case 38: start = Math.PI*1.45, end = Math.PI*1.7;  move('↑');   reset();  break;
         case 39: start = Math.PI*1.95, end = Math.PI*0.1;  move('→');   reset();  break;
         case 40: start = Math.PI*0.4,  end = Math.PI*0.7;  move('↓');   reset();  break;
     }
  }
 function move(direction){
	switch(direction){
        case '←': x-=5; draw();   break;
        case '↑': y-=5; draw();   break;
        case '→': x+=5; draw();   break;
        case '↓': y+=5; draw();   break;
   }
 }
 function  reset(){
    if(x > 1050) { x = 0; }
    if(x < 0) { x = 1050; }
    if(y > 550) { y =0;  }
    if(y < 0) { y =550; }
}
 // ....... 省略之前代码
② 绘制随机出现的糖豆
  1. 设置 糖豆初始位置 ,通过 Math.random() 随机出现;
  2. 当糖豆在,移动的吃豆人的范围类的时候(40px) ,就初始化 糖豆;
  3. 在每次绘制 吃豆人之后 ,确认之间的距离是否在范围里 👇
    请添加图片描述
let t_x = Math.round(Math.random() * 900) ,t_y = Math.round(Math.random() * 450);

function draw() {
    // ...省略之前代码
    t_draw()
}
function t_draw(){
	ctx.beginPath();
    ctx.arc(t_x,t_y,10,0,Math.PI*2,0); 
    ctx.stroke();
    if(
        t_x > x - 40 
    	&& t_x < x + 40 
    	&& t_y > y - 40 
    	&& t_y < y + 40 
    ){
       t_x=Math.round(Math.random()*900);
       t_y=Math.round(Math.random()*450);
       t_draw()
    }
}
④ 添加积分器
  1. 在每次糖豆被吃掉时 (糖豆位置初始化时), 增加分数
  2. 绘制一个记录分数的盒子 👇
    请添加图片描述
<style>
.box{
      width: 150px;
      height: 60px;
      background-color: yellow;
      font-size: 20px;
      text-align: center;
      line-height: 60px;
      border: 2px solid coral;
      border-radius: 20px;
      position: relative;
      top: -500px;
      left: 840px;
 }
</style>
<body>
    <div class="box">分数为:<span id="score">0</span></div>
</body>
<script>
// ...省略其他代码
 addScore() { //重新改变糖豆位置时执行
   const score = document.getElementById('score')
   score.innerHTML  = Number(score.innerHTML) + 5  
 }	
</script>

Ⅱ. 整合最终代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<style>
    #cvs {
        background-color: paleturquoise;
    }
    .box {
        width: 150px;
        height: 60px;
        color: chocolate;
        background-color: yellow;
        font-size: 20px;
        text-align: center;
        line-height: 60px;
        border: 2px solid coral;
        border-radius: 20px;
        position: relative;
        top: -500px;
        left: 840px;
    }
</style>

<body>
    <canvas id="cvs" width="1000" height="500"></canvas>
    <div class="box">分数为:<span id="score">0</span></div>
</body>
<script>
    const canvas = document.getElementById("cvs");
    const ctx = canvas.getContext('2d');
    let start = Math.PI * 1.95, end = Math.PI * 0.1;
    let x = 100, y = 200;
    let t_x = Math.round(Math.random() * 900);
    let t_y = Math.round(Math.random() * 450);
    let isMax = true;
    let num = 0;

    setInterval(setAngle, 30);
    
    document.onkeydown = function (e) {
        switch (e.keyCode) {
            case 37: start = Math.PI * 0.8, end = Math.PI * 1.1; move('←'); reset(); break;
            case 38: start = Math.PI * 1.45, end = Math.PI * 1.7; move('↑'); reset(); break;
            case 39: start = Math.PI * 1.95, end = Math.PI * 0.1; move('→'); reset(); break;
            case 40: start = Math.PI * 0.4, end = Math.PI * 0.7; move('↓'); reset(); break;
        }
    }
    function move(direction) {
        switch (direction) {
            case '←': x -= 5; draw(); break;
            case '↑': y -= 5; draw(); break;
            case '→': x += 5; draw(); break;
            case '↓': y += 5; draw(); break;
        }
    }
    function setAngle() {
        angle = isMax ? Math.PI * 0.01 : (-Math.PI * 0.01)
        start = start - angle
        end = end + angle
        num++;
        if (num == 10) {
            isMax = !isMax;
            num = 0
        }
        draw();
    }
    function draw() {
        ctx.clearRect(0, 0, 1000, 500);
        ctx.beginPath();
        ctx.fillStyle = "orange";
        ctx.arc(x, y, 50, end, start, 0);
        ctx.lineTo(x, y);
        ctx.fill();
        ctx.stroke();
        t_draw();
    }
    function t_draw() {
        ctx.beginPath();
        ctx.arc(t_x, t_y, 10, 0, Math.PI * 2, 0);
        ctx.stroke();
        if (
            t_x > x - 40
            && t_x < x + 40
            && t_y > y - 40
            && t_y < y + 40
        ) {
            t_x = Math.round(Math.random() * 900);
            t_y = Math.round(Math.random() * 450);
            t_draw()
            addScore()
        }
    }
    function addScore() { //重新改变糖豆位置时执行
        const score = document.getElementById('score')
        score.innerHTML = Number(score.innerHTML) + 5
    }
    function reset() {
        if (x > 1050) {
            x = 0
        }
        if (x < 0) {
            x = 1050
        }
        if (y > 550) {
            y = 0;
        }
        if (y < 0) {
            y = 550;
        }
    }
</script>
</html>

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

学习嵌入式必读十本书,从C语言到ARM

学习嵌入式必读的十本书籍&#xff0c;按照C语言、数据结构、Linux、C、QT、单片机、ARM的顺序给大家推荐。 01 C语言 凡是计算机、电子、通信、自动化、机械专业的同学&#xff0c;大一的时候必学C语言&#xff0c;而且大部分高校选择的教材都是谭浩强。这本书在网上的评价褒…

【计算机程序设计思想与方法】2 什么是计算思维?

1.2 什么是计算思维? 如《【计算机程序设计思想与方法】1 什么是计算?》中所述,计算是利用计算机一步一步地执行指令来解决问题的过程,计算机科学是关于计算的科学。 正如数学家在证明数学定理时,有独特的数学思维。工程师在设计制造产品时,有独特的工程思维。艺术家在…

【验证码逆向专栏】某验“初代”滑块验证码逆向分析

声明 本文章中所有内容仅供学习交流&#xff0c;抓包内容、敏感网址、数据接口均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff0c;若有侵权&#xff0c;请联系我立即删除&#xff01; 本文章未经许可禁止转载…

【算法】递归

目录1.递归概述2.何时使用递归2.1.定义是递归的2.2.数据结构是递归的2.3.问题的求解方法是递归的3.递归模型4.应用本文参考&#xff1a; 《数据结构教程》第 5 版 李春葆 主编 1.递归概述 &#xff08;1&#xff09;在定义一个过程或函数时&#xff0c;出现直接或者间接调用自…

【微服务】Elasticsearch文档索引库操作(二)

&#x1f697;Es学习第二站~ &#x1f6a9;Es学习起始站&#xff1a;【微服务】Elasticsearch概述&环境搭建(一) &#x1f6a9;本文已收录至专栏&#xff1a;微服务探索之旅 &#x1f44d;希望您能有所收获 一.索引库操作 索引库就类似数据库表&#xff0c;mapping映射就类…

DGIOT低代码场景部门的搭建过程

[小 迪 导读] : 通过低代码页面与konva 大屏的页面设计,围绕部门&#xff0c;实现应用场景快速搭建1.部门创建以及权限分配1.1 打开部门管理页面1.2新增部门1.3 权限分配&#xff0c;点击刚创建的部门&#xff0c;在菜单分配中选择总控台和设备管理(低代码平台会过滤掉非低代码…

Wandb:make visualization better than Tensorboard

Wandb&#xff1a;make visualization better than Tensorboard wandb :一个在线的可多人协作的多功能可视化工具包 我最开始使用的tensorboard&#xff0c;还写了一些相关tensorboard的脚本用于实验。tensorboard这里就不详细介绍了&#xff0c;相信大家都比较了解。直到尝试了…

【MySQL数据库入门】:表的约束

表的约束 真正约束字段的是数据类型&#xff0c;但是数据类型约束很单一&#xff0c;需要有一些额外的约束&#xff0c;更好的保证数据的合法性&#xff0c;从业务 逻辑角度保证数据的正确性。比如有一个字段是email&#xff0c;要求是唯一的。 表的约束很多&#xff0c;这里主…

版本管理之Git

一.版本控制器的方式1.1集中式版本控制工具集中式版本控制工具&#xff0c;版本库是集中存放在中央服务器的&#xff0c;team里每个人work时从中央服务器下载代 码&#xff0c;是必须联网才能工作&#xff0c;局域网或互联网。个人修改后然后提交到中央版本库。 举例&#xff1…

巧用回调函数解决微信小程序与后台数据交互出现的异步问题

问题描述 微信小程序端需要发送一个包含文字与图片的表单数据给后端&#xff0c;我一开始的思路是先上传图片得到临时的URL&#xff0c;后执行POST请求将表单数据发送给后端&#xff0c;但后端只能获取到文字&#xff0c;而图片URL却始终获取不到。 问题原因 注意看我上面的思路…

目标检测研究

传统的目标检测流水线 1.候选区域生成 通过滑动窗口选择感兴趣区域Rol;使用多尺寸的输入图像和多尺度的滑动窗口识别多尺度和不同比例的目标。 ⒉特征向量抽取 常用SIFT、 Harr、HOG、SURF。 3.区域分类 常用支持向量机。 结合集成、串联学习、梯度…

3D俯视角色割草游戏模板+视频教程,免费发布 | 一周精品推荐

大家好&#xff0c;我是晓衡。新年开工第一周&#xff0c;我就被热心的开发者们感动得热泪盈眶&#xff01;今天我冒死推荐几款 Creator 游戏开发资源&#xff0c;希望能对得起这些开发者们&#xff0c;同时也希望你能也有所收获。3D俯视角割草游戏视频源码B 站 UP 主『好巧啊c…

MyBatis 数据查询语句中有关于大于,小于的书写方法 及 查询时相关sql 关键字

前言 提示&#xff1a;这里记录的大概内容&#xff1a; MyBatis 数据查询语句中有关于大于&#xff0c;小于的书写方法 一、MyBatis MyBatis 本是 apache 的一个开源项目 iBatis, 2010 年这个项目由 apache software foundation 迁移到了 google code&#xff0c;并且改名为…

Python封装、继承和多态

Python 语言在设计之初&#xff0c;就定位为一门面向对象的编程语言&#xff0c;“Python 中一切皆对象”。同时&#xff0c;Python 也支持面向对象的三大特征&#xff1a;封装、继承和多态。 一、封装 封装&#xff08;Encapsulation&#xff09;&#xff0c;即在设计类时&am…

讲师邀请 | 在 DevData Talks,开放务实地聊聊研发效能!

什么是 DevData Talks&#xff1f; DevData Talks 是专注于研发效能实践经验与方法论的系列分享活动。 2022 年&#xff0c;我们既看到外部环境变幻莫测&#xff0c;也看到研发效能领域沉下心来稳步发展&#xff0c;从宏大的概念和价值&#xff0c;转向具体的问题&#xff0c…

若依框架代码自动生成器研究-表查询篇

最近生产环境用了一个开源系统&#xff1a;若依&#xff0c;其中有一个版块很有意思&#xff0c;很能提高生产效率: “代码生成器”。 其功能所处模块菜单为&#xff1a;系统工具->代码生成。我们来研究一下他的代码生成逻辑。 工具使用方法 1、建表 使用代码生成&#…

Python列表中你所不知道的事

1. 引言 目前&#xff0c;Python是世界上使用最广泛、最受欢迎的编程语言之一。Python丰富的功能性使它非常流行&#xff0c;因为我们可以使用它创建任何内容。我将在本博客中与大家分享关于Python列表的几条有趣的花絮。 闲话少说&#xff0c;我们直接开始吧&#xff01; 2.…

如何高薪入职心仪的公司

序 本文首发自&#xff1a;稀土掘金、思否 我们从几个问题开始入手&#xff0c;来看一下本博客是否适合你&#xff1a; 如果你想要换工作&#xff0c;但是&#xff1a;制作的简历平平无奇如果你想要换工作&#xff0c;但是&#xff1a;投放了的简历总是无法得到 [心仪公司] 的…

SpringBoot+Vue茶叶商城系统

简介&#xff1a;本项目采用了基本的SpringBootVue设计的茶叶商城系统。详情请看主要截图。经测试&#xff0c;本项目正常运行。本项目适用于Java毕业设计、课程设计学习参考等用途。 项目描述 项目名称SpringBootVue茶叶商城系统源码作者LHL项目类型Java EE项目 &#xff08;…

C#windows彩票信息管理

摘要&#xff1a;近年来&#xff0c;中国彩票行业已经进入市场急速扩张和加速上升的阶段&#xff0c;即开票占整个彩票销量的比率也将急剧上扬。自助售彩终端&#xff0c;这一崭新的售彩模式已被中国彩民接受&#xff0c;爆发点很快来临。到2020年&#xff0c;我国多功能彩票自…