HTML JavaScript 康威生命游戏

news2024/11/26 0:33:11
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>康威生命游戏</title>
  <style>
    body {
      font-family: Arial, sans-serif;
      text-align: center;
    }

    #game-board {
      display: inline-block;
      border: 1px solid black;
    }

    .cell {
      width: 15px;
      height: 15px;
      float: left;
      border:1px solid black;
      background-color: white;
    }

    .cell.alive {
      background-color: black;
    }

    button {
      margin-top: 10px;
    }
  </style>
</head>
<body>
  <h1 style="font-size: 14px;">康威生命游戏 先点击设定初始图形,再点击开始</h1>
  <div id="game-board"></div>

  <button onclick="startGame()" style="width: 50px;">开始</button>
  <button onclick="clearBoard()" style="width: 50px;">清除</button>

  <script>
    const ROWS = 30;
    const COLS = 60;
    let board = [];
    let nextBoard = [];
    let gameInterval = null; // 添加一个全局变量来存储定时器的引用  

    function initializeBoard() {
      board = [];
      nextBoard = [];

      for (let i = 0; i < ROWS; i++) {
        board[i] = [];
        nextBoard[i] = [];

        for (let j = 0; j < COLS; j++) {
          board[i][j] = false;
          nextBoard[i][j] = false;
        }
      }
    }

    function drawBoard() {
      const gameBoard = document.getElementById('game-board');
      gameBoard.innerHTML = '';

      for (let i = 0; i < ROWS; i++) {
        for (let j = 0; j < COLS; j++) {
          const cell = document.createElement('div');
          cell.className = 'cell';

          if (board[i][j]) {
            cell.classList.add('alive');
          }

          cell.addEventListener('click', () => {
            board[i][j] = !board[i][j];
            drawBoard();
          });

          gameBoard.appendChild(cell);
        }

        const br = document.createElement('br');
        gameBoard.appendChild(br);
      }
    }

    function countNeighbors(row, col) {
      let count = 0;

      for (let i = -1; i <= 1; i++) {
        for (let j = -1; j <= 1; j++) {
          if (i === 0 && j === 0) {
            continue;
          }

          const neighborRow = row + i;
          const neighborCol = col + j;

          if (
            neighborRow >= 0 &&
            neighborRow < ROWS &&
            neighborCol >= 0 &&
            neighborCol < COLS &&
            board[neighborRow][neighborCol]
          ) {
            count++;
          }
        }
      }

      return count;
    }

    function updateBoard() {
      for (let i = 0; i < ROWS; i++) {
        for (let j = 0; j < COLS; j++) {
          const neighbors = countNeighbors(i, j);

          if (board[i][j]) {
            if (neighbors < 2 || neighbors > 3) {
              nextBoard[i][j] = false;
            } else {
              nextBoard[i][j] = true;
            }
          } else {
            if (neighbors === 3) {
              nextBoard[i][j] = true;
            }
          }
        }
      }

      for (let i = 0; i < ROWS; i++) {
        for (let j = 0; j < COLS; j++) {
          board[i][j] = nextBoard[i][j];
        }
      }
    }

    function startGame() {
      // 在启动新定时器之前,检查并清除可能存在的旧定时器  
      if (gameInterval !== null) {  
        clearInterval(gameInterval);  
        gameInterval = null;  
      }  
  
      // 启动新的定时器并保存在全局变量中  
      gameInterval = setInterval(() => {  
        updateBoard();  
        drawBoard();  
      }, 300);  
    }

    function clearBoard() {
       // 清除定时器  
       if (gameInterval !== null) {  
        clearInterval(gameInterval);  
        gameInterval = null;  
      }  
      initializeBoard();
      drawBoard();
    }

    initializeBoard();
    drawBoard();
  </script>
</body>
</html>

在这里插入图片描述

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

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

相关文章

CompletableFuture超详解与实践

0.背景 一个接口可能需要调用 N 个其他服务的接口&#xff0c;这在项目开发中还是挺常见的。举个例子&#xff1a;用户请求获取订单信息&#xff0c;可能需要调用用户信息、商品详情、物流信息、商品推荐等接口&#xff0c;最后再汇总数据统一返回。 如果是串行&#xff08;按…

SpringBoot项目的三种创建方式

手动创建方式&#xff1a; ①&#xff1a;新建maven项目 ②&#xff1a;引入依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.10.RELEASE</version>&l…

近似的同态比较:简单多项式的迭代计算

参考文献&#xff1a; [Gold64] Goldschmidt R E. Applications of division by convergence[D]. Massachusetts Institute of Technology, 1964.[CKKLL19] Cheon J H, Kim D, Kim D, et al. Numerical method for comparison on homomorphically encrypted numbers[C]//Inter…

普通人开视频号小店可以吗?

我是电商珠珠 我做电商也有五六年时间了&#xff0c;天猫、快手、抖店我都做过。 其中做抖店的时间最长&#xff0c;三年的时间&#xff0c;让我从个人化做到了团队化。 在22年的时候&#xff0c;发现了视频号小店这个项目&#xff0c;并开始投入进去。 一开始&#xff0c;…

Flask:模板渲染

本文章只作为个人笔记. 文章目录 前言 一、模板渲染 二、效果 前言 模板渲染 一、模板渲染 from flask import Flask, render_templateapp Flask(__name__)app.route(/) def hello_world():return render_template("index.html")app.route("/blog/<blog_…

java中常见的一些小知识(1)

1.数组转List 1.1. Arrays.asList public class Tesr {public static void main(String[] args) {String[] ary new String[]{ "1", "a"};List<String> list Arrays.asList((ary));list.add("ddsdsa");System.out.println(list);}}但是…

【EI会议征稿通知】第六届信息科学、电气与自动化工程国际学术会议(ISEAE 2024)

第六届信息科学、电气与自动化工程国际学术会议&#xff08;ISEAE 2024&#xff09; 2024 6th International Conference on Information Science, Electrical and Automation Engineering 第六届信息科学、电气与自动化工程国际学术会议&#xff08;ISEAE 2024&#xff09;定…

代码训练营Day.27 | 39. 组合总和、40. 组合总和II、131. 分割回文串

39. 组合总和 1. LeetCode链接 . - 力扣&#xff08;LeetCode&#xff09; 2. 题目描述 3. 解法 与其他组合总和题目不同的是&#xff0c;这一次数组中的数字可以重复使用。 回溯&#xff1a; 1. 参数和返回值。参数&#xff1a;数组、遍历起点、目标值。 2. 终止条件。…

Prometheus Blackbox_exporter笔记

一、安装Promtheus 在 Prometheus 官网 Download | Prometheus 获取适用于 Linux 的 Prometheus 安 装包&#xff0c;这里我选择最新的 2.46.0 版本&#xff0c;我是 Linux 系统&#xff0c;选择下载 prometheus-2.46.0.linux-amd64.tar.gz 下载安装包&#xff1a; wget htt…

Elasticsearch:Serarch tutorial - 使用 Python 进行搜索 (三)

这个是继上一篇文章 “Elasticsearch&#xff1a;Serarch tutorial - 使用 Python 进行搜索 &#xff08;二&#xff09;” 的续篇。在今天的文章中&#xff0c;本节将向你介绍一种不同的搜索方式&#xff0c;利用机器学习 (ML) 技术来解释含义和上下文。 向量搜索 嵌入 (embed…

【Axure高保真原型】日期天数加减计算器

今天和大家分享日期天数加减计算器的原型模板&#xff0c;我们通过这个模板选择指定日期&#xff0c;然后填写需要增加或者减少的天数&#xff0c;点击确认按钮后&#xff0c;就可以计算出对应的结束日期&#xff0c;本案例提供中继器版的日期选择器&#xff0c;以及JS版的日期…

C++常见的代码操作

1.输出C版本&#xff1a;cout << __cplusplus << endl; #include <iostream>int main() { cout << __cplusplus << endl;system("pause");return 0; } 老版的话会输出199711&#xff0c;支持c11的话会输出201103 注&#xff1a;vis…

java中实现对文件高效的复制

不多说我们直接上代码&#xff1a; 这个是使用NIO包下的FileChannel和ByteBuffer进行文件的操作的&#xff0c;会比较高效。

《人生没有太晚的开始》读书笔记

目录 一、作者简介 二、如何开始作画的&#xff1f; 三、经典语句摘录 一、作者简介 摩西奶奶&#xff08;安娜玛丽罗伯逊摩西&#xff09;1860- 1961年 78岁开始学习绘画&#xff0c;93岁登上《时代》杂志封面。 摩西奶奶的一生&#xff0c;是富有传奇色彩的一生&#xf…

企业内部知识库搭建真的很重要,优秀企业必备

在瞬息万变的商界&#xff0c;知识、信息和经验的获取和流通对于企业的生存和发展至关重要。每一个员工的专业知识、经验和教训&#xff0c;都不仅仅是他们自己的财富&#xff0c;更是企业的宝贵资产。然而&#xff0c;这些散布在公司各部门&#xff0c;甚至个别员工头脑中的知…

基于ssm的高校班级同学录网站设计与实现+jsp论文

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统高校班级同学录信息管理难度大&#xff0c;容错率低&…

数环通12月产品更新:新增数据表相关功能、优化编辑器,15+应用进行更新

为了满足用户不断增长的需求&#xff0c;我们持续努力提升产品的功能和性能&#xff0c;以更好地支持用户的工作。 数环通12月的最新产品更新已经正式发布&#xff0c;带来了一系列强大的功能&#xff0c;以提升您的工作效率和系统的可靠性。 更新快速预览 新增&优化功能&a…

【Win10安装Qt6.3】安装教程_保姆级

前言 Windows系统安装Qt4及Qt5.12之前版本和安装Qt.12之后及Qt6方法是不同的 &#xff1b;因为之前的版本提供的有安装包&#xff0c;直接一路点击Next就Ok了。但Qt5.12版本之后&#xff0c;Qt公司就不再提供安装包了&#xff0c;不论是社区版&#xff0c;专业版等&#xff0c…

你的手机可以检测听力啦

我的第一部手机是医院配发给我应对急诊的诺基亚手机&#xff0c;翻盖儿的&#xff0c;只能用来打电话。但现在的手机对于一个医生来讲具备了很多超现实的功能&#xff0c;比如听觉健康管理&#xff01;在你正常的情况下&#xff0c;你未必体会到听觉障碍给你带来的困惑。但是一…

1.3号io网络

文件IO 1.文件IO是基于系统调用 2.程序每进行一次系统调用&#xff0c;就会从用户空间向内核空间进行一次切换&#xff0c;执行效率较慢 3.目的&#xff1a;由于后期进程间通信&#xff0c;如管道、套接字通信&#xff0c;都使用的是文件IO&#xff0c;所以引入文件IO操作的…