JavaScript应用:五子棋游戏实战开发

在这里插入图片描述

🏆作者简介,黑夜开发者,全栈领域新星创作者✌,CSDN博客专家,阿里云社区专家博主,2023年6月csdn上海赛道top4。
🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。
🏆本文已收录于专栏:100个JavaScript的小应用。
🎉欢迎 👍点赞✍评论⭐收藏

文章目录

  • 🚀一、引言
  • 🚀二、核心功能设计
  • 🚀三、功能实现
    • 🔎3.1 创建HTML结构
    • 🔎3.2 创建HTML样式
    • 🔎3.3 绘制棋盘
    • 🔎3.4 核心下棋逻辑处理
      • 🍁3.4.1 玩家落子
      • 🍁3.4.2 系统回棋
      • 🍁3.4.3 输赢判断
      • 🍁3.4.4 重新开始游戏
  • 🚀四、总结


🚀一、引言

五子棋是一种非常经典的棋类游戏,不论是对于计算机科学还是对于普通玩家来说,都具有一定的挑战性。本文将使用Javascript来开发一个简单的五子棋游戏,在游戏中实现双方角色的对战,并且记录胜负结果。

在这里插入图片描述

🚀二、核心功能设计

在开始编写代码之前,我们需要明确一些基本的概念和步骤:

  1. 棋盘:五子棋游戏的主要场景,由19x19个交叉点组成;
  2. 角色:用户和系统两个角色,用户是白色棋子,系统是黑色棋子;
  3. 开始按钮:点击开始按钮后,游戏重新开始;
  4. 落子规则:用户和系统轮流落子,每次只能落一个棋子,不能重复落子;
  5. 判断胜负:当任意一方先连成五个棋子时,游戏结束,并宣布胜者。

🚀三、功能实现

🔎3.1 创建HTML结构

首先,我们需要创建一个HTML文件,并添加必要的结构和样式。在<body>标签中,我们会添加一个<div>元素用于绘制棋盘,以及一个开始按钮。

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
    <title>五子棋游戏</title>
    <link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
    <div id="board"></div>
    <button id="start">开始</button>
    <script src="script.js"></script>
</body>
</html>

在上面的代码中,我们为棋盘设置了一个宽度和高度,并将其居中显示。我们还为每个棋子指定了样式。

🔎3.2 创建HTML样式

#board {
    height: 500px;
    margin: 0 auto;
    background-color: beige;
}

.dot {
    width: 10px;
    height: 10px;
    border-radius: 50%;
    background-color: black;
    position: absolute;
}

.white {
    background-color: white;
}

🔎3.3 绘制棋盘

接下来,我们将使用JavaScript来绘制棋盘。在script.js文件中,我们将获取棋盘元素并生成网格。我们会定义一个全局变量board来存储当前游戏状态。

const boardSize = 15; // 棋盘大小
const boardElement = document.getElementById('board');
let board = []; // 存储棋盘状态

function createBoard() {
    for (let i = 0; i < boardSize; i++) {
        board[i] = [];
        for (let j = 0; j < boardSize; j++) {
            const dot = document.createElement('div');
            dot.className = 'dot';
            dot.style.top = (i * 30 + 10) + 'px';
            dot.style.left = (j * 30 + 10) + 'px';
            boardElement.appendChild(dot);
            board[i][j] = null;
        }
    }
}

createBoard();

上述代码中,我们使用两个嵌套的for循环来遍历整个棋盘,并创建一个<div>元素作为每个交叉点。我们设置了这些点的位置,并将其添加到棋盘元素中。同时,我们也初始化了board数组,将每个交叉点的状态设置为null

🔎3.4 核心下棋逻辑处理

🍁3.4.1 玩家落子

现在,我们将添加处理用户点击事件的功能。当用户点击空白的交叉点时,我们会为其添加一个白色棋子,并将其状态设置为'white'。我们还会为开始按钮添加一个点击事件来重新开始游戏。


const startButton = document.getElementById('start');
let currentPlayer = 'white';

boardElement.addEventListener('click', handleClick);

function handleClick(event) {
    const dot = event.target;
    const row = Math.floor((dot.offsetTop - 10) / 30);
    const col = Math.floor((dot.offsetLeft - 10) / 30);

    if (board[row][col] === null) {
        dot.classList.add(currentPlayer);
        board[row][col] = currentPlayer;

        // 检查是否有玩家连成五个棋子
        if (checkWin(row, col)) {
            endGame(currentPlayer + ' 胜利!');
        } else {
            currentPlayer = 'black';
            setTimeout(systemPlay, 1000); // 系统自动下一步棋
        }
    }
}

🍁3.4.2 系统回棋

接下来,我们需要实现系统落子的逻辑。当游戏玩家下完棋后,系统要进行相应的回棋,游戏才能进行下去。


function systemPlay() {
    // 系统随机选择一个空的交叉点
    let emptyDots = [];

    for (let i = 0; i < boardSize; i++) {
        for (let j = 0; j < boardSize; j++) {
            if (board[i][j] === null) {
                emptyDots.push([i, j]);
            }
        }
    }

    const randomIndex = Math.floor(Math.random() * emptyDots.length);
    const [row, col] = emptyDots[randomIndex];
    const dot = boardElement.children[row * boardSize + col];

    dot.classList.add(currentPlayer);
    board[row][col] = currentPlayer;

    // 检查是否有玩家连成五个棋子
    if (checkWin(row, col)) {
        endGame(currentPlayer + ' 胜利!');
    } else {
        currentPlayer = 'white';
    }
}

🍁3.4.3 输赢判断

我们首先获取被点击的元素,并计算其所在的行和列。然后,我们检查该交叉点是否为空,如果是,就为其添加当前玩家的棋子,并更新board数组。接下来,我们使用checkWin函数检查该玩家是否连成五个棋子,如果是,就结束游戏。


function checkWin(row, col) {
    // 检查行
    let count = 1;

    for (let i = col - 1; i >= 0; i--) {
        if (board[row][i] === currentPlayer) {
            count++;
        } else {
            break;
        }
    }

    for (let i = col + 1; i < boardSize; i++) {
        if (board[row][i] === currentPlayer) {
            count++;
        } else {
            break;
        }
    }

    if (count >= 5) {
        return true;
    }

    // 检查列
    count = 1;

    for (let i = row - 1; i >= 0; i--) {
        if (board[i][col] === currentPlayer) {
            count++;
        } else {
            break;
        }
    }

    for (let i = row + 1; i < boardSize; i++) {
        if (board[i][col] === currentPlayer) {
            count++;
        } else {
            break;
        }
    }

    if (count >= 5) {
        return true;
    }

    // 检查主对角线
    count = 1;

    for (let i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) {
        if (board[i][j] === currentPlayer) {
            count++;
        } else {
            break;
        }
    }

    for (let i = row + 1, j = col + 1; i < boardSize && j < boardSize; i++, j++) {
        if (board[i][j] === currentPlayer) {
            count++;
        } else {
            break;
        }
    }

    if (count >= 5) {
        return true;
    }

    // 检查副对角线
    count = 1;

    for (let i = row - 1, j = col + 1; i >= 0 && j < boardSize; i--, j++) {
        if (board[i][j] === currentPlayer) {
            count++;
        } else {
            break;
        }
    }

    for (let i = row + 1, j = col - 1; i < boardSize && j >= 0; i++, j--) {
        if (board[i][j] === currentPlayer) {
            count++;
        } else {
            break;
        }
    }

    if (count >= 5) {
        return true;
    }

    return false;
}
// 结束游戏
function endGame(message) {
    alert(message);
    boardElement.removeEventListener('click', handleClick);
}

🍁3.4.4 重新开始游戏

如果想重新开始游戏,点击开始按钮,就能够将游戏重新开始,主要逻辑如下

startButton.addEventListener('click', resetGame);

function resetGame() {
    boardElement.innerHTML = '';
    board = [];
    createBoard();
    currentPlayer = 'white';
}

我们为开始按钮添加了一个点击事件,用于重新开始游戏。点击该按钮时,我们会清空棋盘,并重新绘制棋盘,并将当前玩家设置为白色。一起来看一下效果吧。
在这里插入图片描述

🚀四、总结

本篇文章介绍了如何使用JavaScript开发一个简单的五子棋游戏。通过绘制棋盘、实现开始按钮和游戏逻辑、处理用户交互、判断胜负和游戏结束等功能,我们完成了一个基本的五子棋游戏。当然,我们还可以对游戏进行优化和扩展,例如增加悔棋功能、提示下一步最佳落子位置等。

JavaScript是一种非常强大和灵活的编程语言,可以用于开发各种类型的应用程序和游戏。希望通过这篇文章,你对使用JavaScript开发游戏有了更深入的了解。如果你对五子棋游戏开发还有任何问题或建议,欢迎在评论区留言讨论。谢谢阅读!
在这里插入图片描述

今天的内容就到这里,我们下次见。

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

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

相关文章

MChat-Gpt V1.0.0 (将ChatGpt机器人接入内网供全体使用)

Github>https://github.com/MartinxMax/MChat-Gpt 首页 MChat-Gpt V1.0.0将ChatGpt机器人接入内网供全体使用 你需要一个ChatGpt账户如果您在中国则需要使用代理访问,设置TUN代理模式 安装依赖 选择你的系统进行安装 服务端配置 #python3 ChatGpt_Server.py -h 使用&a…

汉字形近字(OCR)

近期做中文OCR识别的优化&#xff0c;抓破头皮却收获甚微。 为了百尺竿头更进一步&#xff0c;遂将目光聚焦在中文汉字特有的形近字和生僻字问题上&#xff0c;于是怒发整理形近字大全&#xff08;花了不少刀&#xff09;&#xff0c;希望对同行朋友们也有帮助&#xff1a; 地表…

【BMC】OpenBMC开发基础3:引入新的开源配方

引入新的开源配方 前面介绍了如何在OpenBMC中通过新建配方引入自己的程序&#xff0c;也介绍了如何修改原有的程序&#xff0c;下面要介绍的是如何引入开源的新程序&#xff0c;这在OE系统上是很方便的&#xff0c;重点就在于引入新的配方。 OE为了方便开发者使用&#xff0c…

【如何在Linux环境下进入Docker容器中的MySQL】

如何在Linux环境下进入Docker容器中的MySQL 查看所有容器 docker ps进入容器 docker exce -it {NAMES/CONTAINER ID} bash根据容器别名获取容器ID都可以进入到容器当中 3. 输入MySQL的账号和密码登录MySQL mysql -uroot -p{password}

竞赛项目 深度学习的视频多目标跟踪实现

文章目录 1 前言2 先上成果3 多目标跟踪的两种方法3.1 方法13.2 方法2 4 Tracking By Detecting的跟踪过程4.1 存在的问题4.2 基于轨迹预测的跟踪方式 5 训练代码6 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习的视频多目标跟踪实现 …

HTTP代理授权方式介绍

在网络爬虫过程中&#xff0c;我们经常需要使用HTTP代理来实现IP隐藏、突破限制或提高抓取效率。而为了确保代理的正常使用&#xff0c;并避免被滥用&#xff0c;代理服务商通常会采用授权方式。在本文中&#xff0c;我们将介绍几种常见的HTTP代理授权方式&#xff0c;以帮助你…

Goland报错 : Try to open it externally to fix format problem

这句报错的意思也就是 : 尝试在外部打开以解决格式问题 解决方案 : 将图片格式该为.png格式&#xff0c;再粘贴进去就可以了! 改变之后的效果 : 那么&#xff0c;这样就ok了

服务器数据恢复-断电导致ext4文件系统文件丢失的数据恢复案例

服务器数据恢复环境&#xff1a; 一台服务器挂载一台存储设备&#xff0c;存储中划分一个Lun&#xff1b;服务器操作系统是Linux centos&#xff0c;EXT4文件系统。 服务器故障&分析&#xff1a; 意外断电导致服务器操作系统无法启动&#xff0c;系统在修复后可以正常启动&…

计算机网络(7) --- UDP协议和TCP协议

计算机网络&#xff08;6&#xff09; --- https协议_哈里沃克的博客-CSDN博客https协议https://blog.csdn.net/m0_63488627/article/details/132112683?spm1001.2014.3001.5501 目录 1.补充知识 1.PORT端口号 2.端口号范围划分 3.知名端口号 2.UDP协议 1.UDP报头 2.U…

【算法】逆波兰表达式

文章目录 定义求法代码思想&#xff1a; 定义 逆波兰表达式也称为“后缀表达式”&#xff0c;是将运算符写在操作数之后的运算式。 求法 *如&#xff1a;(ab)c-(ab)/e的转换过程&#xff1a; 先加上所有的括号。 (((ab)*c)-((ab)/e))将所有的运算符移到括号外面 (((ab) c)* …

WordPress博客发布到公网可访问【 windows系统及linux系统操作】

文章目录 1. 免费注册并下载安装cpolar内网穿透1.1 windows系统1.2 linux系统 2. 将内网映射到公网3. 获取所映射的公网地址 要将自己搭建的个人WordPress博客网站发布到公网可访问&#xff0c;比较常规的做法是买服务器、域名&#xff0c;将其部署到服务器上&#xff0c;备案发…

【腾讯云 Cloud Studio 实战训练营】深度体验 | 使用腾讯云 Cloud Studio 快速构建 Vue + Vite 完成律师 H5 页面

【腾讯云 Cloud Studio 实战训练营】深度体验 | 使用腾讯云 Cloud Studio 快速构建 Vue Vite 完成律师 H5 页面 写在前面的话一、腾讯云 Cloud Studio 介绍1.1 Cloud Studio 应用场景1.2 Cloud Studio 开发优势 二、沉浸式体验开发快速构建 H5 页面2.1 注册与登录 Cloud Studi…

协程(一)单机--》并发--》协程

目录 一 协程的概述1.1 并行与并发1.2 线程1.3 新的思路1.4 Goroutine 二 第一个入门程序 一 协程的概述 我查看了网上的一些协程的资料&#xff0c;发现每个人对协程的概念都不一样&#xff0c;但是我认可的一种说法是&#xff1a;协程就是一种轻量级的线程框架&#xff08;K…

【C语言学习】条件运算符、逻辑运算、运算符优先级

一、条件运算符 条件&#xff1f;条件满足时的值&#xff1a;条件不满足时的值 count (count>20)?count-10:count10;等同于 if( count>20 )count count-10; elsecount count10; 优先级 条件运算符的优先级高于赋值运算符&#xff0c;但低于其他运算符。 尽量不要…

【图像恢复】基于交替乘子方法(ADMM)图像恢复算法研究[固定点收敛和应用](Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Linux系统性能调优及调试课:Linux Kernel Printk

🚀返回专栏总目录 文章目录 0、printk 说明1、printk 日志等级设置2、屏蔽等级日志控制机制3、printk打印常用方式4、printk打印格式0、printk 说明 在开发Linux device Driver或者跟踪调试内核行为的时候经常要通过Log API来trace整个过程,Kernel API printk()是整个Kern…

layui 集成 ztree异步加载

首先&#xff0c;layui环境搭建&#xff0c;ztree环境引入 ztree的js和css都要引入&#xff0c;我这里暂时用的是core包> 静态&#xff0c;一句话就够了 <!-- 左侧菜单树形组件 --><div class"layui-col-md3"><div class"layui-footer "…

【C语言】文件操作

目录 前言&#xff1a;一.为什么使用文件二.什么是文件三.文件的打开和关闭1.文件指针2.文件的打开和关闭 四.文件的顺序读写1.顺序读写函数介绍2.一组函数对比3.fwrite函数与fread函数 五.文件的随机读写1.fseek2.ftell3. rewind 六.文本文件和二进制文件七.文件读取结束的判定…

Selenium 自动化 | 案例实战篇

Chrome DevTools 简介 Chrome DevTools 是一组直接内置在基于 Chromium 的浏览器&#xff08;如 Chrome、Opera 和 Microsoft Edge&#xff09;中的工具&#xff0c;用于帮助开发人员调试和研究网站。 借助 Chrome DevTools&#xff0c;开发人员可以更深入地访问网站&#xf…

dotNet 之数据库sqlite

Sqlite3是个特别好的本地数据库&#xff0c;体积小&#xff0c;无需安装&#xff0c;是写小控制台程序最佳数据库。NET Core是同样也是.NET 未来的方向。 **硬件支持型号 点击 查看 硬件支持 详情** DTU701 产品详情 DTU702 产品详情 DTU801 产品详情 DTU802 产品详情 D…