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

news2024/11/26 0:58:48

在这里插入图片描述

🏆作者简介,黑夜开发者,全栈领域新星创作者✌,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开发游戏有了更深入的了解。如果你对五子棋游戏开发还有任何问题或建议,欢迎在评论区留言讨论。谢谢阅读!
在这里插入图片描述

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

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

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

相关文章

在数据链路层扩展以太网

为了避免上一节中形成更大的碰撞域&#xff0c;所以从数据链路层来扩展&#xff1a; 网桥工作在数据链路层&#xff0c;因此网桥具备属于数据链路层范畴的相关能力。   网桥可以识别帧结构。   网桥可以根据帧首部中的目的MAC地址和网桥自身的帧转发表来转发或丢弃所收到的…

IT运维:使用数据分析平台监控PowerStore存储

概述 存储在企业中一直承担着重要的角色&#xff0c;保证数据的安全性更是重中之重。存储的运行是否正常&#xff1f;我们的数据是否安全&#xff1f;存储管理人员的操作是否规范&#xff1f;这些都是企业需要关注的问题。那么该如何确保这些问题能够有效的解决&#xff1f;我们…

STM32基于CubeIDE和HAL库 基础入门学习笔记:蓝牙 WIFI STM32连接阿里云

文章目录&#xff1a; 一&#xff1a;蓝牙模块 1.蓝牙模块透传收发测试程序 bt.h bt.c usart.c main.c 2.蓝牙模块AT指令发送与回复判断程序 usart.c main.c 3.蓝牙模块APP按钮控制应用程序 main.c 4.蓝牙模块APP专业调试测试程序&#xff08;操控界面&#xff1a;按…

2023国赛 高教社杯数学建模ABCDE题思路汇总分析

文章目录 0 赛题思路1 竞赛信息2 竞赛时间3 建模常见问题类型3.1 分类问题3.2 优化问题3.3 预测问题3.4 评价问题 4 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 竞赛信息 全国大学生数学建模…

进样顺序对列排斥能的影响

( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 让网络的输入有3个节点&#xff0c;训练集AB各由6张二值化的图片组成&#xff0c;让AB中各有1个1&#xff0c;排列组合所有可能 &#xff0c;统计迭代次数并排序。 差值结构 A-B 迭代次数 36组平均迭代次数 - 2 1 1*0*0*0*0*0-2*…

qt在vs中编译出现link2001时,不会生成moc文件了

现象&#xff1a; 解决方法&#xff1a; 在对应头文件-属性-配置属性-常规-项类型-改为Qt Meta-Object Compiler (moc) 即可。 有时候不知道啥原因头文件类型变成普通C头文件

深入解析中国供应商API:关键字搜索接口对接与商品数据交互指南

随着电商行业的快速发展&#xff0c;越来越多的企业开始与中国供应商进行合作。而为了实现有效的数据交换和协作&#xff0c;接口对接成为了不可或缺的一环。本文将深入探讨中国供应商API&#xff0c;介绍如何高效地进行接口对接与数据交互&#xff0c;并提供实用的Python示例代…

构建之法 - 软件工程实践教学:每天都向前推进一点点

作者&#xff1a;福州⼤学 汪璟玢⽼师 汪老师&#xff1a;每次都向前推进一点点&#xff0c;哪怕只有一点点&#xff0c;也好过什么都不做。 ​邹老师&#xff1a;对&#xff0c;几个学期下来&#xff0c;就已经超过那些“空想”的团队很远了。坚持下去&#xff01; 汪老师&…

以商业大数据技术助力数据合规流通体系建立,合合信息参编《数据经纪从业人员评价规范》团标

经国务院批准&#xff0c;由北京市人民政府、国家发展和改革委员会、工业和信息化部、商务部、国家互联网信息办公室、中国科学技术协会共同主办的2023 全球数字经济大会于近期隆重召开。由数交数据经纪&#xff08;深圳&#xff09;有限公司为主要发起单位&#xff0c;合合信息…

『C语言初阶』第七章 -初识指针

前言 时隔多日小羊又来给铁汁们更新C语言之初识指针&#xff0c;指针是C语言中一个关键且强大的概念&#xff0c;理解和掌握指针对于编写高效、灵活的程序至关重要。本文将详细解释C语言中的指针&#xff0c;帮助初学者迈出掌握编程世界的第一步。 一、指针是什么&#xff1f;…

无涯教程-Perl - int函数

描述 此函数返回EXPR的整数元素,如果省略则返回$_。 int函数不进行舍入。如果需要将值四舍五入为整数,则应使用sprintf。 语法 以下是此函数的简单语法- int EXPRint返回值 此函数返回EXPR的整数部分。 例 以下是显示其基本用法的示例代码- #!/usr/bin/perl$int_valint…

PromQL实现Actuator获取的JVM指标的Full GC次数监控

Spring Boot 版本需要2.0.0或更高版本。 添加Micrometer Prometheus registry依赖: <dependency><groupId>io.micrometer</groupId><artifactId>micrometer-registry-prometheus</artifactId> </dependency>在application.properties中开…

哪个牌子的运动耳机好、最好的运动耳机推荐

在当今快节奏的生活中&#xff0c;运动已经成为许多人追求健康与活力的重要组成部分。而在运动过程中&#xff0c;一款出色的运动耳机不仅能为我们提供激励和动力&#xff0c;还能让我们沉浸在音乐的世界中&#xff0c;享受极致的运动体验。然而&#xff0c;市场上琳琅满目的运…

[LeetCode - Python] 278.第一个错误的版本(Easy)

题目&#xff1a; 278.第一个错误的版本&#xff08;Easy&#xff09; 代码&#xff1a; # 常用的 左闭右开&#xff0c;二分法&#xff0c;要当心判断条件 到底是True还是False # The isBadVersion API is already defined for you. # def isBadVersion(version: int) -&g…

【Spring security 解决跨域】

security 跨域 概述方案方案一方案二方案三方案四 主页传送门&#xff1a;&#x1f4c0; 传送 概述 Spring Security是一个功能强大且高度可定制的&#xff0c;主要负责为Java程序提供声明式的身份验证和访问控制的安全框架。其前身是Acegi Security,后来被收纳为Spring的一个…

hcip的BGP实验

题目 拓扑图 思路&#xff1a; 1、给各个设备配置IP地址及环回接口 2、配置R2、R3、R4&#xff0c;三个设备的OSPF环境 3、将R1、R2、R3、R4、R5建立BGP对等体关系 4、建临时&#xff0c;将源地址也修改为环回接口 5、宣告时&#xff0c;将BGP路由传递给本地的邻居时修改下…

mysql一些统计实用函数

文章目录 一对多&#xff0c;多的一端只查询最新数据YEAR 年份函数MONTH 月份函数QUARTER 季度函数往前递推十年往后递推十年查询去年12月份统计身份证户籍所在地人数 一对多&#xff0c;多的一端只查询最新数据 ROW_NUMBER() over(PARTITION BY evt_id ORDER BY evt_node_rec…

挖洞小技巧

挖洞小技巧 1. Google语法1.1. 基础语法1.2. 操作符 2. 寻找漏洞2.1. SQL注入2.1.1. 不带公司2.1.2. 带公司2.1.3. 如何测试 2.2. 后台管理漏洞2.2.1. 查询单个网站2.2.2. 常见后台管理路径 2.3. 支付漏洞2.4. 文件上传漏洞2.5. 查找文件类型2.6. 敏感信息泄露 3. 刷分 1. Goog…

分享讨论学习IT上培训班有用吗?个人感悟

不知不觉一入行2年有余&#xff0c;回顾自己转行的学习历程&#xff0c;历历在目。我对培训机构好感度为0&#xff01; IT分行业发展未来&#xff0c;前景还是很好的&#xff0c;但是入门方向很重要&#xff0c;要选择什么方向去学学完才有钱景&#xff0c;需要自己 &#xff0…

直接在html中引入Vue.js的cdn来实现Vue3的组合式API

Vue3的组合式API是使用setup函数来编写组件逻辑的。setup函数是Vue3中用于替代Vue2的选项API&#xff08;如data、methods等&#xff09;的一种方式。在setup函数中&#xff0c;你可以访问到一些特殊的响应式对象&#xff0c;并且可以返回一些可以在模板中使用的数据、方法等。…