《重温JavaScript五子棋小游戏》

news2024/11/24 20:25:25

目录

      • 全部运行代码:
      • 五子棋游戏的基本步骤:
      • 代码剖析:
        • 1. 初始化游戏界面
        • 2. 管理游戏状态
        • 3. 玩家交互
        • 4. 电脑AI
        • 5. 胜负判定
        • 6. 游戏控制

本文通过实现一个基本的五子棋游戏,展示了如何使用HTML、CSS和JavaScript来构建一个简单的交互式游戏。虽然这里提供的实现较为基础,但它为理解和进一步开发更复杂的版本打下了良好的基础。
在这里插入图片描述

未来还可以考虑添加以下功能:

  1. 更复杂的AI算法,如Minimax算法或Alpha-Beta剪枝。
  2. 多个难度级别的选择。
  3. 用户界面改进,如动画效果和音效。
  4. 在线多人游戏支持。

全部运行代码:

五子棋游戏的基本步骤:

  1. 初始化游戏界面

    • 创建棋盘画布(Canvas)。
    • 设置画布的尺寸和样式。
    • 绘制棋盘。
  2. 管理游戏状态

    • 创建数据结构来存储棋盘的状态。
    • 定义玩家顺序和当前玩家。
    • 管理游戏是否结束。
  3. 玩家交互

    • 监听鼠标点击事件。
    • 计算点击位置对应的棋盘坐标。
    • 验证点击位置是否合法。
    • 更新棋盘状态,并绘制棋子。
  4. 电脑AI

    • 实现简单的AI算法,如随机选择落子位置。
    • 更新棋盘状态,并绘制棋子。
  5. 胜负判定

    • 检查是否有玩家获胜。
    • 如果有玩家获胜,则显示胜利消息,并提供重新开始游戏的选项。
  6. 游戏控制

    • 提供重新开始游戏的功能。
    • 清除画布,重置游戏状态。

代码剖析:

1. 初始化游戏界面
// 获取画布元素
const canvas = document.getElementById('board');
const context = canvas.getContext('2d');

// 设置画布尺寸
canvas.width = 450; // 15格 * 30px每格 + 15px边距
canvas.height = 450; // 同上

// 定义棋盘格子的大小
const gridSize = 30;
const boardSize = 15;

// 绘制棋盘
function drawBoard() {
  context.strokeStyle = '#000';
  context.lineWidth = 1;
  
  // 绘制垂直线
  for (let i = 0; i <= boardSize; i++) {
    context.beginPath();
    context.moveTo(15 + i * gridSize, 15); // 增加15px边距
    context.lineTo(15 + i * gridSize, boardSize * gridSize + 15); // 增加15px边距
    context.stroke();
  }
  
  // 绘制水平线
  for (let i = 0; i <= boardSize; i++) {
    context.beginPath();
    context.moveTo(15, 15 + i * gridSize); // 增加15px边距
    context.lineTo(boardSize * gridSize + 15, 15 + i * gridSize); // 增加15px边距
    context.stroke();
  }
}

// 调用绘制函数
drawBoard();
2. 管理游戏状态
// 创建数据结构来存储棋盘的状态
let board = Array.from({length: boardSize}, () => Array(boardSize).fill(null));

// 定义玩家顺序和当前玩家
let currentPlayer = 'black';

// 游戏是否结束
let gameEnded = false;

// 重置游戏
function resetGame() {
  board = Array.from({length: boardSize}, () => Array(boardSize).fill(null));
  currentPlayer = 'black';
  gameEnded = false;
  context.clearRect(0, 0, canvas.width, canvas.height);
  drawBoard();
}
3. 玩家交互
// 添加鼠标点击事件监听器
canvas.addEventListener('click', (event) => {
  if (!gameEnded && currentPlayer === 'black') { // 只有在游戏未结束且当前玩家是黑方时才允许点击
    const x = Math.floor((event.offsetX - 15) / gridSize); // 减去15px边距
    const y = Math.floor((event.offsetY - 15) / gridSize); // 减去15px边距
    
    if (board[x][y] === null) {
      drawChess(x * gridSize + 15, y * gridSize + 15, currentPlayer); // 加上15px边距
      board[x][y] = currentPlayer;
      
      if (checkWin(x, y, currentPlayer)) {
        gameEnded = true;
      } else {
        currentPlayer = 'white'; // 切换到白方
        computerMove(); // 电脑自动下棋
      }
    }
  }
});

// 绘制棋子
function drawChess(x, y, color) {
  context.fillStyle = color;
  context.beginPath();
  context.arc(x, y, 13, 0, Math.PI * 2, false);
  context.fill();
}

// 检查是否有五个连续的棋子
function checkWin(x, y, player) {
  // 这里可以实现一个简单的检查方法
  // 例如,检查行、列、对角线上是否有五个连续的棋子
  // 本例中省略具体实现
  return false;
}
4. 电脑AI
// 电脑自动下棋
function computerMove() {
  if (!gameEnded && currentPlayer === 'white') {
    let bestMove = findBestMove();
    if (bestMove) {
      drawChess(bestMove.x * gridSize + 15, bestMove.y * gridSize + 15, currentPlayer); // 加上15px边距
      board[bestMove.x][bestMove.y] = currentPlayer;
      
      if (checkWin(bestMove.x, bestMove.y, currentPlayer)) {
        gameEnded = true;
      } else {
        currentPlayer = 'black'; // 切换到黑方
      }
    }
  }
}

// 找到最佳移动位置
function findBestMove() {
  // 简单的随机选择一个空位
  const availableMoves = [];
  for (let x = 0; x < boardSize; x++) {
    for (let y = 0; y < boardSize; y++) {
      if (board[x][y] === null) {
        availableMoves.push({x, y});
      }
    }
  }
  
  return availableMoves[Math.floor(Math.random() * availableMoves.length)];
}
5. 胜负判定
// 检查是否有五个连续的棋子
function checkWin(x, y, player) {
  // 检查行
  let count = 1;
  for (let i = 1; i < 5; i++) {
    if (x - i >= 0 && board[x - i][y] === player) count++;
    if (x + i < boardSize && board[x + i][y] === player) count++;
  }
  
  // 检查列
  for (let i = 1; i < 5; i++) {
    if (y - i >= 0 && board[x][y - i] === player) count++;
    if (y + i < boardSize && board[x][y + i] === player) count++;
  }
  
  // 检查正对角线
  for (let i = 1; i < 5; i++) {
    if (x - i >= 0 && y - i >= 0 && board[x - i][y - i] === player) count++;
    if (x + i < boardSize && y + i < boardSize && board[x + i][y + i] === player) count++;
  }
  
  // 检查反对角线
  for (let i = 1; i < 5; i++) {
    if (x - i >= 0 && y + i < boardSize && board[x - i][y + i] === player) count++;
    if (x + i < boardSize && y - i >= 0 && board[x + i][y - i] === player) count++;
  }
  
  return count >= 5;
}
6. 游戏控制
// 胜利消息
function showVictoryMessage(player) {
  alert(`玩家 ${player} 获胜!`);
  resetGame();
}

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

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

相关文章

校园疫情防控系统

TOC springboot0780校园疫情防控系统 第1章 绪论 1.1背景及意义 随着社会的快速发展&#xff0c;计算机的影响是全面且深入的。学校管理水平的不断提高&#xff0c;日常生活中学生对校园疫情防控方面的要求也在不断提高&#xff0c;学生的人数更是不断增加&#xff0c;使得…

虚幻5|AI视力系统,听力系统,预测系统(3)预测系统

虚幻5|AI视力系统&#xff0c;听力系统&#xff0c;预测系统&#xff08;2&#xff09;听力系统-CSDN博客 一&#xff0c;添加一个AI预感感官配置 1.选中我们的AIPerception,右侧细节添加一个AI预感感官配置&#xff0c;然后我们把所有感官的年龄都调成5&#xff0c;是所有 2…

jmeter——添加测试片段

问&#xff1a;为什么要添加测试片段&#xff1f; 答&#xff1a;在测试的过程中&#xff0c;有可能遇到这一个测试需要上一个测试为前提的情况&#xff0c;例如&#xff1a;登录之后才能下单&#xff0c;所以先要进行登录&#xff0c;因此就用到【测试片段】。 1、右键【测试…

网络协议概述,ip协议,TCP协议,udp协议,二者区别,python中用socket类实现网络通信程序的编写(服务器套接字实现TCP编程,UDP编程)

七层协议 ① ip协议 ②TCP协议 TCP协议面向连接的&#xff0c;可靠的协议&#xff0c;有三次握手来保证可靠性 ③ udp协议 不一定可以保证数据发过去&#xff0c;像发短信一样&#xff0c;对方不一定在线&#xff0c;号码也不一定对 TCP,UDP之间存在一些区别&#xff1a…

JavaSocket编程

一、JavaSocket编程 1.1HTTP协议 后端原理 2. 特点 同步&#xff1a;就是两个任务执行的过程中&#xff0c;其中一个任务要等另一个任务完成某各阶段性工作才能继续执行&#xff0c;如厨师A炒番茄&#xff0c;将葱花放入锅中&#xff0c;然后需要放入番茄&#xff0c;但是厨…

【计算机系统基础读书笔记】1.1.3 程序和指令的执行过程

冯诺依曼结构计算机的功能通过执行程序实现&#xff0c;程序的执行过程就算所包含的指令的执行过程。 指令&#xff08;instruction&#xff09;是用0和1表示的一串0/1序列&#xff0c;用来指示CPU完成一个特定的原子操作。 指令&#xff08;instruction&#xff09;在计算机科…

Redis 键值型数据库

一、Redis是什么 Redis&#xff1a;REmote DIctionary Server&#xff08;远程字典服务器&#xff09; 是完全开源免费的&#xff0c;用C语言编写的&#xff0c;遵守BSD协议&#xff0c;是一个高性能的&#xff08;Key/Value&#xff09;分布式内存数据 库&#xff0c;基于内存…

悟空大爆,OZON有哪些悟空产品推荐

Top1 减压玩具 Электронный поп ит пикачу Pop It антистресс 商品id&#xff1a;1592564066 月销量&#xff1a;811 OZON有哪些悟空产品&#xff0c;详情看工具&#xff1a;D。DDqbt。COm/74rD 此款减压玩具以其独特的设计&#xff0c;为…

保姆级教程!奶奶都能学会的Mac本地部署Stable Diffusion教程

一、为什么选择Stable-diffusion 举一个简单的例子&#xff0c;Midjourney和Stable diffusion在照片处理领域就好比是“美图秀秀”和“PS”&#xff1b;在短视频制作领域&#xff0c;就好比是“剪映”和“PR”。 这样说是不是更容易理解了&#xff0c;如果你是新手只想单纯的…

最高身高(c语言)

1.//描述 //KiKi想从n行m列的方阵队列中找到身高最高的人的位置&#xff0c;请你帮助他完成这个任务。 // //输入描述&#xff1a; //第一行包含两个整数n和m&#xff0c;表示这个方阵队列包含n行m列。从2到n 1行&#xff0c; // 每行输入m个整数&#xff08;范围 - 231~231 -…

当黑神话遇上AI:悟空背后的策划逆袭战

声明&#xff1a;此篇为 ai123.cn 原创文章&#xff0c;转载请标明出处链接&#xff1a;https://ai123.cn/2192.html 哈喽&#xff0c;亲爱的游戏迷&#xff0c;随着《黑神话&#xff1a;悟空》的上线&#xff0c;大家都在忙着“直面天命”了吧&#xff1f;今天我想和大家分享最…

基于Java爬取微博数据(四) 获取 图片 or 视频

基于Java爬取微博数据四 获取 图片 or 视频 图片 or 视频转存 图片 or 视频注意点 前面已经讲述了基于 Java 爬取微博正文列表内容&#xff0c;微博用户主页内容以及导出爬取到的微博数据等操作&#xff0c;那么下面讲述一下如何处理微博正文中的图片/视频等内容。 图片 or 视…

linux笔记1

命令格式 命令行界面的提示符解析&#xff1a; [rootlocalhost ~]# root位置&#xff1a; 登录用户名 &#xff1a; 连接符号 localhost位置: 本机的主机名 ~位置: 当前的所在位置 #位置&#xff1a; 表示是超级管理员还是普通用户 超级管…

Cesium 自定义MaterialProperty原理解析

MaterialProperty是一个抽象接口类&#xff0c;它定义了Entity图元的材质要实现的属性和函数。这些属性和函数主要是cesium 内部调用&#xff0c;用于减少cesium 内部对材质的重复创建和缓存&#xff0c;减少内存开销。 1. Property 类 Property类是所有属性的抽象接口类&…

B2B⼤宗电商交易系统功能案例分析

B2B大宗电商交易系统是构建高效、安全、可扩展电子商务平台的重要基石。以下是对该系统后端架构与关键功能的详细解析&#xff1a; 后端架构 B2B大宗电商交易系统的后端架构通常涉及多个关键组件和技术&#xff0c;以确保系统的稳定运行和高效处理。主要组成部分包括&#xff…

UE4编安卓时Core模块为何只include Android文件夹?

Core模块 Core模块是整个引擎中最核心的模块。几乎UE4中的每个其他模块都导入Core。Engine\Source\Runtime\Core\Private下有很多文件夹&#xff0c;下面罗列一部分&#xff1a; G:\St\EngineSource\Engine\Source\Runtime\Core\Private 的目录 2024/07/18 12:02 <DIR…

AOC U27U2P创作设计旗舰——传递情感,用色彩说话!

摘要&#xff1a;每一次设计都是一种表达&#xff0c;每一次创作都是一次成长 并不是所有的路在一开始走的时候&#xff0c;都能找到正确的方向。对于设计师而言&#xff0c;在创作与设计的道路上&#xff0c;亦是如此。灵感的枯竭、无休止的改稿、色彩的偏差等等&#xff0c;…

基于springboot的校园失物招领系统--论文pf

TOC springboot483基于springboot的校园失物招领系统--论文pf 第1章 绪论 1.1 课题背景 二十一世纪互联网的出现&#xff0c;改变了几千年以来人们的生活&#xff0c;不仅仅是生活物资的丰富&#xff0c;还有精神层次的丰富。在互联网诞生之前&#xff0c;地域位置往往是人…

Linux yum提示Error downloading packages

很明显的错误&#xff0c;没有考虑过磁盘空间&#xff0c;记录一下。 Error downloading packages:gcc-4.8.5-44.el7.x86_64: Insufficient space in download directory /var/cache/yum/x86_64/7/base/packages* free 0 * needed 16 M使用du查看当前目录下所有文件大小 du …

mac安装ipa包【金铲铲为例】

mac安装ipa包 安装PlayCover 链接&#xff1a;https://github.com/PlayCover/PlayCover 1、点最新Releases 2、cmd ↓&#xff0c;拉到最下面下载dmg 3、安装 图标拖拽到Applications里 IPA下载 以金铲铲为例&#xff0c;良心砸壳包站点&#xff0c;有能力可以支持一下…