沃尔夫勒姆自动机时空图输出 C语言实现
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <time.h> 4 #include <conio.h> 5 6 7 //行宽度 8 #define ROW_LEN 38 9 10 11 //比特位域结构 12 typedef struct bits bits; 13 struct bits{ 14 15 unsigned int c0 : 1; 16 unsigned int c1 : 1; 17 unsigned int c2 : 1; 18 unsigned int c3 : 1; 19 unsigned int c4 : 1; 20 unsigned int c5 : 1; 21 unsigned int c6 : 1; 22 unsigned int c7 : 1; 23 }; 24 25 26 //行类型 27 typedef bits row[( ROW_LEN + 7 ) / 8]; 28 29 30 //读取行中元胞 31 unsigned int get_cell( row rw, int x ){ 32 33 unsigned int re = 0; 34 35 36 if( x < -1 || x > ROW_LEN ){ 37 38 puts( "get_cell: 坐标错误." ); 39 40 return re; 41 } 42 43 if( -1 == x ){ 44 45 x = ROW_LEN - 1; 46 } 47 48 if( ROW_LEN == x ){ 49 50 x = 0; 51 } 52 53 54 switch( x % 8 ){ 55 56 case 0:{ 57 58 re = rw[x / 8].c0; 59 }break; 60 61 case 1:{ 62 63 re = rw[x / 8].c1; 64 }break; 65 66 case 2:{ 67 68 re = rw[x / 8].c2; 69 }break; 70 71 case 3:{ 72 73 re = rw[x / 8].c3; 74 }break; 75 76 case 4:{ 77 78 re = rw[x / 8].c4; 79 }break; 80 81 case 5:{ 82 83 re = rw[x / 8].c5; 84 }break; 85 86 case 6:{ 87 88 re = rw[x / 8].c6; 89 }break; 90 91 case 7:{ 92 93 re = rw[x / 8].c7; 94 }break; 95 } 96 97 98 return re; 99 } 100 101 102 //修改行中元胞 103 void set_cell( row rw, int x, unsigned int v ){ 104 105 106 if( x < -1 || x > ROW_LEN ){ 107 108 puts( "set_cell: 坐标错误." ); 109 110 return; 111 } 112 113 if( -1 == x ){ 114 115 x = ROW_LEN - 1; 116 } 117 118 if( ROW_LEN == x ){ 119 120 x = 0; 121 } 122 123 124 v = v % 2; 125 126 127 switch( x % 8 ){ 128 129 case 0:{ 130 131 rw[x / 8].c0 = v; 132 }break; 133 134 case 1:{ 135 136 rw[x / 8].c1 = v; 137 }break; 138 139 case 2:{ 140 141 rw[x / 8].c2 = v; 142 }break; 143 144 case 3:{ 145 146 rw[x / 8].c3 = v; 147 }break; 148 149 case 4:{ 150 151 rw[x / 8].c4 = v; 152 }break; 153 154 case 5:{ 155 156 rw[x / 8].c5 = v; 157 }break; 158 159 case 6:{ 160 161 rw[x / 8].c6 = v; 162 }break; 163 164 case 7:{ 165 166 rw[x / 8].c7 = v; 167 }break; 168 } 169 } 170 171 172 //演化行中元胞 173 unsigned int evo_cell( row rw, int x, unsigned char tab ){ 174 175 unsigned char num = 0; 176 177 178 if( x < 0 || x > ROW_LEN - 1 ){ 179 180 puts( "evo_cell: 坐标错误." ); 181 182 return 0; 183 } 184 185 186 num |= ( unsigned char )get_cell( rw, x - 1 ); 187 num <<= 1; 188 num |= ( unsigned char )get_cell( rw, x ); 189 num <<= 1; 190 num |= ( unsigned char )get_cell( rw, x + 1 ); 191 192 193 return ( tab >> num ) & 0x01; 194 } 195 196 197 //演化行到另外一个行 198 void evo_row( row rw1, row rw2, unsigned char tab ){ 199 200 int x; 201 202 203 for( x = 0; x < ROW_LEN; x++ ){ 204 205 set_cell( rw2, x, evo_cell( rw1, x, tab ) ); 206 } 207 } 208 209 210 //随机初始化行 211 void rand_row( row rw ){ 212 213 int x; 214 215 216 for( x = 0; x < ROW_LEN; x++ ){ 217 218 set_cell( rw, x, rand() % 2 ); 219 } 220 } 221 222 223 //显示行 224 void display_row( row rw ){ 225 226 int x; 227 228 229 for( x = 0; x < ROW_LEN; x++ ){ 230 231 printf( "%s", get_cell( rw, x ) ? "▉" : " " ); 232 } 233 234 printf( "\n" ); 235 } 236 237 238 239 //规则选择,这里选择为规则30,随机产生等腰三角形 240 //这种自动机是一种随机数算法的根基 241 #define TYPE_ID 30 242 243 244 //主函数 245 int main( int argc, char * argv[] ){ 246 247 row rw1, rw2; 248 249 250 srand( ( unsigned int )time( NULL ) ); 251 252 rand_row( rw1 ); 253 254 255 while( 1 ){ 256 257 display_row( rw1 ); 258 259 _getch(); 260 261 evo_row( rw1, rw2, TYPE_ID ); 262 263 display_row( rw2 ); 264 265 _getch(); 266 267 evo_row( rw2, rw1, TYPE_ID ); 268 } 269 270 return 0; 271 }
运行效果: