加入收藏 | 设为首页 | 会员中心 | 我要投稿 宁德站长网 (https://www.0593zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

沃尔夫勒姆自动机时空图输出 C语言达成

发布时间:2021-11-18 19:39:32 所属栏目:教程 来源:互联网
导读:沃尔夫勒姆自动机时空图输出 C语言实现 #include stdio.h #include stdlib.h #include time.h #include conio.h //行宽度 #define ROW_LEN 38 //比特位域结构 typedef struct bits bits; struct bits{ unsigned int c0 : 1; unsigned int c1 : 1; unsigned i

沃尔夫勒姆自动机时空图输出 C语言实现
 
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
 
 
//行宽度
#define ROW_LEN 38
 
 
//比特位域结构
typedef struct bits bits;
struct bits{
 
    unsigned int c0 : 1;
    unsigned int c1 : 1;
    unsigned int c2 : 1;
    unsigned int c3 : 1;
    unsigned int c4 : 1;
    unsigned int c5 : 1;
    unsigned int c6 : 1;
    unsigned int c7 : 1;
};
 
 
//行类型
typedef bits row[( ROW_LEN + 7 ) / 8];
 
 
//读取行中元胞
unsigned int get_cell( row rw, int x ){
 
    unsigned int re = 0;
 
 
    if( x < -1 || x > ROW_LEN ){
 
        puts( "get_cell: 坐标错误." );
 
        return re;
    }
 
    if( -1 == x ){
 
        x = ROW_LEN - 1;
    }
 
    if( ROW_LEN == x ){
 
        x = 0;
    }
 
 
    switch( x % 8 ){
 
        case 0:{
 
            re = rw[x / 8].c0;
              }break;
 
        case 1:{
 
            re = rw[x / 8].c1;
              }break;
 
        case 2:{
 
            re = rw[x / 8].c2;
              }break;
 
        case 3:{
 
            re = rw[x / 8].c3;
              }break;
 
        case 4:{
 
            re = rw[x / 8].c4;
              }break;
 
        case 5:{
 
            re = rw[x / 8].c5;
              }break;
 
        case 6:{
 
            re = rw[x / 8].c6;
              }break;
 
        case 7:{
 
            re = rw[x / 8].c7;
              }break;
    }
 
 
    return re;
}
 
 
//修改行中元胞
void set_cell( row rw, int x, unsigned int v ){
 
 
    if( x < -1 || x > ROW_LEN ){
 
        puts( "set_cell: 坐标错误." );
 
        return;
    }
 
    if( -1 == x ){
 
        x = ROW_LEN - 1;
    }
 
    if( ROW_LEN == x ){
 
        x = 0;
    }
 
 
    v = v % 2;
 
 
    switch( x % 8 ){
 
        case 0:{
 
            rw[x / 8].c0 = v;
              }break;
 
        case 1:{
 
            rw[x / 8].c1 = v;
              }break;
 
        case 2:{
 
            rw[x / 8].c2 = v;
              }break;
 
        case 3:{
 
            rw[x / 8].c3 = v;
              }break;
 
        case 4:{
 
            rw[x / 8].c4 = v;
              }break;
 
        case 5:{
 
            rw[x / 8].c5 = v;
              }break;
 
        case 6:{
 
            rw[x / 8].c6 = v;
              }break;
 
        case 7:{
 
            rw[x / 8].c7 = v;
              }break;
    }
}
 
 
//演化行中元胞
unsigned int evo_cell( row rw, int x, unsigned char tab ){
 
    unsigned char num = 0;
 
 
    if( x < 0 || x > ROW_LEN - 1 ){
 
        puts( "evo_cell: 坐标错误." );
 
        return 0;
    }
 
 
    num |= ( unsigned char )get_cell( rw, x - 1 );
    num <<= 1;
    num |= ( unsigned char )get_cell( rw, x );
    num <<= 1;
    num |= ( unsigned char )get_cell( rw, x + 1 );
 
 
    return ( tab >> num ) & 0x01;
}
 
 
//演化行到另外一个行
void evo_row( row rw1, row rw2, unsigned char tab ){
 
    int x;
 
 
    for( x = 0; x < ROW_LEN; x++ ){
 
        set_cell( rw2, x, evo_cell( rw1, x, tab ) );
    }
}
 
 
//随机初始化行
void rand_row( row rw ){
 
    int x;
 
 
    for( x = 0; x < ROW_LEN; x++ ){
 
        set_cell( rw, x, rand() % 2 );
    }
}
 
 
//显示行
void display_row( row rw ){
 
    int x;
 
 
    for( x = 0; x < ROW_LEN; x++ ){
 
        printf( "%s", get_cell( rw, x ) ? "▉" : "  " );
    }
 
    printf( "n" );
}
 
 
 
//规则选择,这里选择为规则30,随机产生等腰三角形
//这种自动机是一种随机数算法的根基
#define TYPE_ID 30
 
 
//主函数
int main( int argc, char * argv[] ){
 
    row rw1, rw2;
 
 
    srand( ( unsigned int )time( NULL ) );
 
    rand_row( rw1 );
 
 
    while( 1 ){
 
        display_row( rw1 );
 
        _getch();
 
        evo_row( rw1, rw2, TYPE_ID );
 
        display_row( rw2 );
 
        _getch();
 
        evo_row( rw2, rw1, TYPE_ID );
    }
 
    return 0;
}
 
运行效果:
 
 

(编辑:宁德站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读