// 粒子の凝集シミュレーション(アスキーアート) // 粒子は領域の上からランダムにやって来て下、左、右に移動する // 粒子は領域の底に到達したら吸着する // 粒子は他の粒子に接すると吸着する #include #include #include #include #define PMAX 300 // 粒子の数 #define XMAX 80 // 水平方向MAX #define YMAX 20 // 垂直方向MAX void main( ) { unsigned long seed; // 乱数の種 char buf[YMAX][XMAX]; // 1画面分のマス char pc='*'; // 粒子の文字 int n,x,y; // 粒子位置 int ir; // 吸着 int i; printf("粒子の凝集シミュレーション(AA)\n"); memset(&buf[0][0],' ',XMAX*YMAX); // 配列を空白で初期化 time(&seed); // 時刻取得(秒) srand(seed); // 乱数の種をまく for( i=0; i0 ) { if ( buf[y-1][x+1]==pc ) break; } // 右上に粒子あり if ( y>0 ) { if ( buf[y-1][x]==pc ) break; } // 上に粒子あり if ( x>0 && y>0 ) { if ( buf[y-1][x-1]==pc ) break; } // 左上に粒子あり if ( x>0 ) { if ( buf[y][x-1]==pc ) break; } // 左に粒子あり if ( x>0 ) // 左下に粒子あり { if ( buf[y+1][x-1]==pc ) break; } ir=0; // 吸着なし //--移動-- n=rand( )%3; // 3方向 switch( n ) { case 0: y++; break; // 下 case 1: x++; break; // 右 case 2: x--; break; // 左 } if ( y<0 || y>=YMAX ) break; // 領域の外 if ( x<0 || x>=XMAX ) break; // 領域の外 } if ( ir==1 ) buf[y][x]=pc; // 粒子吸着 } //--結果表示-- for( y=0; y