java實現細胞自動機

2021-08-02 03:07:21 字數 4039 閱讀 8410

一丶

先說說這個題目吧,還是第一次接觸這種型別的題目:生命遊戲中,對於任意細胞,規則如下:

每個細胞有兩種狀態-存活或死亡,每個細胞與以自身為中心的周圍八格細胞產生互動。

當前細胞為存活狀態時,當周圍低於2個(不包含2個)存活細胞時, 該細胞變成死亡狀態。(模擬生命數量稀少)

當前細胞為存活狀態時,當周圍有2個或3個存活細胞時, 該細胞保持原樣。

當前細胞為存活狀態時,當周圍有3個以上的存活細胞時,該細胞變成死亡狀態。(模擬生命數量過多)

當前細胞為死亡狀態時,當周圍有3個存活細胞時,該細胞變成存活狀態。 (模擬繁殖)

可以把最初的細胞結構定義為種子,當所有在種子中的細胞同時被以上規則處理後, 可以得到第一代細胞圖。按規則繼續處理當前的細胞圖,可以得到下一代的細胞圖,周而復始。

二丶 1.看到這個題目的第一反應是將整個生命環境看作乙個矩陣,其中的每乙個細胞以二維座標的形式存在於環境中,那麼這個細胞類就有三個屬性在生命遊戲中的:x座標,y座標,生命狀態。但是,這樣做了以後發現兩個問題:

1)環境邊界處的細胞生命狀態判斷實現很難。

2)細胞之間的生命狀態無法實現關聯關係。

2.之後是將單個細胞單獨做乙個(basicunit類),還是以3*3九宮格的方式判段我們抽象出來的單元細胞的生命狀態,再將其放入生命遊戲沙盤(lifegame類)中演變,當然,還是寫乙個細胞資訊類(cell類)將從basicunit類中判斷得來的細胞生命狀態和在lifegame類中的座標兩個資訊儲存起來。

3.到此,整個生命遊戲的實現邏輯就構建好了,接下來就是編碼實現的事情了。

4.編碼過程中遇到很多坑,這裡就不多提了,碰到的坑都是為了以後少進坑做貢獻。

5.下面講這三個類**貼出來(不能直接跑,用了單元測試,測試每個類的邏輯是否實現,要跑的話需要自己寫乙個run類)

basicunit類:

package org.coach.tdd.template;

/** * created by lzy on 17-6-3.

*//**

* basicunit類判斷單元細胞的生命狀態。

*/public

class

basicunit

/*** .

* 獲得單元細胞生命狀態

**@param basicunit 該細胞周圍細胞生命狀態

*@return 該細胞生命狀態

*/public

intgetunitcelltatus(int basicunit) else }}

}if (3 == numberofcell) else

if (2 == numberofcell)

return

0; }

}

cell類:

package org.coach.tdd.template;

/** * created by lzy on 17-6-3.

*//**

* cell類儲存細胞的座標,生命狀態,周圍細胞狀態。

*/public

class

cell

public

intgetlocation_x()

public

intgetlocation_y()

public

intgetcellstatus()

public

void

setcellstatus(int cellstatus)

/*** 獲取更新後的細胞狀態

**@return

*/public

intgetafterturncellstatus()

}

lifegame類:

package org.coach.tdd.template;

/** * created by lzy on 17-6-3.

*//**

* lifegame類生命遊戲具體操作類

*/public

class

lifegame

public

int getnextframe()

public

void

setframe(int frame)

public

void

init()

public

void

putcell(cell cell)

public

intlocationiscorner(int x, int y) else

if (0 == x && framesize - 1 == y) else

if (framesize - 1 == x && 0 == y) else

if (framesize - 1 == x && framesize - 1 == y)

return

0; }

public

intlocationisline(int x, int y) else

if (framesize - 1 == x && 0 != y && framesize - 1 != y) else

if (0 == y && 0 != x && framesize - 1 != x) else

if (framesize - 1 == y && 0 != x && framesize - 1 != x)

return

0; }

/*** 獲取指定座標細胞周圍細胞狀態

**@param x cell_x座標

*@param y cell_y座標

*@return 指定座標細胞周圍細胞狀態

*/public

int getaroundstatus(int x, int y) , , };

break;

}case

2: , , };

break;

}case

3: , , };

break;

}case

4: , , };

break;

}default:

break;}}

//line

else

if (isline != 0) , , };

break;

}case

12: , , };

break;

}case

13: , , };

break;

}case

14: , , };

break;

}default:

break;

}} else , , };

}return aroundunit;

}/**

* 更新環境中所有細胞生命狀態

**@return 環境中是否還在活著的細胞

*/public

boolean

isfreshframe()

}for (int i = 0; i < framesize; i++)

system.out.println("");

}system.out.println("");

for (int i = 0; i < framesize; i++)

system.out.print(nextframe[i][j]);

}system.out.println("");

}// flag=true;

return haslife;

}/**

* 執行整個生命遊戲

**@param lifegame 生命遊戲的初始物件

*@return 執行成功

*/public

boolean

run(lifegame lifegame)

return

true;

}}

細胞自動機(矩陣優化)

description 乙個細胞自動機包含n個格仔,每個格仔的取值為0 m 1。給定距離d,則每次操作後每個格仔的值將變為到它距離不超過d的所有格仔在操作之前的值之和除以m的餘數,其中i和j的距離為min。給定n,m,d,k和自動機各格仔的初始值,你的任務是計算k次操作以後各格仔的值。如下圖,n 5...

Game of Life 細胞自動機?生命遊戲?

生命遊戲 game of life 是二維的細胞自動機,由劍橋大學的數學家 john horton conway 於 1970 年所提出的。他構想 一群細胞於平面中以一定的條件成長時,會受到什麼制約 他認為細胞不會無限制的成長,於是他定義細胞在過度孤單與擁擠時會死亡,這樣的構想使他提出比 john ...

細胞自動機(思博 模擬)

題目描述 細胞自動製造公司最近剛剛獲得批量生產零件的新工藝專利。它的方法使 用到包含兩種細胞狀態的二維網格,每個單元的細胞要麼為空,要麼為滿。當然,具體的細節是專有的。最初,網格中的一組單元被填充為需要複製的細胞副本。進過一系列離散的步 驟,網格中的每個單元會根據自身及附近的八個單元的狀態同步進行細...