五子棋html

 

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>五子棋游戏</title>
<style>body {display: flex;flex-direction: column;align-items: center;background: #f0d9b5;font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;margin: 0;padding: 20px;}h1 {margin-bottom: 10px;}#board {display: grid;grid-template-columns: repeat(15, 30px);grid-template-rows: repeat(15, 30px);gap: 1px;background-color: #333;border: 2px solid #333;}.cell {width: 30px;height: 30px;background-color: #f0d9b5;border-radius: 3px;cursor: pointer;position: relative;}.cell:hover {background-color: #e0cfa3;}.stone {position: absolute;top: 50%;left: 50%;width: 24px;height: 24px;border-radius: 50%;transform: translate(-50%, -50%);}.black {background-color: black;}.white {background-color: white;border: 1px solid black;}#scoreboard {margin-top: 20px;font-size: 18px;}#resetBtn {margin-top: 15px;padding: 8px 16px;font-size: 16px;cursor: pointer;}
</style>
</head>
<body><h1>五子棋游戏</h1><div id="board"></div><div id="scoreboard">黑方胜利次数: <span id="blackWins">0</span> &nbsp;&nbsp; 白方胜利次数: <span id="whiteWins">0</span></div><button id="resetBtn">重新开始</button><script>const boardSize = 15;const board = document.getElementById('board');const blackWinsSpan = document.getElementById('blackWins');const whiteWinsSpan = document.getElementById('whiteWins');const resetBtn = document.getElementById('resetBtn');let currentPlayer = 'black';let boardState = Array(boardSize).fill(null).map(() => Array(boardSize).fill(null));let blackWins = 0;let whiteWins = 0;let gameOver = false;function createBoard() {board.innerHTML = '';for (let row = 0; row < boardSize; row++) {for (let col = 0; col < boardSize; col++) {const cell = document.createElement('div');cell.classList.add('cell');cell.dataset.row = row;cell.dataset.col = col;cell.addEventListener('click', onCellClick);board.appendChild(cell);}}}function onCellClick(e) {if (gameOver) return;const row = parseInt(e.target.dataset.row);const col = parseInt(e.target.dataset.col);if (boardState[row][col] !== null) return;boardState[row][col] = currentPlayer;const stone = document.createElement('div');stone.classList.add('stone', currentPlayer);e.target.appendChild(stone);if (checkWin(row, col, currentPlayer)) {gameOver = true;if (currentPlayer === 'black') {blackWins++;blackWinsSpan.textContent = blackWins;setTimeout(() => alert('黑方获胜!'), 0);} else {whiteWins++;whiteWinsSpan.textContent = whiteWins;setTimeout(() => alert('白方获胜!'), 0);}return;}currentPlayer = currentPlayer === 'black' ? 'white' : 'black';}function checkWin(row, col, player) {return (checkDirection(row, col, player, 1, 0) || // 横向checkDirection(row, col, player, 0, 1) || // 纵向checkDirection(row, col, player, 1, 1) || // 斜向 \checkDirection(row, col, player, 1, -1)   // 斜向 /);}function checkDirection(row, col, player, deltaRow, deltaCol) {let count = 1;// 向一个方向计数let r = row + deltaRow;let c = col + deltaCol;while (r >= 0 && r < boardSize && c >= 0 && c < boardSize && boardState[r][c] === player) {count++;r += deltaRow;c += deltaCol;}// 向相反方向计数r = row - deltaRow;c = col - deltaCol;while (r >= 0 && r < boardSize && c >= 0 && c < boardSize && boardState[r][c] === player) {count++;r -= deltaRow;c -= deltaCol;}return count >= 5;}resetBtn.addEventListener('click', () => {gameOver = false;boardState = Array(boardSize).fill(null).map(() => Array(boardSize).fill(null));currentPlayer = 'black';createBoard();});createBoard();</script>
</body>
</html>

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

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

相关文章

算法训练营第十一天|150. 逆波兰表达式求值、239. 滑动窗口最大值、347.前 K 个高频元素

150. 逆波兰表达式求值 题目 思路与解法 第一思路&#xff1a; 比较简单 class Solution:def evalRPN(self, tokens: List[str]) -> int:stack []for item in tokens:if item ! and item ! - and item ! * and item ! / :stack.append(item)else:b int(stack.pop())a …

原生 IP(Native IP)

目录 一、核心特点 二、原生 IP 的常见应用 三、原生 IP vs. 数据中心 IP 四、如何获取原生 IP&#xff1f; 五、原生 IP 的优缺点 六、实际案例 原生 IP&#xff08;Native IP&#xff09; 是指由互联网服务提供商&#xff08;ISP&#xff09;直接分配给用户的 IP 地址&…

k8s的pod挂载共享内存

k8s的pod挂载共享内存&#xff0c;限制不生效问题&#xff1a; 注&#xff1a;/dev/shm 是 Linux 系统中用于共享内存的特殊路径。通过将 emptyDir 的 medium 设置为 Memory&#xff0c;可以确保 /dev/shm 正确地挂载到一个基于内存的文件系统&#xff0c;从而实现高效的共享内…

DOCX转PDF怎么操作最简单?快速将DOCX转换为专业PDF文档

在日常办公或学习中&#xff0c;我们经常需要将 Word 文档&#xff08;.docx格式&#xff09;转换为 PDF 文件。这不仅有助于保持文档格式的一致性&#xff0c;还能确保接收者无需特定软件即可查看文件内容。本文将详细介绍几种常见的方法来实现从 DOCX 到 PDF 的转换&#xff…

VUE+ElementUI 使用el-input类型type=“number” 时,取消右边的上下箭头

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 在项目中有时候需要输入框的type“number”&#xff0c;这个时候&#xff0c;输入框的右边就会出现两个按钮&#xff0c;这两个按钮可以递增/递减&#xff0c;但是这样输入框看上去就不太美观&#x…

深入浅出理解常见的分布式ID解决方案

目录 UUID 自增ID 数据库多主模式 号段模式 Redis 雪花算法 百度 UIDgenerator 美团Leaf 滴滴TinyID 实战中的分布式ID生成器&#xff01;保障数据唯一性的核心组件 怎么编写Lua脚本是关键 怎么执行&#xff1f; 总结 分布式ID在构建大规模分布式系统时扮演着至关…

技术视界 | 青龙机器人训练地形详解(一):如何创建一个地形

机器人强化学习中的地形训练是利用强化学习算法让机器人在不同地形环境中通过试错学习最优行为策略的过程&#xff0c;通过环境建模、策略学习与优化等环节&#xff0c;使机器人能够自主适应复杂多变的地形&#xff0c;提高其移动效率、稳定性和自主性&#xff0c;减少人为干预…

【SGL】Scatter-Gather List内存传输技术

文章目录 1. What is SGL&#xff1f;2. sgl内存传输的原理2.1 核心思想2.2 sgl数据结构2.3 摘链和挂链 3. 零拷贝技术3.1 问题背景3.2 零拷贝的核心思想及实现方式 4. sgl在存储行业的应用 1. What is SGL&#xff1f; sgl&#xff08;Scatter-Gather List&#xff09;内存传…

10.idea中创建springboot项目_jdk17

10.idea中创建springboot项目_jdk17 一、前期准备 安装与配置&#xff1a; 确保已安装 IntelliJ IDEA配置好 JDK17 二、创建 Maven 项目 新建项目&#xff1a; 点击 File → New → Project&#xff0c;选择左侧的 Maven。填写项目名称&#xff08;如 demo&#xff09;、存…

如何使用极狐GitLab 软件包仓库功能托管 ruby?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 软件包库中的 Ruby gems (BASIC ALL) WARNING:Ruby gems 软件包库正在开发中&#xff0c;由于功能有限&#xff0c;尚未准备好…

LeetCode 热题 100 131. 分割回文串

LeetCode 热题 100 | 131. 分割回文串 大家好&#xff0c;今天我们来解决一道经典的回溯算法问题——分割回文串。这道题在 LeetCode 上被标记为中等难度&#xff0c;要求将一个字符串 s 分割成若干个子串&#xff0c;使得每个子串都是回文串&#xff0c;并返回所有可能的分割…

〖 Linux 〗操作系统进程管理精讲(2)

文章目录 1、环境变量基本概念常见环境变量查看环境变量方法测试 PATH测试 HOME和环境变量相关的命令环境变量的组织方式<p align"center">main 函数的三个参数通过代码获得环境变量通过系统调用获取环境变量环境变量通常是具有全局属性的 2、程序地址空间2.1 …

vite:npm 安装 pdfjs-dist , PDF.js View 示例

pdfjs-dist 是 Mozilla 的 PDF.js 库的预构建版本&#xff0c;能让你在项目里展示 PDF 文件。下面为你介绍如何用 npm 安装 pdfjs-dist 并应用 pdf.js 和 pdf.worker.js。 为了方便&#xff0c;我将使用 vite 搭建一个原生 js 项目。 1.创建项目 npm create vitelatest pdf-v…

精品,架构师总结,MySQL 5.7 查询入门详解

文章目录 MySQL 5.7 查询入门详解一、数据库与表基础操作1.1 连接数据库1.2 创建数据库1.3 使用数据库1.4 创建数据表1.5 表结构查看 二、SELECT基础查询2.1 全列查询2.2 指定列查询2.3 别名使用2.4 去重查询2.5 表达式计算 三、WHERE条件查询3.1 比较运算符3.2 逻辑运算符3.3 …

P48-56 应用游戏标签

这一段课主要是把每种道具的游戏Tag进行了整理与应用 AuraAbilitySystemComponentBase.h // Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "AbilitySystemComponent.h"…

【AWS+Wordpress】将本地 WordPress 网站部署到AWS

前言 自学笔记&#xff0c;解决问题为主&#xff0c;亲测有效&#xff0c;欢迎补充。 本地开发机&#xff1a;macOS&#xff08;Sequoia 15.0.1&#xff09; 服务器&#xff1a;AWS EC2&#xff08;Amazon Linux 2023&#xff09; 目标&#xff1a;从本地迁移 WordPress 到云…

从零开始:用PyTorch构建CIFAR-10图像分类模型达到接近1的准确率

为了增强代码可读性&#xff0c;代码均使用Chatgpt给每一行代码都加入了注释&#xff0c;方便大家在本文代码的基础上进行改进优化。 本文是搭建了一个稍微优化了一下的模型&#xff0c;训练200个epoch&#xff0c;准确率达到了99.74%&#xff0c;简单完成了一下CIFAR-10数据集…

C++复习类与对象基础

类的成员函数为什么需要在类外定义 1.1 代码组织与可读性​ ​类内定义​&#xff1a;适合 ​短小简单的函数​&#xff08;如 getter/setter&#xff09;&#xff0c;能直观体现类的接口设计。 ​类外定义​&#xff1a;当函数体较复杂时&#xff0c;将实现移到类外&#xf…

【计算机网络】Cookie、Session、Token之间有什么区别?

大家在日常使用浏览器时可能会遇到&#xff1a;是否清理Cookie&#xff1f;这个问题。 那么什么是Cookie呢&#xff1f;与此相关的还有Session、Token这些。这两个又是什么呢&#xff1f; 本文将对这三个进行讲解区分&#xff0c;如果对小伙伴有帮助的话&#xff0c;也请点赞、…

Python 3.x 内置装饰器 (4) - @dataclass

dataclass 是Python 3.7 引入的一个装饰器&#xff0c;用来简化创建数据类&#xff08;主要存储数据的类&#xff09;的过程。它会自动为类生成一些常用的方法&#xff0c;比如&#xff1a; __init__: 对象的初始化 __repr__: 定义类的官方字符串表示。 __eq__: 定义两个对象…