📄 lifegame.htm
字号:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<link rel="stylesheet" href="css/stdlayout.css" type="text/css">
<link rel="stylesheet" href="css/print.css" type="text/css">
<meta content="text/html; charset=gb2312" http-equiv="content-type">
<title>生命游戏</title>
</head>
<body>
<h3><a href="http://caterpillar.onlyfun.net/GossipCN/index.html">From
Gossip@caterpillar</a></h3>
<h1><a href="AlgorithmGossip.htm">Algorithm Gossip: 生命游戏</a></h1>
<h2> 说明</h2>
生命游戏(game of life)为1970年由英国数学家J. H. Conway所提出,某一细胞的邻居包括上、下、左、右、左上、左下、右上与右下相邻之细胞,游戏规则如下:<br>
<ol>
<li>孤单死亡:如果细胞的邻居小于一个,则该细胞在下一次状态将死亡。</li>
<li>拥挤死亡:如果细胞的邻居在四个以上,则该细胞在下一次状态将死亡。</li>
<li>稳定:如果细胞的邻居为二个或三个,则下一次状态为稳定存活。</li>
<li>复活:如果某位置原无细胞存活,而该位置的邻居为三个,则该位置将复活一细胞。</li>
</ol>
<h2>解法</h2>
生命游戏的规则可简化为以下,并使用CASE比对即可使用程式实作:<br>
<ol>
<li>邻居个数为0、1、4、5、6、7、8时,则该细胞下次状态为死亡。</li>
<li>邻居个数为2时,则该细胞下次状态为稳定。</li>
<li>邻居个数为3时,则该细胞下次状态为复活。</li>
</ol>
<h2> 实作</h2>
<ul>
<li> C
</li>
</ul>
<pre>#include <stdio.h> <br>#include <stdlib.h> <br>#include <ctype.h> <br><br>#define MAXROW 10 <br>#define MAXCOL 25 <br>#define DEAD 0 <br>#define ALIVE 1 <br>int map[MAXROW][MAXCOL], newmap[MAXROW][MAXCOL]; <br><br>void init(); <br>int neighbors(int, int);<br>void outputMap();<br>void copyMap();<br><br>int main() { <br> int row, col; <br> char ans; <br><br> init();<br><br> while(1) {<br> outputMap();<br> for(row = 0; row < MAXROW; row++) {<br> for(col = 0; col < MAXCOL; col++) {<br> switch (neighbors(row, col)) {<br> case 0: <br> case 1: <br> case 4: <br> case 5: <br> case 6: <br> case 7: <br> case 8: <br> newmap[row][col] = DEAD; <br> break; <br> case 2: <br> newmap[row][col] = map[row][col]; <br> break; <br> case 3: <br> newmap[row][col] = ALIVE; <br> break; <br> } <br> }<br> }<br><br> copyMap();<br><br> printf("\nContinue next Generation ? ");<br> getchar();<br> ans = toupper(getchar());<br><br> if(ans != 'Y')<br> break;<br> }<br> <br> return 0; <br>} <br><br>void init() {<br> int row, col; <br> <br> for(row = 0; row < MAXROW; row++) <br> for(col = 0; col < MAXCOL; col++) <br> map[row][col] = DEAD; <br><br> puts("Game of life Program"); <br> puts("Enter x, y where x, y is living cell");<br> printf("0 <= x <= %d, 0 <= y <= %d\n", <br> MAXROW-1, MAXCOL-1); <br> puts("Terminate with x, y = -1, -1");<br><br> while(1) {<br> scanf("%d %d", &row, &col); <br> if(0 <= row && row < MAXROW && <br> 0 <= col && col < MAXCOL)<br> map[row][col] = ALIVE;<br> else if(row == -1 || col == -1)<br> break;<br> else <br> printf("(x, y) exceeds map ranage!"); <br> }<br>}<br><br>int neighbors(int row, int col) {<br> int count = 0, c, r; <br><br> for(r = row-1; r <= row+1; r++) <br> for(c = col-1; c <= col+1; c++) { <br> if(r < 0 || r >= MAXROW || c < 0 || c >= MAXCOL) <br> continue; <br> if(map[r][c] == ALIVE) <br> count++; <br> } <br><br> if(map[row][col] == ALIVE) <br> count--; <br> <br> return count; <br>} <br><br>void outputMap() {<br> int row, col; <br><br> printf("\n\n%20cGame of life cell status\n"); <br> for(row = 0; row < MAXROW; row++) { <br> printf("\n%20c", ' '); <br> for(col = 0; col < MAXCOL; col++) <br> if(map[row][col] == ALIVE) <br> putchar('#'); <br> else <br> putchar('-'); <br> } <br>} <br><br>void copyMap() {<br> int row, col; <br><br> for(row = 0; row < MAXROW; row++) <br> for(col = 0; col < MAXCOL; col++) <br> map[row][col] = newmap[row][col]; <br>} <br></pre>
<br>
<ul>
<li> Java
</li>
</ul>
<pre>import java.io.BufferedReader;<br>import java.io.IOException;<br>import java.io.InputStreamReader;<br><br>public class LifeGame {<br> private boolean[][] map;<br> private boolean[][] newmap;<br> <br> public LifeGame(int maxRow, int maxColumn) {<br> map = new boolean[maxRow][maxColumn];<br> newmap = new boolean[maxRow][maxColumn];<br> }<br> <br> public void setCell(int x, int y) {<br> map[x][y] = true;<br> }<br> <br> public void next() {<br> for(int row = 0; row < map.length; row++) {<br> for(int col = 0; col < map[0].length; col++) {<br> switch (neighbors(row, col)) {<br> case 0: <br> case 1: <br> case 4: <br> case 5: <br> case 6: <br> case 7: <br> case 8: <br> newmap[row][col] = false; <br> break; <br> case 2: <br> newmap[row][col] = map[row][col]; <br> break; <br> case 3: <br> newmap[row][col] = true; <br> break; <br> } <br> }<br> }<br><br> copyMap();<br> }<br><br> public void outputMap() throws IOException { <br> System.out.println("\n\nGame of life cell status"); <br> for(int row = 0; row < map.length; row++) { <br> System.out.print("\n "); <br> for(int col = 0; col < map[0].length; col++) <br> if(map[row][col] == true) <br> System.out.print('#'); <br> else <br> System.out.print('-'); <br> } <br> }<br> <br> private void copyMap() {<br> for(int row = 0; row < map.length; row++) <br> for(int col = 0; col < map[0].length; col++) <br> map[row][col] = newmap[row][col]; <br> }<br> <br> private int neighbors(int row, int col) {<br> int count = 0; <br><br> for(int r = row-1; r <= row+1; r++) <br> for(int c = col-1; c <= col+1; c++) { <br> if(r < 0 || r >= map.length ||<br> c < 0 || c >= map[0].length) <br> continue; <br> if(map[r][c] == true) <br> count++; <br> } <br><br> if(map[row][col] == true) <br> count--; <br> <br> return count; <br> } <br> <br> public static void main(String[] args) <br> throws NumberFormatException, IOException {<br> BufferedReader bufReader = <br> new BufferedReader(<br> new InputStreamReader(System.in));<br> <br> LifeGame game = new LifeGame(10, 25);<br> <br> System.out.println("Game of life Program"); <br> System.out.println(<br> "Enter x, y where x, y is living cell");<br> System.out.println("0 <= x < 10, 0 <= y < 25"); <br> System.out.println("Terminate with x, y = -1, -1");<br> <br> while(true) {<br> String[] strs = bufReader.readLine().split(" ");<br> int row = Integer.parseInt(strs[0]);<br> int col = Integer.parseInt(strs[1]);<br><br> if(0 <= row && row < 10 && 0 <= col && row < 25) <br> game.setCell(row, col);<br> else if(row == -1 || col == -1) {<br> break;<br> }<br> else { <br> System.out.print(<br> "(x, y) exceeds map ranage!");<br> }<br> }<br> <br> while(true) {<br> game.outputMap();<br> game.next();<br><br> System.out.print(<br> "\nContinue next Generation ? ");<br> <br> String ans = bufReader.readLine().toUpperCase();<br><br> if(!ans.equals("Y"))<br> break;<br> } <br> }<br>}</pre>
<br>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -