国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

康威生命游戲的簡(jiǎn)單實(shí)現(xiàn)

ccj659 / 3740人閱讀

摘要:生命游戲,數(shù)學(xué)家發(fā)明的一個(gè)游戲,又稱(chēng)康威生命演化,生命棋,細(xì)胞自動(dòng)機(jī)。康威有許多好玩有趣的發(fā)明,最廣為人知的一個(gè)是外觀數(shù)列,這里不多說(shuō),另一個(gè)就是生命游戲。生命游戲模擬的是二維平面上生命的演化過(guò)程。

生命游戲,數(shù)學(xué)家 John Conway 發(fā)明的一個(gè)游戲,又稱(chēng)康威生命演化,生命棋,細(xì)胞自動(dòng)機(jī)。

康威有許多好玩有趣的發(fā)明,最廣為人知的一個(gè)是外觀數(shù)列(Look-and-Say),這里不多說(shuō),另一個(gè)就是生命游戲(Game-of-Life)。

關(guān)于康威,摘錄一段 Wikipedia 的敘述:

約翰·何頓·康威(John Horton Conway,1937年12月26日-),生於英國(guó)利物浦,數(shù)學(xué)家,活躍於有限群的研究、趣味數(shù)學(xué)、紐結(jié)理論、數(shù)論、組合博弈論和編碼學(xué)等範(fàn)疇。
康威年少時(shí)就對(duì)數(shù)學(xué)很有強(qiáng)烈的興趣:四歲時(shí),其母發(fā)現(xiàn)他背誦二的次方;十一歲時(shí),升讀中學(xué)的面試,被問(wèn)及他成長(zhǎng)後想幹甚麼,他回答想在劍橋當(dāng)數(shù)學(xué)家。後來(lái)康威果然於劍橋大學(xué)修讀數(shù)學(xué),現(xiàn)時(shí)為普林斯頓大學(xué)的教授。

生命游戲模擬的是二維平面上生命的演化過(guò)程。

規(guī)則很簡(jiǎn)單:每個(gè)細(xì)胞有兩種狀態(tài)--存活或死亡,每個(gè)細(xì)胞與以自身為中心的周?chē)烁窦?xì)胞產(chǎn)生互動(dòng)。

如果一個(gè)活細(xì)胞周?chē)?至3個(gè)活細(xì)胞,在下一個(gè)階段繼續(xù)存活,否則死亡;

如果一個(gè)死細(xì)胞周?chē)?個(gè)活細(xì)胞,在下一個(gè)階段將變成活細(xì)胞,否則繼續(xù)保持死亡

康威生命游戲是簡(jiǎn)單規(guī)則產(chǎn)生復(fù)雜變化的典型例子。在演變過(guò)程中,可以看到一些非常美妙的變化,和一些優(yōu)美的幾何圖形。

下面是用 HTML5 Canvas 實(shí)現(xiàn)的一個(gè)簡(jiǎn)單版本

源碼:https://github.com/mirreal/moon9/tree/master/GameOfLife

DEMO:http://mirreal.net/game-of-life/

JS代碼如下:

function Game() {
  this.stones = [];
  this.canvas = new Canvas();

  this.init();
}

Game.prototype.init = function() {
  var self = this;

  this.createRandomStones();
  this.draw();

  this.getAroundStones();

  this.eventHandler();
  
  this.loop = setInterval(function() {
    self.update();
    self.draw();
  }, 120);
};

Game.prototype.eventHandler = function() {
  var self = this;

  var snapshotButton = document.getElementById("snapshotButton"),
      snapshotImageElement = document.getElementById("snapshotImageElement"),
      canvas = document.getElementById("canvas");

  snapshotButton.onclick = function(event) {
    event.preventDefault();

    if (snapshotButton.innerHTML == "Snapshot") {
      clearInterval(self.loop);
      var dataUrl = canvas.toDataURL();
      snapshotImageElement.src = dataUrl;
      snapshotImageElement.style.display = "inline";
      canvas.style.display = "none";
      snapshotButton.innerHTML = "Continue";
    } else {
      self.loop = setInterval(function() {
        self.update();
        self.draw();
      }, 800);
      canvas.style.display = "inline";
      snapshotImageElement.style.display = "none";
      snapshotButton.innerHTML = "Snapshot";
    }
  };
};

Game.prototype.createRandomStones = function() {
  for (var i = 0; i < 32; i++) {
    for (var j = 0; j < 32; j++) {
      var status = Math.random() < 0.2 ? true : false;
      this.stones.push(new Stone({x: i, y: j}, status))
    }
  }
};

Game.prototype.draw = function() {
  var self = this;

  this.canvas.drawGrid("lightgrey", 20, 20);
  this.stones.forEach(function(stone) {
    if (stone.status === true) {
      self.canvas.drawStone(stone);
    }
  });
};

Game.prototype.getAroundStones = function() {
  var self = this;

  this.stones.forEach(function(stone) {
    stone.around.forEach(function(position) {
      stone.aroundStones.push(self.stones[32*position.x + position.y]);
    });
  });
};

Game.prototype.update = function() {
  var self = this;

  this.stones.forEach(function(stone) {
    stone.aroundStones.forEach(function(s) {
      if (s.status === true) stone.aliveCount += 1;
    });

    if (stone.status === true) {
      if (stone.aliveCount === 2 || stone.aliveCount === 3) {
        stone.nextStatus = true;
      } else {
        stone.nextStatus = false;
      }
    } else {
      if (stone.aliveCount === 3) stone.nextStatus = true;
      else stone.nextStatus = false;
    }
  });

  this.stones.forEach(function(stone) {
    stone.status = stone.nextStatus;
    stone.aliveCount = 0;
  });
}




function Stone(position, status) {
  this.x = position.x;
  this.y = position.y;

  this.status = status;
  this.nextStatus = false;

  this.aroundStones = [];
  this.aliveCount = 0;

  this.around = [];
  this.getAround();
}

Stone.prototype.getAround = function() {
  for (var i = this.x-1; i <= this.x+1; i++) {
    for (var j = this.y-1; j <= this.y+1; j++) {
      if (i == this.x && j == this.y) continue;
      if (i < 0 || i >= 32) continue;
      if (j < 0 || j >= 32) continue;
      this.around.push({x: i, y: j});
    }
  }
};


function Canvas() {
  this.canvas = document.getElementById("canvas");
  this.context = canvas.getContext("2d");
}

Canvas.prototype.drawGrid = function(color, stepx, stepy) {
  var canvas = this.canvas;
  var ctx = this.context;

  ctx.clearRect(0, 0, canvas.width, canvas.height);
  ctx.save();
  ctx.strokeStyle = color;
  ctx.lineWidth = 0.5;

  for (var i = stepx + 0.5; i < ctx.canvas.width; i += stepx) {
    ctx.beginPath();
    ctx.moveTo(i, 0);
    ctx.lineTo(i, ctx.canvas.height);
    ctx.stroke();
    ctx.closePath();
  }
  
  for (var i = stepy + 0.5; i < ctx.canvas.height; i += stepy) {
    ctx.beginPath();
    ctx.moveTo(0, i);
    ctx.lineTo(ctx.canvas.width, i);
    ctx.stroke();
    ctx.closePath();
  }
  ctx.restore();
};

Canvas.prototype.drawStone = function(stone) {
  var ctx = this.context;

  var x = 20 * stone.x + 10;
  var y = 20 * stone.y + 10;

  ctx.fillStyle = "orange";
  ctx.beginPath();
  ctx.arc(x, y, 9, 0, Math.PI*2, false);
  ctx.closePath();
  ctx.fill();
};

new Game();

TIPS:

在Google搜索 Conway"s Game of Life ,會(huì)看到Google的一個(gè)實(shí)現(xiàn)。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/85293.html

