井字棋游戏(HTML+CSS+JavaScript)

news2024/11/24 12:47:12

  🌏个人博客主页:心.c

前言:这两天在写植物大战僵尸,写不动了,现在和大家分享一下之前我写的一个很简单的小游戏井字棋,这个没有AI,可以两个人一起玩,如果大家觉得我哪里写的有一些问题,还希望积极改正,欢迎大家留言

🔥🔥🔥专题文章:JavaScript小游戏

😽感谢大家的点赞👍收藏⭐️评论✍您的一键三连是我更新的动力 💓 


目录

页面效果: 

 相关技能实现:

创建空数组:

 获得大盒子和小盒子对象:

 给大盒子添加事件监听:

 判断小格子是否被填满:

判断是否有一方成功:

 判断数组中存在的数的个数:

 更新页面:

源代码:

HTML

CSS

 JavaScript:


页面效果: 

关于应用就是不可重复添加,而且两次点击的表情是不一样的,每个表情代表一方,出现三连的那一方就赢了,每一个小方格是不可重复添加的,如果每个格子都填满了就平局成功或平局都会出现alert提示,然后页面清空,清空之后可以继续玩

 相关技能实现:

创建空数组:

空数组用来遍历(通过其值是1是2或是null)来放置我们的表情 

  const arr = Array(9).fill(null)
 获得大盒子和小盒子对象:
 let box = this.document.querySelector('.box')
 let small_boxes = this.document.querySelectorAll('.small')
 给大盒子添加事件监听:

给我们的大盒子添加点击事件,冒泡到子级,通过1和2的个数,来添加1或2,谁少添加谁,优先添加1,如果1和2的个数有一个大于3,可能出现一方胜利的情况,就添加winner方法进行判断,如果有一方胜利,就返回这一方,然后页面进行清空(通过返回的1还是2进行判断是谁胜利了)如果一直没有胜利,直到小方格都被填写完,算两方平局,页面就会被清空,就可以重新进行添加了

box.addEventListener('click', function (e) {
    if (e.target.tagName === 'DIV') {
      let id = +e.target.dataset.id
      if (getCount(arr, 1) <= getCount(arr, 2)) {
        if (arr[id - 1] === null) {
          arr[id - 1] = 1
          console.log(arr)
          render()
        } else {
          alert('请在空白处添加')
        }
      } else {
        if (arr[id - 1] === null) {
          arr[id - 1] = 2
          console.log(arr)
          render()
        } else {
          alert('请在空白处添加')
        }
      }
      //判断是否被填满
      if (allSet()) {
        let time0 = setTimeout(function () {
          alert('平局')
          arr.fill(null)
          small_boxes.forEach(function (small_box) {
            console.log(small_box)
            small_box.innerHTML = ''; // 清空每个文本框
          });
          clearTimeout(time0)
        }, 300)
      }

      //判断是否有一方赢
      if (getCount(arr, 1) >= 3 || getCount(arr, 2) >= 3) {
        let time = setTimeout(function () {

          let win = winner()
          if (win != -1) {
            if (win === 1) {
              alert('笑脸成功')
            } else if (win === 2) {
              alert('哭脸成功')
            }
            arr.fill(null)
            small_boxes.forEach(function (small_box) {
              console.log(small_box)
              small_box.innerHTML = ''; // 清空每个文本框
            });
            clearTimeout(time)
          }
        }, 400)
      }
    }
  })
 判断小格子是否被填满:

遍历数组arr的每个值,如果该值有一个为null,就返回false,如果都不为false,最后返回true 

function allSet() {
    for (let i of arr) {
      if (i == null) {
        return false
      }
    }
    return true
  }
判断是否有一方成功:

 这个游戏虽然是3×3方格,但是是用一维数组存储的,如果下面有一对(三个)下标的值相等,就返回其中一个下标的值

//判断是否成功
  function winner() {
    const winningCombinations = [
      [0, 1, 2], [3, 4, 5], [6, 7, 8],
      [0, 3, 6], [1, 4, 7], [2, 5, 8],
      [0, 4, 8], [2, 4, 6]
    ];

    for (let combo of winningCombinations) {
      if (arr[combo[0]] && arr[combo[0]] === arr[combo[1]] && arr[combo[1]] === arr[combo[2]]) {
        return arr[combo[0]];
      }
    }

    return -1;
  }
 判断数组中存在的数的个数:

这个方法就是为了判断1和2的个数 

//返回某个数存在的个数
  function getCount(arr, value) {
    return arr.filter(item => item === value).length;
  }
 更新页面:

