| 5 | 1/1 | 返回列表 |
| 查看: 2044 | 回復(fù): 3 | |||
| 當(dāng)前只顯示滿足指定條件的回帖,點(diǎn)擊這里查看本話題的所有回帖 | |||
[求助]
修改一個(gè)C語言生命游戲程序
|
|||
|
學(xué)校的project,一個(gè)生命游戲的程序: ------------------------------------------------------------------------------------------------------ #include #include #define ARRAYSIZE1 3 /* array size, predefined by the user */ #define ARRAYSIZE2 7 #define NSTEPS 2 /* number of steps take */ int main(int argc, char *argv[]) { int i, j, n, im, ip, jm, jp, ni, nj, nsum, isum; int **old, **new; float x; FILE *outFile; ni = ARRAYSIZE1 + 2; /* add 2 for left and right ghost cells */ // nj = ARRAYSIZE2 + 2; old = malloc(ni*sizeof(int*)); new = malloc(ni*sizeof(int*)); for(i=0; i new = malloc(nj*sizeof(int)); } /* initialize elements of old to 0 or 1 */ for(i=1; i<=ARRAYSIZE1; i++){ for(j=1; j<=ARRAYSIZE2; j++){ x = rand()/((float)RAND_MAX + 1); if(x<0.5){ old[j] = 0; } else { old[j] = 1; } } } /* time steps */ for(n=0; n /* corner boundary conditions */ old[0][0] = old[ARRAYSIZE1][ARRAYSIZE2]; old[0][ARRAYSIZE2+1] = old[ARRAYSIZE1][1]; old[ARRAYSIZE1+1][ARRAYSIZE2+1] = old[1][1]; old[ARRAYSIZE1+1][0] = old[1][ARRAYSIZE2]; /* left-right boundary conditions */ for(i=1; i<=ARRAYSIZE1; i++){ old[0] = old[ARRAYSIZE2]; old[ARRAYSIZE2+1] = old[1]; } /* top-bottom boundary conditions */ for(j=1; j<=ARRAYSIZE2; j++){ old[0][j] = old[ARRAYSIZE1][j]; old[ARRAYSIZE1+1][j] = old[1][j]; } for(i=1; i<=ARRAYSIZE1; i++){ for(j=1; j<=ARRAYSIZE2; j++){ im = i-1; ip = i+1; jm = j-1; jp = j+1; nsum = old[im][jp] + old[jp] + old[ip][jp] + old[im][j ] + old[ip][j ] + old[im][jm] + old[jm] + old[ip][jm]; switch(nsum){ case 3: new[j] = 1; break; case 2: new[j] = old[j]; break; default: new[j] = 0; } } } for(i=1; i<=ARRAYSIZE1; i++){ for(j=1; j<=ARRAYSIZE2; j++){ old[j] = new[j]; } } } /* sum the number of living cells */ isum = 0; for(i=1; i<=ARRAYSIZE1; i++){ for(j=1; j<=ARRAYSIZE2; j++){ isum = isum + new[j]; } } printf("\nNumber of living cells = %d\n", isum); return 0; } ------------------------------------------------------------------------------------------------------ 現(xiàn)在的程序直接定義了生命游戲中的初始條件,如下 #define ARRAYSIZE1 3 /* array size, predefined by the user */ #define ARRAYSIZE2 7 #define NSTEPS 2 /* number of steps take */ 直接運(yùn)行可以輸出存活細(xì)胞數(shù),如下 printf("\nNumber of living cells = %d\n", isum); return 0; 想把程序改成滿足以下條件的新程序: 運(yùn)行程序的時(shí)候接受輸入,格式為: [first argument: 演化次數(shù)steps] [second argument:調(diào)用的文件名] 其中調(diào)用的文件包含了初始的grid,格式為 m 行數(shù) n 列數(shù) 舉例: 5 6 01100 01110 01000 00000 00000 00000 輸出格式不變,輸出存活細(xì)胞數(shù)。 請問這個(gè)程序要怎么修改呢?請熟悉c語言的前輩多多指教,在線等回復(fù)。拜謝! [ Last edited by MajorMei on 2012-11-28 at 12:06 ] |
|
想把程序改成用戶自定義某些參數(shù)運(yùn)行的模式,輸入的數(shù)據(jù)分為兩部分,比如輸入 5 grid.txt 就說明生命游戲要執(zhí)行五步,初始矩陣是grid.txt這個(gè)文件里面的樣子 grid.txt由三部分構(gòu)成:m,n和矩陣 m 為行數(shù) n 為列數(shù) 舉例: 5 6 01100 01110 01000 00000 00000 00000 例子中是grid.txt這個(gè)文件的內(nèi)容 通過命令行中的grid.txt調(diào)用此文件中的信息,然后運(yùn)行程序,輸出存活的細(xì)胞數(shù)。 謝謝您的回復(fù),如果需要更詳細(xì)的信息我會盡快回復(fù)您。請指點(diǎn)! |
新蟲 (初入文壇)

