摘要:生命游戲,數(shù)學家發(fā)明的一個游戲,又稱康威生命演化,生命棋,細胞自動機??低性S多好玩有趣的發(fā)明,最廣為人知的一個是外觀數(shù)列,這里不多說,另一個就是生命游戲。生命游戲模擬的是二維平面上生命的演化過程。
生命游戲,數(shù)學家 John Conway 發(fā)明的一個游戲,又稱康威生命演化,生命棋,細胞自動機。
康威有許多好玩有趣的發(fā)明,最廣為人知的一個是外觀數(shù)列(Look-and-Say),這里不多說,另一個就是生命游戲(Game-of-Life)。
關(guān)于康威,摘錄一段 Wikipedia 的敘述:
約翰·何頓·康威(John Horton Conway,1937年12月26日-),生於英國利物浦,數(shù)學家,活躍於有限群的研究、趣味數(shù)學、紐結(jié)理論、數(shù)論、組合博弈論和編碼學等範疇。
康威年少時就對數(shù)學很有強烈的興趣:四歲時,其母發(fā)現(xiàn)他背誦二的次方;十一歲時,升讀中學的面試,被問及他成長後想幹甚麼,他回答想在劍橋當數(shù)學家。後來康威果然於劍橋大學修讀數(shù)學,現(xiàn)時為普林斯頓大學的教授。
生命游戲模擬的是二維平面上生命的演化過程。
規(guī)則很簡單:每個細胞有兩種狀態(tài)--存活或死亡,每個細胞與以自身為中心的周圍八格細胞產(chǎn)生互動。
如果一個活細胞周圍有2至3個活細胞,在下一個階段繼續(xù)存活,否則死亡;
如果一個死細胞周圍有3個活細胞,在下一個階段將變成活細胞,否則繼續(xù)保持死亡
康威生命游戲是簡單規(guī)則產(chǎn)生復雜變化的典型例子。在演變過程中,可以看到一些非常美妙的變化,和一些優(yōu)美的幾何圖形。
下面是用 HTML5 Canvas 實現(xià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 ,會看到Google的一個實現(xiàn)。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/85293.html
摘要:當前細胞為存活狀態(tài)時,當周圍有個以上的存活細胞時,該細胞變成死亡狀態(tài)。康威生命游戲的自由有了核心的算法游戲規(guī)則,康威生命就是一個具有生命的自由游戲。文件導出導入當然加了擴展功能,保存自己喜歡的細胞自動機成文件。 細胞自動機 備注:文末有自己用Javascript簡單實現(xiàn)的網(wǎng)頁版細胞自動機(還挺好玩) 什么是細胞自動機 showImg(https://segmentfault.com/i...
摘要:本文是網(wǎng)易容器云平臺的微服務化實踐系列文章的第一篇。網(wǎng)易容器云平臺的前身是網(wǎng)易應用自動部署平臺,它能夠利用云提供的基礎(chǔ)設(shè)施,實現(xiàn)包括構(gòu)建和部署一體化在內(nèi)的整個應用生命周期管理。目前網(wǎng)易云容器服務團隊以的方式管理著微服務,每周構(gòu)建部署次數(shù)。 此文已由作者馮常健授權(quán)網(wǎng)易云社區(qū)發(fā)布。 歡迎訪問網(wǎng)易云社區(qū),了解更多網(wǎng)易技術(shù)產(chǎn)品運營經(jīng)驗。 摘要:網(wǎng)易云容器平臺期望能給實施了微服務架構(gòu)的團隊提供完...
摘要:正式發(fā)布在過去的一周,正式發(fā)布,帶來大量改進和修復。這是自開展以來的第七個主要版本,并將在年月成為下一個分支。以后,如果使用具有已知安全問題的代碼,的用戶會收到警告通知。將自動檢查針對數(shù)據(jù)庫的安裝請求,并在代碼包含漏洞時發(fā)出警告通知。 1. Node.js 10 正式發(fā)布 在過去的一周,Node.js 10.0.0 正式發(fā)布,帶來大量改進和修復。這是自 Node.js Foundati...
摘要:正式發(fā)布在過去的一周,正式發(fā)布,帶來大量改進和修復。這是自開展以來的第七個主要版本,并將在年月成為下一個分支。以后,如果使用具有已知安全問題的代碼,的用戶會收到警告通知。將自動檢查針對數(shù)據(jù)庫的安裝請求,并在代碼包含漏洞時發(fā)出警告通知。 1. Node.js 10 正式發(fā)布 在過去的一周,Node.js 10.0.0 正式發(fā)布,帶來大量改進和修復。這是自 Node.js Foundati...
閱讀 1699·2021-11-24 09:39
閱讀 3161·2021-11-22 15:24
閱讀 3104·2021-10-26 09:51
閱讀 3293·2021-10-19 11:46
閱讀 2901·2019-08-30 15:44
閱讀 2228·2019-08-29 15:30
閱讀 2548·2019-08-29 15:05
閱讀 788·2019-08-29 10:55