古老的五子棋

午休忽然想起我奶奶喜欢下的一种古老的五子棋游戏,于是花了半小时开发出来了~

源代码:

<!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>body {display: flex;justify-content: center;align-items: center;height: 100vh;margin: 0;background-color: #faf1c0;}canvas {background-color: #DAA520; /* 黄棕色 */border: 1px solid black;}</style>
</head>
<body><canvas id="chessboard" width="600" height="600"></canvas><script>const canvas = document.getElementById('chessboard');const ctx = canvas.getContext('2d');// 棋子信息存储let pieces = [];// 棋盘信息存储let board = { size: canvas.width, margin: canvas.width * 0.05, step: (canvas.width - canvas.width * 0.1) / 4 };board.drawableSize = board.size - 2 * board.margin;// 当前拖拽的棋子let currentPiece = null;function drawPiece(x, y, color, isDragging = false) {const radius = board.size / 28;  // 棋子的半径,可以根据需要调整ctx.beginPath();ctx.arc(x, y, radius, 0, Math.PI * 2);ctx.fillStyle = color;ctx.fill();if (isDragging) {ctx.strokeStyle = 'red';ctx.stroke();}ctx.closePath();return { x, y, radius, color };}function drawChessboard() {ctx.clearRect(0, 0, board.size, board.size);for (let i = 0; i <= 4; i++) {ctx.moveTo(board.margin, board.margin + i * board.step);ctx.lineTo(board.margin + board.drawableSize, board.margin + i * board.step);ctx.moveTo(board.margin + i * board.step, board.margin);ctx.lineTo(board.margin + i * board.step, board.margin + board.drawableSize);}let size = board.sizelet step = board.steplet margin =  board.margin// 画对角线ctx.moveTo(margin, margin);ctx.lineTo(size-margin, size-margin);ctx.moveTo(margin, size-margin);ctx.lineTo(size-margin, margin);ctx.moveTo(margin, 2*step+margin);ctx.lineTo(2 * step+margin, size-margin);ctx.moveTo(2*step+margin, margin);ctx.lineTo(size-margin, 2 * step+margin);ctx.moveTo(margin, 2 * step+margin);ctx.lineTo(2 * step+margin, margin);ctx.moveTo(2*step+margin, size-margin);ctx.lineTo(size-margin, 2*step+margin);ctx.stroke();ctx.stroke();}// 初始化棋子function initPieces() {pieces = [];// 画白色棋子for (let i = 0; i <= 4; i++) {pieces.push(drawPiece(i * board.step + board.margin, board.margin, 'white'));}// 画黑色棋子for (let i = 0; i <= 4; i++) {pieces.push(drawPiece(i * board.step + board.margin, board.size - board.margin, 'black'));}}// 检测坐标是否在棋子上function isPieceUnderCoordinate(x, y, piece) {const distance = Math.sqrt((x - piece.x) ** 2 + (y - piece.y) ** 2);return distance < piece.radius;}// 开始拖拽canvas.onmousedown = function(event) {const rect = canvas.getBoundingClientRect();const x = event.clientX - rect.left;const y = event.clientY - rect.top;for (const piece of pieces) {if (isPieceUnderCoordinate(x, y, piece)) {currentPiece = piece;break;}}};// 拖拽移动canvas.onmousemove = function(event) {if (currentPiece) {const rect = canvas.getBoundingClientRect();const x = event.clientX - rect.left;const y = event.clientY - rect.top;drawChessboard();for (const piece of pieces) {if (piece === currentPiece) {drawPiece(x, y, piece.color, true);} else {drawPiece(piece.x, piece.y, piece.color);}}}};// 放下棋子canvas.onmouseup = function(event) {if (currentPiece) {const rect = canvas.getBoundingClientRect();const x = event.clientX - rect.left;const y = event.clientY - rect.top;// 计算最接近的交点const closestX = Math.round((x - board.margin) / board.step) * board.step + board.margin;const closestY = Math.round((y - board.margin) / board.step) * board.step + board.margin;// 更新棋子位置currentPiece.x = closestX;currentPiece.y = closestY;drawChessboard();for (const piece of pieces) {drawPiece(piece.x, piece.y, piece.color);}}currentPiece = null;};// 双击切换棋子颜色canvas.ondblclick = function(event) {const rect = canvas.getBoundingClientRect();const x = event.clientX - rect.left;const y = event.clientY - rect.top;for (const piece of pieces) {if (isPieceUnderCoordinate(x, y, piece)) {// 切换颜色piece.color = piece.color === 'white' ? 'black' : 'white';// 重新绘制棋盘和棋子drawChessboard();for (const piece of pieces) {drawPiece(piece.x, piece.y, piece.color);}break;}}};drawChessboard();initPieces();</script>
</body>
</html>

效果图:

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

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

相关文章

怎么监控钉钉聊天记录内容(监控钉钉聊天记录的3种形式)

企业沟通工具的普及&#xff0c;越来越多的企业开始使用钉钉作为内部沟通工具。然而&#xff0c;对于企业管理者来说&#xff0c;如何监控钉钉聊天记录内容成为了一个重要的问题。本文将介绍几种方法&#xff0c;帮助企业管理者实现监控钉钉聊天记录内容的目的。 一、钉钉自带功…

系列十五、idea全局配置

一、全局Maven配置 IDEA启动页面>Customize>All settings>Build,Execution,Deployment>Build Tools>Maven 二、全局编码配置 IDEA启动页面>Customize>All settings>Editor>File Encodings 三、全局激活DevTools配置 IDEA启动页面>Customize>A…

[迁移学习]DA-DETR基于信息融合的自适应检测模型

原文标题为&#xff1a;DA-DETR: Domain Adaptive Detection Transformer with Information Fusion&#xff1b;发表于CVPR2023 一、概述 本文所描述的模型基于DETR&#xff0c;DETR网络是一种基于Transformer的目标检测网络&#xff0c;详细原理可以参见往期文章&#xff1a;…

如何用PHP获取各大电商平台的数据

PHP获取API数据是指使用PHP语言从web服务中提取数据。API是指应用程序接口&#xff0c;它允许应用程序之间进行交互和通信&#xff0c;并且允许一个应用程序从另一个应用程序获取数据。PHP是一种网站开发语言&#xff0c;它可以使用多种方式来获取API数据。 在PHP中&#xff0…

前端基础之BOM和DOM

目录 一、前戏 window对象 window的子对象 navigator对象&#xff08;了解即可&#xff09; screen对象&#xff08;了解即可&#xff09; history对象&#xff08;了解即可&#xff09; location对象 弹出框 计时相关 二、DOM HTML DOM 树 查找标签 直接查找 间…

Python安装教程

1 安装python环境 1.1 下载python 首先打开http://www.python.org &#xff08;这个是python官网&#xff09;下载配置环境。点击上方 downloads,选择对应的系统的版本就行&#xff0c;这里以windows64系统为例。 点击之后&#xff0c;可以看到很多版本&#xff0c;这里我选择…

创建超过1G内存大小的程序

正常情况一个进程最大占用内存为1G一下&#xff0c;如果程序有需求要使用超过1G大小的程序&#xff0c;可进行如下操作 VS修改设置&#xff1a;属性--->链接器--->系统--->启用大地址 【选择是】 测试申请堆内存代码 #include <stdlib.h> #include <stdio…

在NISQ小型计算机上执行大型并行量子计算的可能性

简介 Steve White提出了密度矩阵重整化群&#xff08;DMRG&#xff09;的基本思想&#xff0c;即纠缠是一种有价值的资源&#xff0c;可以用来精确或近似地描述大量子系统。后来&#xff0c;这一思想被理解为优化矩阵积状态&#xff08;MPS&#xff09;的算法&#xff0c;支持…

21.13 Python 实现端口流量转发

端口流量转发&#xff08;Port Forwarding&#xff09;是一种网络通信技术&#xff0c;用于将特定的网络流量从一个端口或网络地址转发到另一个端口或地址。它在网络中扮演着一个非常重要的角色&#xff0c;在Python语言中实现端口转发非常容易。 如下这段代码实现了一个基本的…

Linux -------------------设置防火墙和SELinux

&#xff08;一&#xff09;防火墙概述 防火墙的概念&#xff1a;防火墙是一种非常重要的网络安全工具&#xff0c;它是网络安全的重要组成部分&#xff0c;用于保护计算机网络免受未经授权的访问、恶意攻击和数据泄漏等威胁等。 防火墙的特点 防火墙通常具备以下几个特点。 …

【C语言】备战校赛Day1

日期:11.1 星期二 L1-001 Hello World 题目描述 这道超级简单的题目没有任何输入。 你只需要在一行中输出著名短句“Hello World!”就可以了。 输入样例: 无 输出样例: Hello World! 解题代码 int main() {printf("Hello World!");return 0; } 该题较为简单,但要注…

基于Tensorflow卷积神经网络玉米病害识别系统(UI界面)

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 Tensorflow是一个流行的机器学习框架&#xff0c;可用于训练和部署各种人工智能模型。玉米病害识别系统基于Tensorf…

[idea]关于idea开发乱码的配置

在JAVA开发中&#xff0c;一般统一设置为UTF-8的编码&#xff0c;包括但不限于开发工具、日志架构、虚拟机、文件编码等。常见配置如下&#xff1a; 1、IDEA工具 在idea64.exe.vmoptions、idea.exe.vmoptions中添加&#xff1a; -Dfile.encodingUTF-8 2、JAVA 运行在window…

chat2db初步使用和体验AI

今天下载chat2db体验了下将主要功能和使用截图总结下&#xff1a; 功能&#xff1a; 1.传统客户端能使用的功能基本都有&#xff0c;并且增加了导出excel等便捷的能力。 2.报表功能&#xff1a; 可以根据查询结果进行对应报表可视化显示 3.AI解析sql 可以根据输入的汉语例如…

开源的网站数据分析统计平台——Matomo

Matomo 文章目录 Matomo前言一、环境准备1. 整体安装流程2.安装PHP 7.3.303.nginx配置4.安装matomo4.1 访问安装页面 http://192.168.10.45:8088/index.php4.2 连接数据库4.3 设置管理员账号4.4 生成js跟踪代码4.5 安装完成4.6 警告修改4.7 刷新页面&#xff0c;就可以看到登陆…

软件测试报告所需周期和费用简析

软件测试报告是在软件开发和测试过程中生成的重要文档之一。它提供了对软件系统经过全面测试后的状态和质量的详细描述&#xff0c;以记录软件测试的过程和结果。 生成一个完整的测试报告需要根据软件项目的规模和复杂性来确定时间。较大规模和复杂的软件项目可能需要更长的时…

【错误解决方案】ModuleNotFoundError: No module named ‘feather‘

1. 错误提示 在python程序中&#xff0c;尝试导入一个名为feather的模块&#xff0c;但Python提示找不到这个模块。 错误提示&#xff1a;ModuleNotFoundError: No module named feather 2. 解决方案 出现这种情况&#xff0c;有可能是因为你还没有安装这个模块&#xff0c;…

Flutter 小技巧之不一样的思路实现炫酷 3D 翻页折叠动画

今天聊一个比较有意思的 Flutter 动画实现&#xff0c;如果需要实现一个如下图的 3D 折叠动画效果&#xff0c;你会选择通过什么方式&#xff1f; 相信可能很多人第一想法就是&#xff1a;在 Dart 里通过矩阵变换配合 Canvas 实现。 因为这个效果其实也算「常见」&#xff0c;…

使用 PyTorch 构建自定义 GPT

一、介绍 介绍大模型&#xff0c;首先考虑一下使用 ChatGPT、Bing Chat 或 Bard 。您是否想过拥有自己的 ChatGPT 会是什么样子&#xff1f;想象一下创建自己的 GPT 模型的兴奋程度。这确实是一种难以置信的感觉&#xff01; 为了开始构建自定义 GPT 的旅程&#xff0c;让我们仔…

MATLAB和S7-1200PLC OPC通信(激活S7-1200PLC OPC UA服务器)

MATLAB和SMART PLC OPC通信请参考下面文章博客: MATLAB和西门子SMART PLC OPC通信-CSDN博客文章浏览阅读123次。西门子S7-200SMART PLC OPC软件的下载和使用,请查看下面文章Smart 200PLC PC Access SMART OPC通信_基于pc access smart的opc通信_RXXW_Dor的博客-CSDN博客OPC是…