六一,用前端做个小游戏回味童年

news2024/12/28 20:27:26

#【六·一】让代码创造童话,共建快乐世界#

文章目录

  • 📋前言
  • 🎯简简单单的弹球游戏
  • 🎯代码实现
  • 📝最后


在这里插入图片描述

📋前言

六一儿童节。这是属于孩子们的节日,也是属于我们大人的节日(过期儿童)。在这个六一儿童节,一起「致童真」,用你手上的代码创造出童话王国,让这个世界多一份快乐和惊喜! 趁着六一儿童节CSDN的创作活动,接下来通过前端做个小游戏回味童年。


🎯简简单单的弹球游戏

弹球游戏是一款很经典的游戏了,小时候无论是在掌机还是电脑都有玩过这款游戏,简简单单朴实无华,接下来我们通过前端代码来简单实现一下这个游戏吧。
在这里插入图片描述
这是一个基于 HTML5 Canvas 的弹球游戏的实现,通过 JavaScript 语言实现游戏的核心逻辑。主要包括以下部分:

  • 定义了 canvas 元素并获取其上下文对象,用于在画布上绘制图形。
  • 定义了小球(ball)、挡板(paddle)和砖块(bricks)的属性,包括位置、大小、颜色、运动方向和速度等。
  • 初始化砖块数组,用于存储所有的砖块,并设置每个砖块的位置和状态(其中,状态为1表示砖块未被撞击,状态为0表示砖块已经被撞击)。
  • 定义键盘事件处理函数,实现挡板的左右移动。
  • 定义 move() 函数,用于更新小球和挡板的位置和状态,并检测边界碰撞和砖块与小球的碰撞,以及游戏结束和胜利的条件。
  • 定义 draw() 函数,用于在画布上绘制小球、挡板、砖块和分数。
  • 最后使用 setInterval() 函数调用 move() 和 draw() 函数,让游戏运行起来。

总的来说,通过前端代码实现了一个简单的弹球游戏,并且同时也涉及到了很多 JavaScript 和 HTML5 Canvas 的基本用法。主要的核心逻辑是对游戏元素的状态更新和游戏规则判断,以及绘制游戏图形的相关代码实现。


🎯代码实现

接下来我们通过实际代码要展示这款小游戏。

<!DOCTYPE html>
<html>

<head>
	<meta charset="UTF-8">
	<title>弹球游戏</title>
	<style type="text/css">
		body {
			margin: 0;
			padding: 0;
		}

		canvas {
			display: block;
			margin: 20px auto;
			border: 1px solid #ccc;
		}
	</style>
</head>

<body>
	<canvas id="canvas" width="600" height="400"></canvas>
