Rules:
1,Any live cell with fewer than two live neighbors dies, as if caused by under-population.
2,Any live cell with two or three live neighbors lives on to the next generation.
3,Any live cell with more than three live neighbors dies, as if by over-population..
4,Any dead cell with exactly three live neighbors becomes a live cell, as if by reproduction.
My Code As Follows:
1 #include<iostream>
2 #include<vector>
3 #include<fstream>
4 #define ALIVE 1 //存活
5 #define DEAD 0 //死亡
6 #define MAXROW 5 //最大行
7 #define MAXCOL 5 //最大列
8 using namespace std;
9 using Mat = vector<vector<int>>;
10 void init_self(Mat & mat); //用户手动输入数据
11 bool init_file(Mat & mat); //从文件读取
12 void show(const Mat & mat); //输出,用空格和"X"表示存活状态
13 void update(Mat & pre_mat, Mat & update_mat); //跟新状态
14 void init_date(Mat & mat); //初始化pre和update的数据
15 int main() {
16 Mat pre_mat(MAXROW, vector<int>(MAXCOL));
17 Mat update_mat(MAXROW, vector<int>(MAXCOL));
18 init_date(pre_mat); //先将pre_mat和update_mat置为0
19 init_date(update_mat);
20
21 cout << "Welcome to Game_Of_Life:" << endl
22 << endl
23 << "按下键盘数字 1 ,选择手动输入" << endl
24 << endl
25 << "按下键盘数字 2 ,将从文件(D:\\mat.txt)读入数据" << endl
26 << "其中数据0表示死亡,数据1表示存活" << endl
27 << "请输入20行*20列规模的数据,要求数据仅为0或1" << endl
28 << endl
29 << "请按 1 或 2 " << endl;
30 int choice;
31 bool SWITCH_ERROR = true; //未发生switch异常,标记为true;
32 bool Read_File;
33 while (SWITCH_ERROR) {
34 cin >> choice;
35 switch (choice)
36 {
37 case 1:
38 init_self(pre_mat);
39 SWITCH_ERROR = false;
40 break;
41 case 2:
42 Read_File = init_file(pre_mat);
43 if (!Read_File) {
44 SWITCH_ERROR = false;
45 return 0;
46 }
47 else
48 SWITCH_ERROR = false;
49 break;
50 default:
51 cout << "您的输入有误,请重新输入数字1 或 数字2" << endl
52 << "按下键盘数字 1 ,选择手动输入" << endl
53 << "按下键盘数字 2 ,将从文件(D:\\mat.txt)读入" << endl
54 << "请按 1 或 2 " << endl;
55 break;
56 }
57 }
58 int order = 0;
59 cout << "第" << order++ << "代生存图如下:" << endl;
60 show(pre_mat);
61 int Go_On = 1;
62 while (Go_On) {
63 cout << "第" << order++ << "代生存图如下:" << endl;
64 update(pre_mat, update_mat);
65 show(pre_mat);
66 cout << "继续输出下一代生存状况,请按1" << "退出请按0" << endl;
67 cin >> Go_On;
68 if (Go_On != 1 || !Go_On) {
69 cout << "继续输出下一代生存状况,请按1" << "退出请按0" << endl;
70 cin >> Go_On;
71 }
72 }
73 return 0;
74 }
75
76 void init_date(Mat & mat) {
77 for (int i = 0; i < MAXROW; i++) {
78 for (int j = 0; j < MAXCOL; j++)
79 mat[i][j] = 0;
80 }
81 }
82
83 void init_self(Mat & mat) {
84 int x, y;
85 cout << "请依次输入存活细胞的行坐标x,列坐标y (注意其中1<=x<=" << MAXROW
86 << ",1<=y<=" << MAXCOL << ",当x=0且y=0时,输入结束" << endl;
87 while (true) {
88 cin >> x >> y;
89 if (0 == x && 0 == y) {
90 cout << "您已完成输入!" << endl;
91 break;
92 }
93 else if (x > 0 && y > 0 && x<MAXROW && x<MAXCOL) {
94 mat[MAXCOL - y][x - 1] = ALIVE;
95 cout << "您已令(" << x << "," << y << ")存活" << endl;
96 }
97 else {
98 cout << "您的输入有误,请重新输入!" << endl;
99 cout << "请依次输入存活细胞的行坐标x,列坐标y (注意其中1<=x<=" << MAXROW
100 << ",1<=y<=" << MAXCOL << ",当x=0且y=0时,输入结束" << endl;
101 }
102 }
103 }
104
105 bool init_file(Mat & mat) {
106 ifstream fin("D:\\mat.txt");
107 int x;
108 for (int i = 0; i < MAXROW; i++) {
109 for (int j = 0; j < MAXCOL; j++) {
110 fin >> x;
111 if (!fin) {
112 cout << "读取文件(D:\\mat.txt)失败,程序退出!" << endl;
113 return 0;
114 }
115 if (1 == x || !x) {
116 mat[i][j] = x;
117 }
118 else {
119 cout << "文件内容错误,请确保文件数据仅为0或1,数据之间用空格分开!"
120 << "格式为 " << MAXROW << "行*" << MAXCOL << "列" << endl
121 << "程序退出,请检查(D:\\mat.txt)数据正确性!" << endl;
122 return 0;
123 }
124 }
125 }
126 return 1;
127 }
128 void update(Mat & pre_mat, Mat & update_mat) {
129 for (int i = 1; i < MAXROW - 1; i++) {
130 for (int j = 1; j < MAXCOL - 1; j++) {
131 int sum = 0;
132 if (pre_mat[i][j - 1] == ALIVE) sum++;
133 if (pre_mat[i][j + 1] == ALIVE) sum++;
134 if (pre_mat[i - 1][j] == ALIVE) sum++;
135 if (pre_mat[i + 1][j] == ALIVE) sum++;
136 if (pre_mat[i - 1][j - 1] == ALIVE) sum++;
137 if (pre_mat[i - 1][j + 1] == ALIVE) sum++;
138 if (pre_mat[i + 1][j - 1] == ALIVE) sum++;
139 if (pre_mat[i + 1][j + 1] == ALIVE) sum++;
140
141 if (pre_mat[i][j] == ALIVE) {
142 if (sum < 2)
143 update_mat[i][j] = DEAD;
144 else if (2 == sum || 3 == sum)
145 update_mat[i][j] = ALIVE;
146 else
147 update_mat[i][j] = DEAD;
148 }
149 else {
150 if (sum == 3)
151 update_mat[i][j] = ALIVE;
152 }
153 }
154 }
155 pre_mat = update_mat;
156 init_date(update_mat);
157 }
158
159 void show(const Mat & mat) {
160 for (auto &c : mat) {
161 for (auto & cc : c) {
162 if (cc == DEAD)
163 cout << "D";
164 else
165 cout << "X";
166 }
167 cout << endl;
168 }
169 }