遍历数组向每个小方格添加内容,如果为1,添加笑脸,如果为2,添加哭脸,如果为null,什么也不添加,数组和方格是一一对应的 

 function render() {
    small_boxes.forEach(function (small_box) {
      small_box.innerHTML = ''; // 清空每个文本框
    });
    for (let i = 0; i < 9; i++) {
      let smal = document.querySelector(`[data-id="${i + 1}"]`)
      if (arr[i] === 1) {
        smal.innerHTML = '&#xe68b;'
      }
      else if (arr[i] === 2) {
        smal.innerHTML = '&#xe68e;'
      } else {
        smal.innerHTML = ''
      }
    }
  }

源代码:

HTML:
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <link rel="stylesheet" href="./iconfont/iconfont.css">
  <link rel="stylesheet" href="./game.css">
</head>

<body>
  <div class="box wrapper">
    <div class="small iconfont" data-id="1"></div>
    <div class="small iconfont" data-id="2"></div>
    <div class="small iconfont" data-id="3"></div>
    <div class="small iconfont" data-id="4"></div>
    <div class="small iconfont" data-id="5"></div>
    <div class="small iconfont" data-id="6"></div>
    <div class="small iconfont" data-id="7"></div>
    <div class="small iconfont" data-id="8"></div>
    <div class="small iconfont" data-id="9"></div>
  </div>
  <div class="text">
    <h1>----井字棋----</h1>
  </div>


  <script src="./game.js"></script>
</body>

</html>
CSS:
:root {
  --bgc: rgb(223, 225, 248);
}

.wrapper {
  margin: auto;
}

* {
  margin: 0;
  height: 0;
  box-sizing: border-box;
}

.body {
  user-select: none;
  background-color: #f6faff;
}

.box {
  user-select: none;
  margin-top: 20px;
  display: flex;
  flex-wrap: wrap;
  width: 570px;
  height: 570px;
  border: 12px solid var(--bgc);
  border-radius: 40px;
  background-color: #ffffff;
}

.small {
  font-size: 120px;
  color: rgb(183, 190, 227);
  line-height: 182px;
  text-align: center;
  user-select: none;
  width: 182px;
  height: 182px;
  cursor: pointer;
}

.small:nth-child(1),
.small:nth-child(2),
.small:nth-child(4),
.small:nth-child(5) {
  border-right: 12px solid var(--bgc);
  border-bottom: 12px solid var(--bgc);
}

.small:nth-child(3),
.small:nth-child(6) {
  border-bottom: 12px solid var(--bgc);
}

.small:nth-child(7),
.small:nth-child(8) {
  border-right: 12px solid var(--bgc);
}

.text {
  text-align: center;
  color: var(--bgc);
}
 JavaScript:
window.addEventListener('load', function () {
  const arr = Array(9).fill(null)

  let box = this.document.querySelector('.box')
  let small_boxes = this.document.querySelectorAll('.small')
  box.addEventListener('click', function (e) {
    if (e.target.tagName === 'DIV') {
      let id = +e.target.dataset.id
      if (getCount(arr, 1) <= getCount(arr, 2)) {
        if (arr[id - 1] === null) {
          arr[id - 1] = 1
          console.log(arr)
          render()
        } else {
          alert('请在空白处添加')
        }
      } else {
        if (arr[id - 1] === null) {
          arr[id - 1] = 2
          console.log(arr)
          render()
        } else {
          alert('请在空白处添加')
        }
      }
      //判断是否被填满
      if (allSet()) {
        let time0 = setTimeout(function () {
          alert('平局')
          arr.fill(null)
          small_boxes.forEach(function (small_box) {
            console.log(small_box)
            small_box.innerHTML = ''; // 清空每个文本框
          });
          clearTimeout(time0)
        }, 300)
      }

      //判断是否有一方赢
      if (getCount(arr, 1) >= 3 || getCount(arr, 2) >= 3) {
        let time = setTimeout(function () {

          let win = winner()
          if (win != -1) {
            if (win === 1) {
              alert('笑脸成功')
            } else if (win === 2) {
              alert('哭脸成功')
            }
            arr.fill(null)
            small_boxes.forEach(function (small_box) {
              console.log(small_box)
              small_box.innerHTML = ''; // 清空每个文本框
            });
            clearTimeout(time)
          }
        }, 400)
      }
    }
  })

  function allSet() {
    for (let i of arr) {
      if (i == null) {
        return false
      }
    }
    return true
  }

  function render() {
    small_boxes.forEach(function (small_box) {
      small_box.innerHTML = ''; // 清空每个文本框
    });
    for (let i = 0; i < 9; i++) {
      let smal = document.querySelector(`[data-id="${i + 1}"]`)
      if (arr[i] === 1) {
        smal.innerHTML = '&#xe68b;'
      }
      else if (arr[i] === 2) {
        smal.innerHTML = '&#xe68e;'
      } else {
        smal.innerHTML = ''
      }
    }
  }

  //判断是否成功
  function winner() {
    const winningCombinations = [
      [0, 1, 2], [3, 4, 5], [6, 7, 8],
      [0, 3, 6], [1, 4, 7], [2, 5, 8],
      [0, 4, 8], [2, 4, 6]
    ];

    for (let combo of winningCombinations) {
      if (arr[combo[0]] && arr[combo[0]] === arr[combo[1]] && arr[combo[1]] === arr[combo[2]]) {
        return arr[combo[0]];
      }
    }

    return -1;
  }


  //返回某个数存在的个数
  function getCount(arr, value) {
    return arr.filter(item => item === value).length;
  }

}
)

 到这里就讲完了,感谢大家的观看!!!

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

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

