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

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

文章目录

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


在这里插入图片描述

📋前言

六一儿童节。这是属于孩子们的节日,也是属于我们大人的节日(过期儿童)。在这个六一儿童节,一起「致童真」,用你手上的代码创造出童话王国,让这个世界多一份快乐和惊喜! 趁着六一儿童节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方法,以获得更流畅的动画效果。

📝最后

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Intellij IDEA设置“选中变量或方法”的背景颜色、字体颜色(Mark Occurrences)

背景 IDEA 中选中一个变量就会将所有的变量相关变量标出来&#xff0c;这样就很方便知道这个变量出现的地方。Eclipse里头把这个功能叫做 Mark Occurrences&#xff0c;IDEA 里不知道怎么称呼。 我们要解决的痛点就是提示不明显&#xff0c;如下图所示&#xff0c;Macbook这么…

LVS负载均衡群集

文章目录 LVS负载均衡群集1 企业群集1.1 群集cluster的定义1.2 解决办法1.3 企业群集分类1.4 概念1.4.1 负载均衡群集1.4.2 高可用群集1.4.3 高性能运算 群集 2 负载均衡2.1 负载均衡结构2.2 负载均衡群集工作模式2.2.1 NAT模式2.2.2 TUN模式2.2.3 DR模式 3 LVS虚拟服务器3.1 负…

LeetCode 892. Surface Area of 3D Shapes【数组,数学】简单

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

大数据基础平台实施及运维

一、大数据介绍 1、为什么使用大数据技术 数据量越来越大&#xff0c;数据分析的实时性越来越强&#xff0c;数据结果应用范围越来越广。&#xff08;从用户的访问量、量、访问时间、访问频率&#xff0c;市场可以得到很多信息&#xff09; 2、大数据的定义 数据收集、数据…

使用python制作一个批量查询搜索排名的SEO免费工具

&#x1f482; 个人网站:【海拥】【摸鱼游戏】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 搭建背景 最近工作中需要用…

【详解】篮球记分牌硬件及代码

篮球记分牌设计 1 系统设计1.1 设计任务 1.2 性能指标要求1.2 设计思路及设计框图1.2.1设计思路1.2.2总体设计框图1.2.3电路原理图1.2.3 PCB布线图 2 主要程序模块的设计及原理2.1 外部中断0 2.2 菜单2.3 两队比分及两队犯规次数显示及修改2.3.1选择功能2.3.2修改功能2.3.3显示…

Steemit 会颠覆 Quora/知乎 甚至 Facebook 吗?

Steemit是基于区块链技术的社交媒体平台&#xff0c;其独特的激励机制吸引了众多用户。然而&#xff0c;是否能够真正颠覆Quora、知乎甚至Facebook这些已经成为社交巨头的平台&#xff0c;仍然存在着许多未知因素。本文将探讨Steemit的优势和挑战&#xff0c;以及其在社交领域中…

HTML5 语义元素(一)页面结构

本篇主要介绍HTML5增加的语义元素中关于页面结构方面的&#xff0c;包含&#xff1a; <article>、<aside>、<figure>、<figcaption>、<footer>、<header>、<main>、<nav>、<section>等元素。 目录 1. 语义元素介绍 1.…

Vue中如何进行移动端适配与响应式布局?

Vue中如何进行移动端适配与响应式布局&#xff1f; 如今&#xff0c;移动端适配与响应式布局已经成为Web开发中不可或缺的一部分。Vue.js作为一款流行的JavaScript框架&#xff0c;也提供了许多有用的工具和技术来实现移动端适配和响应式布局。在这篇文章中&#xff0c;我们将…

Stable-Diffusion|文生图 拍立得纪实风格的Lora 图例(三)

上篇【Stable-Diffusion|入门怎么下载与使用civitai网站的模型&#xff08;二&#xff09;】介绍了如何使用c站进行文生图&#xff0c;尤其一些Lora可能随时会下架&#xff0c;所以及时测试&#xff0c;及时保存很关键&#xff0c;更新一些笔者目前尝试比较有意思的Lora。 本篇…

