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开发游戏有了更深入的了解。如果你对五子棋游戏开发还有任何问题或建议,欢迎在评论区留言讨论。谢谢阅读!
在这里插入图片描述

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

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

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

相关文章

Python Selenium 设置带账号密码的socks5代理,启动浏览器

selenium添加带有账密的socks5代理 我们都知道在使用selenium开发爬虫的时候不可避免的会使用socks5高匿名代理。一般情况下我们使用方法如下(开发语言为python)&#xff1a; from selenium import webdriver chrome_options webdriver.ChromeOptions() chrome_options.add_…

【探索SpringCloud】服务发现-Nacos使用

前言 在聊服务注册中心时&#xff0c;便提到了Nacos。这次便来认识一下。当然&#xff0c;这自然没有官方介绍那般详尽&#xff0c;权当是学习了解Nacos原理的一个过程吧。 Nacos简介 Nacos&#xff0c;全名&#xff1a;dynamic Naming And Configuration Service. 而这个名…

PHP智能人才招聘网站mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP智能人才招聘网站 是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 下载地址 https://download.csdn.net/download/qq_41221322/88199392 视频演示 PH…

【MAC】 M2 brew安装 docker 运行失败 解决

MAC 安装 brew install --cask docker 之后一直显示docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?. 网上看了一些文章 发现 这个不适用于M2 所以要从官网上下载 docker 安装成功

多线程与并发编程面试题总结

多线程与并发编程 多线程 线程和进程的区别&#xff1f; 从操作系统层面上来讲&#xff1a;进程(process)在计算机里有单独的地址空间&#xff0c;而线程只有单独的堆栈和局部内存空间&#xff0c;线程之间是共享地址空间的&#xff0c;正是由于这个特性&#xff0c;对于同…

产品进行逻辑梳理的三个重点

我们在进行产品方案设计时&#xff0c;需要进行逻辑梳理&#xff0c;这样才能保障产品方案的严谨性&#xff0c;降低后期返工几率。如果我们在接到需求时&#xff0c;直接开始画原型&#xff0c;没有经过逻辑梳理&#xff0c;往往容易造成产品方案纰漏丛生&#xff0c;直接影响…

成集云 | 用友U8采购请购单同步钉钉 | 解决方案

源系统成集云目标系统 方案介绍 用友U8是中国用友集团开发和推出的一款企业级管理软件产品。具有丰富的功能模块&#xff0c;包括财务管理、采购管理、销售管理、库存管理、生产管理、人力资源管理、客户关系管理等&#xff0c;可根据企业的需求选择相应的模块进行集…

【C++入门到精通】C++入门 —— vector (STL)

阅读导航 前言一、vector简介1. 概念2. 特点 二、vector的使用1.vector 构造函数2. vector 空间增长问题⭕resize 和 reserve 函数 3. vector 增删查改⭕operator[] 函数 三、迭代器失效温馨提示 前言 前面我们讲了C语言的基础知识&#xff0c;也了解了一些数据结构&#xff0…

Python爬虫:单线程、多线程、多进程

前言 在使用爬虫爬取数据的时候&#xff0c;当需要爬取的数据量比较大&#xff0c;且急需很快获取到数据的时候&#xff0c;可以考虑将单线程的爬虫写成多线程的爬虫。下面来学习一些它的基础知识和代码编写方法。 一、进程和线程 进程可以理解为是正在运行的程序的实例。进…

优化堆排序(Java 实例代码)

目录 优化堆排序 Java 实例代码 src/runoob/heap/HeapSort.java 文件代码&#xff1a; 优化堆排序 上一节的堆排序&#xff0c;我们开辟了额外的空间进行构造堆和对堆进行排序。这一小节&#xff0c;我们进行优化&#xff0c;使用原地堆排序。 对于一个最大堆&#xff0c;首…

负载均衡搭建