至尊木蟲 (著名寫手)
驃騎將軍
|
讀取參數(shù)得到執(zhí)行步數(shù)和文件名 讀取文件是通用的,先讀到行列數(shù),動態(tài)分配內(nèi)存生成矩陣,然后讀取內(nèi)容作為初始狀態(tài). 你只需要寫一個(gè)函數(shù)Run(int **mat, int m, int n),這個(gè)函數(shù)里面就是根據(jù)生命游戲的規(guī)則,判斷鄰域來設(shè)置當(dāng)前元素的值.唯一復(fù)雜的就是判斷4個(gè)角點(diǎn)和4條邊界,其他內(nèi)部元素的鄰域都是3*3方塊中的其他8個(gè).然后求和,根據(jù)設(shè)定好的規(guī)則來設(shè)置當(dāng)前的值. 仔細(xì)分析一下不難的.用循環(huán)控制運(yùn)行次數(shù)等于指定的執(zhí)行步數(shù),每次都去調(diào)用Run()就行了 Run的偽代碼實(shí)現(xiàn),分情況可以有其他分法,例如把左右上角的情況寫進(jìn)第一行里面當(dāng)做特殊情況處理,不過對于if...else...沒有什么簡化的空間,寫出來看著清楚一些. |

| 最具人氣熱帖推薦 [查看全部] | 作者 | 回/看 | 最后發(fā)表 | |
|---|---|---|---|---|
|
[考研] 085700資源與環(huán)境308求調(diào)劑 +3 | 墨墨漠 2026-03-18 | 3/150 |
|
|---|---|---|---|---|
|
[考研] 267一志愿南京工業(yè)大學(xué)0817化工求調(diào)劑 +8 | SUICHILD 2026-03-12 | 8/400 |
|
|
[考研]
|
.6lL 2026-03-18 | 4/200 |
|
|
[考研] 286求調(diào)劑 +6 | lemonzzn 2026-03-16 | 9/450 |
|
|
[考研] 化學(xué)工程321分求調(diào)劑 +15 | 大米飯! 2026-03-15 | 18/900 |
|
|
[考研] 311求調(diào)劑 +11 | 冬十三 2026-03-15 | 12/600 |
|
|
[考研] 考研求調(diào)劑 +3 | 橘頌. 2026-03-17 | 4/200 |
|
|
[考研] 333求調(diào)劑 +3 | 文思客 2026-03-16 | 7/350 |
|
|
[考研] 070300化學(xué)學(xué)碩求調(diào)劑 +6 | 太想進(jìn)步了0608 2026-03-16 | 6/300 |
|
|
[考研] 26考研一志愿中國石油大學(xué)(華東)305分求調(diào)劑 +3 | 嘉年新程 2026-03-15 | 3/150 |
|
|
[考研] 22408總分284求調(diào)劑 +3 | InAspic 2026-03-13 | 3/150 |
|
|
[考研] 070305求調(diào)劑 +3 | mlpqaz03 2026-03-14 | 4/200 |
|
|
[考研] 294求調(diào)劑 +3 | Zys010410@ 2026-03-13 | 4/200 |
|
|
[考研] 289求調(diào)劑 +4 | 這么名字咋樣 2026-03-14 | 6/300 |
|
|
[考研] 265求調(diào)劑 +4 | 威化餅07 2026-03-12 | 4/200 |
|
|
[考研] 材料與化工(0856)304求B區(qū)調(diào)劑 +6 | 邱gl 2026-03-12 | 7/350 |
|
|
[考研] 材料工程調(diào)劑 +9 | 咪咪空空 2026-03-12 | 9/450 |
|
|
[考研] [0860]321分求調(diào)劑,ab區(qū)皆可 +4 | 寶貴熱 2026-03-13 | 4/200 |
|
|
[考研] 304求調(diào)劑 +7 | 7712b 2026-03-13 | 7/350 |
|
|
[考研] 土木第一志愿276求調(diào)劑,科研和技能十分豐富,求新興方向的導(dǎo)師收留 +3 | 土木小天才 2026-03-12 | 3/150 |
|