hadoop基础(二)

JAVA客户端 环境搭建 创建Maven项目,添加Hadoop依赖. <dependencies><!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId…

CTFHub | php://input

0x00 前言 CTFHub 专注网络安全、信息安全、白帽子技术的在线学习&#xff0c;实训平台。提供优质的赛事及学习服务&#xff0c;拥有完善的题目环境及配套 writeup &#xff0c;降低 CTF 学习入门门槛&#xff0c;快速帮助选手成长&#xff0c;跟随主流比赛潮流。 0x01 题目描述…

selenium:元素定位之xpath、css

元素定位是在做UI自动化测试中最重要的一环&#xff0c;要牢牢掌握定位的方法&#xff0c;才能更有效率的进行UI自动化测试。 常见的元素定位方式&#xff1a; idnametag_nameclass_namelink_textpartial_link_textxpathcss 其中id&#xff0c;name是具有唯一性的&#xff0…

用HTML5制作精美战机游戏

每天要被大学老师催H5作业&#x1f44f;&#x1f3fb;&#x1f44f;&#x1f3fb;&#x1f44f;&#x1f3fb; 不如看看本文&#xff0c;代码齐全&#xff0c;直接用来做参考案例&#x1f44c;&#x1f3fb; 干货满满不看后悔&#x1f44d;&#x1f44d;&#x1f44d; 代码…

最终版:1分钟自动部署数字人平台并提供web服务:唇形合成(wav2lip) + 超分修复(codeformer),

Demo效果 本文实现步骤:数字人形象(AI绘画) -> 文字转语音(谷歌tts) -> 表情迁移 -> 唇形合成 -> 视频超分 上述步骤所有技术均已在此专栏发布,可点击上方专栏查看具体博文 所有技术依赖环境及api接口均封装打包完毕,使用docker一键部署,预计耗时10分钟 原图 …

【unity】URP的shader开发中支持多光源,_ADDITIONAL_LIGHTS_VERTEX 和 _ADDITIONAL_LIGHTS 区别

项目里有一个其他同事实现的shader&#xff0c;美术那边希望能支持多个光源&#xff0c; 我一看代码里面&#xff0c; frag 函数里已经实现了 #ifdef _ADDITIONAL_LIGHTSuint pixelLightCount GetAdditionalLightsCount();for (uint lightIndex 0u; lightIndex < pixelL…

开源软件介绍——开源基金会和开源许可证

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天我们来看一看世界范围内知名的开源基金会和开源许可证。 开源基金会 基金会是开源生态中的一个重要组成部分&#xff0c;用于资金的筹集与开源项目的前期资助与后期的发展。这里将介绍部分重要基金会&am…

阿里云备案服务码申请方法流程

阿里云备案服务码是什么&#xff1f;ICP备案服务码怎么获取&#xff1f;阿里云备案服务码分为免费和付费两种&#xff0c;申请备案服务码是有限制条件的&#xff0c;需要你的阿里云账号下有可用于申请备案服务码的云产品&#xff0c;如云服务器、建站产品、虚拟主机等&#xff…

Nginx+Tomcat负载均衡、动静分离群集

文章目录 NginxTomcat负载均衡、动静分离群集一.Nginx应用二.部署案例过程&#xff08;7层反向代理&#xff09;关闭防火墙与selinux 1.部署Nginx负载均衡器&#xff08;7-3&#xff09;2.部署Tomcat应用服务器&#xff08;7-2&#xff09;3.部署Tomcat多实例应用服务器&#x…

简单学生管理系统

简单学生管理系统(Java)_封奚泽优的博客-CSDN博客https://blog.csdn.net/weixin_64066303/article/details/130667107?spm1001.2014.3001.5501 转载请注明出处&#xff0c;尊重作者劳动成果。 目录 前期准备&#xff1a; 数据库的连接&#xff1a; 用户账号类&#xff1a;…