相關(guān)文章

  • 簡(jiǎn)單好玩】細(xì)胞自動(dòng)機(jī)小游戲

    摘要:當(dāng)前細(xì)胞為存活狀態(tài)時(shí),當(dāng)周?chē)袀€(gè)以上的存活細(xì)胞時(shí),該細(xì)胞變成死亡狀態(tài)。康威生命游戲的自由有了核心的算法游戲規(guī)則,康威生命就是一個(gè)具有生命的自由游戲。文件導(dǎo)出導(dǎo)入當(dāng)然加了擴(kuò)展功能,保存自己喜歡的細(xì)胞自動(dòng)機(jī)成文件。 細(xì)胞自動(dòng)機(jī) 備注:文末有自己用Javascript簡(jiǎn)單實(shí)現(xiàn)的網(wǎng)頁(yè)版細(xì)胞自動(dòng)機(jī)(還挺好玩) 什么是細(xì)胞自動(dòng)機(jī) showImg(https://segmentfault.com/i...

    yagami 評(píng)論0 收藏0
  • 網(wǎng)易容器云平臺(tái)微服務(wù)化實(shí)踐(一)

    摘要:本文是網(wǎng)易容器云平臺(tái)的微服務(wù)化實(shí)踐系列文章的第一篇。網(wǎng)易容器云平臺(tái)的前身是網(wǎng)易應(yīng)用自動(dòng)部署平臺(tái),它能夠利用云提供的基礎(chǔ)設(shè)施,實(shí)現(xiàn)包括構(gòu)建和部署一體化在內(nèi)的整個(gè)應(yīng)用生命周期管理。目前網(wǎng)易云容器服務(wù)團(tuán)隊(duì)以的方式管理著微服務(wù),每周構(gòu)建部署次數(shù)。 此文已由作者馮常健授權(quán)網(wǎng)易云社區(qū)發(fā)布。 歡迎訪問(wèn)網(wǎng)易云社區(qū),了解更多網(wǎng)易技術(shù)產(chǎn)品運(yùn)營(yíng)經(jīng)驗(yàn)。 摘要:網(wǎng)易云容器平臺(tái)期望能給實(shí)施了微服務(wù)架構(gòu)的團(tuán)隊(duì)提供完...

    zhjx922 評(píng)論0 收藏0
  • FCC 成都社區(qū)·前端周刊 第 10 期

    摘要:正式發(fā)布在過(guò)去的一周,正式發(fā)布,帶來(lái)大量改進(jìn)和修復(fù)。這是自開(kāi)展以來(lái)的第七個(gè)主要版本,并將在年月成為下一個(gè)分支。以后,如果使用具有已知安全問(wèn)題的代碼,的用戶(hù)會(huì)收到警告通知。將自動(dòng)檢查針對(duì)數(shù)據(jù)庫(kù)的安裝請(qǐng)求,并在代碼包含漏洞時(shí)發(fā)出警告通知。 1. Node.js 10 正式發(fā)布 在過(guò)去的一周,Node.js 10.0.0 正式發(fā)布,帶來(lái)大量改進(jìn)和修復(fù)。這是自 Node.js Foundati...

    BigNerdCoding 評(píng)論0 收藏0
  • FCC 成都社區(qū)·前端周刊 第 10 期

    摘要:正式發(fā)布在過(guò)去的一周,正式發(fā)布,帶來(lái)大量改進(jìn)和修復(fù)。這是自開(kāi)展以來(lái)的第七個(gè)主要版本,并將在年月成為下一個(gè)分支。以后,如果使用具有已知安全問(wèn)題的代碼,的用戶(hù)會(huì)收到警告通知。將自動(dòng)檢查針對(duì)數(shù)據(jù)庫(kù)的安裝請(qǐng)求,并在代碼包含漏洞時(shí)發(fā)出警告通知。 1. Node.js 10 正式發(fā)布 在過(guò)去的一周,Node.js 10.0.0 正式發(fā)布,帶來(lái)大量改進(jìn)和修復(fù)。這是自 Node.js Foundati...

    li21 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<