LVS-DR部署 [客户端] node1 192.168.157.148 [lvs] node2 192.168.157.142 [web服务器] node3 192.168.157.145 node4 192.168.157.146&#xff08;1&#xff09;[lvs] yum install -y ipvsadm.x86_64 配置LVS负载均衡服务 &#xff08;1&#xff09;手动添加LVS转发1&#xff…

SpringBoot复习:(42)WebServerCustomizer的customize方法是在哪里被调用的?

ServletWebServletAutoConfiguration类定义如下&#xff1a; 可以看到其中通过Import注解导入了其内部类BeanPostProcessorRegister。 BeanPostProcessor中定义的registerBeanDefinition方法会被Spring容器调用。 registerBeanDefinitions方法调用了RegistrySyntheticBeanIf…

51.C++继承

今天进行了新的学习关于c继承的知识。 目录 1.继承 基类and派生类 访问控制和继承 单继承 多继承 2.同名隐藏 1.继承 在C中&#xff0c;继承是一种面向对象编程的重要特性&#xff0c;用于构建类之间的层次关系。通过继承&#xff0c;一个类可以从另一个类继承其…

IDEA部署配置Maven项目教程,IDEA配置Tomcat(2019.3.3)(2023.1.3)

我们往往会用到多版本的IDEA进行一个Maven项目配置部署&#xff0c;还有tomcat的配置&#xff0c;这里就有你需要的&#xff0c;有低版本的&#xff0c;也有高版本的&#xff0c;根据自己的情况来进行一个操作 一、前言 当涉及到软件开发和项目管理时&#xff0c;使用一个可靠的…

UNIX 入门

与 UNIX 建立连接启动会话登录命令提示符修改口令退出系统 简单的 UNIX 命令命令格式ls 命令who 命令虚拟终端 tty伪终端 ptywho am i 命令 cal 命令help 命令man 命令 shell 概述shell 命令更换 shell临时更改 shell永久更改 shell 登录过程 与 UNIX 建立连接 启动会话 要启…

虚拟机怎么连接加密狗?USB Sever连接方法

公司想把软件都迁移到虚拟机&#xff0c;但是没法连接加密狗&#xff0c;怎么办&#xff1f; 让USB Sever来连接就行了&#xff01; 第一步&#xff0c; 根据加密狗的数量&#xff0c; 选一台合适的朝天椒USB Sever&#xff0c; 第二步&#xff0c; 将加密狗全部插在朝天椒U…

FreeRTOS(事件组)

资料来源于硬件家园&#xff1a;资料汇总 - FreeRTOS实时操作系统课程(多任务管理) 目录 一、事件的概念与应用 1、事件的概念 2、事件的应用 二、事件的运作机制 1、FreeRTOS中事件组的句柄 2、FreeRTOS 任务间事件标志组的实现 3、FreeRTOS 中断方式事件标志组的实现…

【多视重建】从Zero-123到One-2-3-45:多视角生成

文章目录 摘要一、引言二、相关工作三、Zero-1-to-33.1.学习如何控制照相机的视角3.2.视角作为条件的扩散3.3三维重构3.4 数据集 四、One-2-3-454.1 Zero123: 视角条件的 2D Diffusion4.2 NeRF优化&#xff1a;将多视图预测提升到三维图像4.3 基于不完美多视图的 神经表面重建*…

实训一 :Linux的启动、关机及登录

实训一 &#xff1a;Linux的启动、关机及登录 2017 年 2 月 22 日 今日公布 实训目标 完成本次实训&#xff0c;将能够&#xff1a; 描述Linux的开机过程。在图形模式和文本模式下登录Linux。关闭和重启Linux 实训准备 一台已安装RHEL6的虚拟计算机&#xff0c;Linux虚拟…

Node+MySQL+Vue2.0+elementUI实现的博客管理系统(一)

前端部分&#xff1a; Vue项目的入口文件main.js: //引入Vue import Vue from vue //引入App import App from ./App.vue //引入VueRouter import VueRouter from vue-router import router from ./router/index import Vuex from vuex import store from ./store //完整引入…