相关文章

【Redis】Linux CentOS Redis 的安装—(一)

Redis 一、获取源二、解压编译 一、获取源 //redis-stable是最新稳定版 wget https://download.redis.io/redis-stable.tar.gz二、解压编译 //我指定目录/app tar -xzvf redis-stable.tar.gz -C /appcd /app/redis-stablemake && make install##三 、修改配置启动 …

重复的子字符串 | LeetCode-459 | 字符串匹配 | KMP | 双指针

&#x1f64b;大家好&#xff01;我是毛毛张! &#x1f308;个人首页&#xff1a; 神马都会亿点点的毛毛张 &#x1f579;️KMP练习题 &#x1f4cc;LeetCode链接&#xff1a;459. 重复的子字符串 文章目录 1.题目描述&#x1f34d;2.题解&#x1fad0;2.1 暴力解法&#x1…

enhanced Input Action IA_Look中Action value引脚没有分割结构体引脚的选项

UE5系列文章目录 文章目录 UE5系列文章目录前言二、使用步骤解决办法 前言 据说&#xff0c;unreal engine5中准备废弃“项目设置”中“输入”&#xff0c;操作映射&#xff0c;轴映射。取而代之的是&#xff1a; 使用增强的输入动作&#xff08;Enhanced Input Actions&#…

【QT】Qt SDK的下载,安装和环境配置

目录 一&#xff0c;Qt SDK的下载二&#xff0c;Qt SDK的安装三&#xff0c;验证Qt SDK安装是否成功四&#xff0c;Qt环境变量配置 一&#xff0c;Qt SDK的下载 进入下面两个网站都可以进行下载&#xff1a; Qt 下载官⽹ 国内清华源 进⼊官⽹&#xff0c;按如下图⽰进⾏相应…

Allegro如何导入DXF结构文件并生成板框(1)?

在用Allegro进行PCB设计时,需要导入DXF结构文件,由此来生成PCB的板框。 本节先讲Allegro如何导入DXF结构文件?下节讲如何利用导入的DXF结构文件生成OUTLINE板框。 Allegro如何导入DXF结构文件并生成板框(2)?-CSDN博客 详细操作方法如下: 1、选择菜单栏File 选择Import…

【EI会议】第三届环境工程与可持续能源国际会议征稿开启

第三届环境工程与可持续能源国际会议&#xff08;EESE 2024&#xff09;将于2024年12月20日至21日在湖南长沙召开&#xff0c;诚挚邀请相关领域学者、专家加入会议&#xff0c;开展学术讨论和研究&#xff0c;共同助推环境工程与可持续能源产学研领域的进步&#xff01; 征稿主…

SDK does not contain ‘libarclite‘ at the path

Xcode15运行报错:SDK does not contain libarclite at the path /Applications/Xcode.app/Contents/ Developer/Toolchains/XcodeDefault.xctoolchain/us/lib/arc/libarclite_iphoneos.a 如下图: 阅读报错信息,它的意思是 SDK没有包含 libarclite 这个文件,这个文件的路径是: …

基于 face_recognition 的人脸识别的小工具

使用 face_recognition 和 pyside2&#xff0c;开发了一个小工具&#xff0c;识别指定的人脸照片&#xff0c;保存到指定的文件夹。 源码如下&#xff1a; import sys import os import shutil import face_recognition import logging from PySide2.QtWidgets import QApplic…

PDF文件转换为HTML文件

推荐使用 pdf2htmlEX&#xff08;因为确实做的比较全&#xff09; pdf2htmlEX 是一个开源工具&#xff0c;可以将PDF文件转换为HTML文件。你需要先安装pdf2htmlEX工具&#xff0c;并确保它在你的系统路径中可用。&#xff08;花时间最多就是找包&#xff09; 安装 pdf2htmlEX …

API以及添加学生信息练习

API:应用程序编程接口 简单理解&#xff1a;API就是别人已经写好的东西&#xff0c;我们不需要自己编写&#xff0c;直接使用即可 Java API&#xff1a;指的就是jdk中提供的各种功能的Java类&#xff0c;这些类将底层的实现封装起来&#xff0c;我们不需关心这些类是如何实现的…

什么是神中神公司?发表内卷言论,分分钟要你道歉...

谷歌 海的那边&#xff0c;这几天最乐的新闻&#xff0c;是谷歌前 CEO 批评员工不拼命工作后道歉。 今年 4 月&#xff0c;谷歌前 CEO 埃里克施密特&#xff08;Eric Schmidt&#xff09;在斯坦福大学的一次演讲中&#xff0c;被问及 OpenAI 和 Anthropic 等初创公司目前在人工…

【全面解析】芯片采购渠道策略:原厂直采VS代理VS现货市场

芯片作为现代科技的基石&#xff0c;其重要性不言而喻。无论是智能手机、汽车电子、物联网设备还是高性能计算领域&#xff0c;都离不开芯片的支持。随着5G、AI、大数据等前沿技术的飞速发展&#xff0c;对芯片的需求量持续攀升&#xff0c;如何确保稳定、高效的芯片供应链成为…

A3VLM: Actionable Articulation-Aware Vision Language Model

发表时间&#xff1a;13 Jun 2024 作者单位&#xff1a;SJTU Motivation&#xff1a;以往的机器人VLM如RT-1[4]、RT-2[3]和ManipLLM[21]都专注于直接学习以机器人为中心的动作。这种方法需要收集大量的机器人交互数据&#xff0c;这在现实世界中非常昂贵。 解决方法&#xf…

数据中台之数据开发-离线开发和实时开发

目录 一、离线开发 1.1 概述 1.2 作业调度 1.3 基线控制 1.4 异构存储 1.5 代码校验 1.6 多环境级联 1.7 推荐依赖 1.8 数据权限 二、实时开发 2.1 概述 2.2 实时计算的特点 2.2.1 实时且无界(unbounded)的数据流 2.2.2 持续且高效的计算 2.2.3 流式且实时的数据…

go,gin封装gorm使用,增删改查

1、主 package mainimport ("fmt""wbGo/configs" )type Dades struct {Id intName stringAge int }func main() {//连接数据库configs.BaseName("wbrj_sample")var data []Dades//查询configs.Db.Raw("select * from dade where id>…

机器学习/深度学习——关于分类任务的机器学习、深度学习模型的评估指标详解

机器学习/深度学习——模型的评估详解 搭配以下文章进行学习&#xff1a; 卷积神经网络&#xff1a; 深度学习——卷积神经网络&#xff08;convolutional neural network&#xff09;CNN详解&#xff08;一&#xff09;——概述. 步骤清晰0基础可看 深度学习——卷积神经网…

Ciallo~(∠・ω・ )⌒☆第十七篇 Ubuntu基础使用 其一

Ubuntu是一种基于Linux的操作系统&#xff0c;它是开源的、免费的&#xff0c;并且具有广泛的用户群体。 基本文件操作&#xff1a;Ubuntu使用命令行工具来进行文件操作。以下是一些常用的命令&#xff1a; 切换到用户主目录&#xff1a; cd ~ 切换到上级目录&#xff1a; cd .…

QT 数据导出到Excel

原创&#xff1a;QT 数据导出到Excel 在Qt自带的axcontainer模块中&#xff0c;我们可以使用QAxObject类来将数据保存到Excel中。Qt中将数据保存到Excel通常有两种方式&#xff1a;一种是以Excel格式导出&#xff0c;需要电脑上安装Office软件&#xff1b;另一种是以CSV格式导出…

用户端是小程序,后台管理系统是PC端的CMS系统

1. 数据库表设计 1.1 课程轮播图表 CREATE TABLE course_banners (id int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 轮播图主键,image_url varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 轮播图图片链接,title varchar(255) CHARAC…

高考志愿智能推荐系统-计算机毕设Java|springboot实战项目

&#x1f34a;作者&#xff1a;计算机毕设残哥 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目、 源…