</body>
<script type="text/javascript">
	var canvas = document.getElementById("canvas");
	var ctx = canvas.getContext("2d");

	// 定义全局变量
	var ball = {
		x: canvas.width / 2,
		y: canvas.height - 30,
		radius: 10,
		color: "#000",
		dx: 2,
		dy: -2
	};

	var paddle = {
		x: canvas.width / 2 - 50,
		y: canvas.height - 20,
		width: 100,
		height: 10,
		color: "#0095DD",
		speed: 7,
		dx: 0
	};

	var bricks = [];
	var brickRowCount = 3;
	var brickColumnCount = 5;
	var brickWidth = 75;
	var brickHeight = 20;
	var brickPadding = 10;
	var brickOffsetTop = 30;
	var brickOffsetLeft = (canvas.width - (brickWidth + brickPadding) * brickColumnCount) / 2;

	for (var c = 0; c < brickColumnCount; c++) {
		bricks[c] = [];
		for (var r = 0; r < brickRowCount; r++) {
			bricks[c][r] = {
				x: 0,
				y: 0,
				status: 1
			};
		}
	}

	var score = 0;

	// 按键事件处理
	document.addEventListener("keydown", function (event) {
		if (event.code === "ArrowLeft") {
			paddle.dx = -paddle.speed;
		} else if (event.code === "ArrowRight") {
			paddle.dx = paddle.speed;
		}
	});

	document.addEventListener("keyup", function (event) {
		if (event.code === "ArrowLeft" || event.code === "ArrowRight") {
			paddle.dx = 0;
		}
	});

	function move() {
		// 更新小球位置
		ball.x += ball.dx;
		ball.y += ball.dy;

		// 检测边界碰撞
		if (ball.x + ball.radius > canvas.width || ball.x - ball.radius < 0) {
			ball.dx = -ball.dx;
		}
		if (ball.y - ball.radius < 0) {
			ball.dy = -ball.dy;
		} else if (ball.y + ball.radius > canvas.height - paddle.height) {
			if (ball.x > paddle.x && ball.x < paddle.x + paddle.width) {
				ball.dy = -ball.dy;
			} else {
				alert("Game Over");
				document.location.reload();
				clearInterval(interval);
			}
		}

		// 更新挡板位置
		paddle.x += paddle.dx;
		if (paddle.x < 0) {
			paddle.x = 0;
		} else if (paddle.x + paddle.width > canvas.width) {
			paddle.x = canvas.width - paddle.width;
		}

		// 检测砖块和小球的碰撞
		for (var c = 0; c < brickColumnCount; c++) {
			for (var r = 0; r < brickRowCount; r++) {
				var b = bricks[c][r];
				if (b.status === 1) {
					if (ball.x > b.x && ball.x < b.x + brickWidth && ball.y > b.y && ball.y < b.y + brickHeight) {
						ball.dy = -ball.dy;
						b.status = 0;
						score++;
						if (score === brickRowCount * brickColumnCount) {
							alert("You Win!");
							document.location.reload();
							clearInterval(interval);
						}
					}
				}
			}
		}
	}

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

		// 绘制小球
		drawCircle(ball.x, ball.y, ball.radius, ball.color);

		// 绘制挡板
		drawRectangle(paddle.x, paddle.y, paddle.width, paddle.height, paddle.color);

		// 绘制砖块
		for (var c = 0; c < brickColumnCount; c++) {
			for (var r = 0; r < brickRowCount; r++) {
				if (bricks[c][r].status === 1) {
					var brickX = c * (brickWidth + brickPadding) + brickOffsetLeft;
					var brickY = r * (brickHeight + brickPadding) + brickOffsetTop;
					bricks[c][r].x = brickX;
					bricks[c][r].y = brickY;
					drawRectangle(brickX, brickY, brickWidth, brickHeight, "#0095DD");
				}
			}
		}

		// 绘制分数
		ctx.font = "16px Arial";
		ctx.fillStyle = "#000";
		ctx.fillText("Score: " + score, 8, 20);
	}

	function drawRectangle(x, y, width, height, color) {
		ctx.fillStyle = color;
		ctx.fillRect(x, y, width, height);
	}

	function drawCircle(x, y, radius, color) {
		ctx.beginPath();
		ctx.arc(x, y, radius, 0, Math.PI * 2);
		ctx.fillStyle = color;
		ctx.fill();
		ctx.closePath();
	}

	var interval = setInterval(function () {
		move();
		draw();
	}, 10);
</script>
</html>

在这里插入图片描述
一些优化建议:

  • 可以将砖块(bricks)的属性以及初始化操作封装成一个单独的构造函数或者类,以提高代码的可读性和维护性。
  • 在绘制砖块时,可以使用一个三元运算符来判断砖块的状态,避免不必要的循环。
  • 可以提取出一些常量和重复代码,如canvas的宽高、颜色等,以便后续修改和优化。
  • 可以在更新小球和挡板位置的时候,使用requestAnimationFrame方法代替setInterval/setTimeout方法,以获得更流畅的动画效果。

📝最后

最后祝大家六一快乐,一起「致童真」,用你手上的代码创造出童话王国,让这个世界多一份快乐和惊喜!
在这里插入图片描述

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

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

相关文章

chatgpt赋能python:**Python免费编辑器:提高开发效率和便捷性**

Python 免费编辑器&#xff1a;提高开发效率和便捷性 Python 编程语言已经成为了越来越多开发者的首选。这是因为 Python 语言非常直观易懂&#xff0c;同时也拥有庞大的第三方开源库&#xff0c;方便开发人员快速实现项目功能。Python 编程之所以如此受欢迎&#xff0c;除了这…

Java基础编程

Java入门 1. JDK的安装目录介绍 目录名称说明bin该路径下存放了JDK的各种工具命令。javac和java就放在这个目录。conf该路径下存放了JDK的相关配置文件。include该路径下存放了一些平台特定的头文件。jmods该路径下存放了JDK的各种模块。legal该路径下存放了JDK各模块的授权文…

使用kettle进行数据统计

1.使用kettle设计一个能生成100个取值范围为0到100随机整数的转换。 为了完成该转换&#xff0c;需要使用生成记录控件、生成随机数控件、计算器控件及字段选择控件。控件布局如下图所示 生成记录控件可以在限制框内指定生成记录的个数&#xff0c;具体配置如图所示 生成随机数…

chatgpt赋能python:Python免费教学:让编程更便捷

Python免费教学&#xff1a;让编程更便捷 Python是一门广泛应用于机器学习、数据分析、网络编程和自动化测试等领域的高级编程语言。随着人工智能和大数据分析的兴起&#xff0c;Python的应用广泛受到了各个行业的欢迎&#xff0c;越来越多的人开始学习Python。在这篇文章中&a…

STM32之任务的创建与删除

目录 1. 什么是任务&#xff1f; 2. 任务创建与删除相关函数 任务动态创建与静态创建的区别&#xff1a; xTaskCreate 函数原型 官方案例&#xff1a; vTaskDelete 函数原型 3. 实操 1. 什么是任务&#xff1f; 任务可以理解为进程 / 线程&#xff0c;创建一个任务&#…

【生物力学】《人体骨肌系统生物力学》- 王成焘老师 - 第2章 - 人体几何学测量与仿真建模

第1章回到目录第3章 文章目录 2.1 概论2.2 人体几何学测量2.2.1 人体外部几何形态2.2.2 人体尺寸测量与统计处理2.2.3 中国人体尺寸标准统计测量数据2.2.4 人体各部位比例及人体间尺寸换算2.2.5 人体活动范围测量 2.3 人体骨肌系统三维几何建模的数据来源2.3.1 冷冻切片数字摄像…

“微商城”项目(2准备工作)

一.安装Node.js 本项目使用Vue.js前端框架进行开发&#xff0c;在创建项目之前需要先下载Node.js环境。Node.js是一个基于Chrome V8引擎的JavaScript运行环境&#xff0c;它可以让JavaScript运行在服务器端。接下来对Node.js的下载和安装进行详细讲解。 打开Node.js官方网站&a…

RabbitMQ高频面试题

RabbitMQ的使用场景 异步发送消息&#xff08;验证码、短信、邮件…&#xff09;mysql、redis、es之间的数据同步分布式事务削峰填谷… 面试题&#xff1a;RabbitMQ如何保证消息不丢失 消息丢失原因 生产者发送的消息未到达交换机交换机未把消息路由到队列mq服务器宕机&…

辅助驾驶功能开发-功能算法篇(1)-ACC-多目标选择

1、总体架构 2、漏斗概念(Funnel) 路径漏斗是围绕着自车预测轨迹的一片区域。换言之,漏斗的中心应该根据预测的轨迹方向相应的弯曲。 2.1、普通&略宽漏斗(Normal Funnel & Wider Funnel) 普通漏斗用于选择路径中最近的目标车辆A和次近的车辆B。 更宽的漏斗用于选择…

@SentinelResource和openFeign+sentinel 对远程调用熔断降级加规则持久化的具体实 现

SentinelResource 自定义全局限流处理类 需求分析/图解 先看前面的一段代码 这个就是上面的Sentinel 热点规则 注意看我们的限制处理方法在本类中代码的耦合度高 阅读性差 不利于程序的扩展 SentinelResource的作用就是解决这个需求将处理方法放到一个类中 GetMapping("…

Docker从入门到会搭建一个简单的系统

一、环境准备 1、查看Llinux的版本 [rootlocalhost ~]# cat /etc/redhat-release 2、关闭防火墙 [rootlocalhost ~]# systemctl stop firewalld.service 3、设置开机不启动防火墙 [rootlocalhost ~]# systemctl disable firewalld.service 二、Docker的安装 1、Docker是中高…

单片机GD32F303RCT6 (Macos环境)开发 (三十二)—— GD32 SPI主从实验 中断模式

GD32 SPI主从实验 中断模式 1、接线 SPI0 PA4 PA5 PA6 PA7SPI1 PB12 PB14 PB14 PB15采用全双工模式SPI0 SPI1CS PA4----------------PB12CLK PA5----------------PB13MISO PA6----------------PB14MOSI PA7----------------PB152、spi0 主设…

chatgpt赋能python:Python简单游戏开发入门

Python简单游戏开发入门 Python作为一门流行的编程语言&#xff0c;可以用来开发各种各样的应用&#xff0c;包括游戏。虽然Python不是游戏开发的主流语言&#xff0c;但我们可以用它来制作一些简单而有趣的游戏。在这篇文章中&#xff0c;我们将介绍如何用Python创建一个简单…

批量剪辑视频工具源码开发搭建分享

搭建步骤 1. 首先需要根据自身产品确定视频类型及需要实现的视频效果 2. 根据预期视频效果选择视频上传模式&#xff0c;并将视频素材进行上传 3. 添加音频、字幕&#xff0c;标题等与素材进行组合。 4. 设置投放计划&#xff0c;包括&#xff1a;视频标题、视频话题等 5.…

Are Emergent Abilities of Large Language Models a Mirage?

Paper name Are Emergent Abilities of Large Language Models a Mirage? Paper Reading Note Paper URL: https://arxiv.org/pdf/2304.15004.pdf Video URL: https://www.youtube.com/watch?vhZspGdApDIo TL;DR 2023 年斯坦福的研究&#xff0c;探索大语言模型表现出涌…

LeetCode 1552. Magnetic Force Between Two Balls【二分,排序,贪心】中等

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

内存栈与CPU栈机制

1. 内存栈: 先入后出,LIFO(LAST IN FIRST OUT) 入栈:将一个新的元素放到栈顶 出栈:从栈顶取出一个元素 栈顶元素总是最后一个入栈,需要时出栈. 2.CPU栈机制 8086CPU提供相关指令以栈方式来访问内存空间.相当于将一段内存当做栈来使用 8086CPU提供的入栈指令为:PUSH ,出栈指令为…

【Linux】序列化和反序列化

目录 &#x1f308;前言&#x1f338;1、应用层&#x1f33a;2、重谈协议&#x1f341;3、网络计算器&#x1f361;3.1、定制协议&#x1f362;3.2、样例代码 &#x1f308;前言 这篇文章给大家带来序列化和反序列化的学习&#xff01;&#xff01;&#xff01; &#x1f338;…

chatgpt赋能python:Python倒序for:如何优化循环遍历

Python倒序for&#xff1a;如何优化循环遍历 Python作为一门高级编程语言&#xff0c;一直以来都在开发者中得到广泛的应用。在日常的编程工作中&#xff0c;遍历列表&#xff08;List&#xff09;和元组&#xff08;Tuple&#xff09;是很常见的操作。而对于列表或元组的倒序…

NLP(五十四)tiktoken的使用

tiktoken是OpenAI于近期开源的Python第三方模块&#xff0c;该模块主要实现了tokenizer的BPE&#xff08;Byte pair encoding&#xff09;算法&#xff0c;并对运行性能做了极大的优化。本文将介绍tiktoken模块的使用。 tiktoken简介 BPE(Byte pair encoding)算法是NLP中常见的…