| 
/**********************************/
/*  あみだくじ(アスキーアート)  */
/*                                */
/*  横線は乱数で設定              */
/**********************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#define LMAX  5                                         // 縦線MAX
#define CMAX 15                                         // 桁MAX
#define XMAX 50                                         // 領域水平方向MAX
#define YMAX 25                                         // 領域垂直方向MAX
char  buf[YMAX][XMAX];                                  // 領域配列
int   dsx=XMAX/(LMAX-1);                                // 縦線間隔
void  INIbuf(void);                                     // 領域設定
void  KUJI(int);                                        // くじをなぞる
void  DISP(void);                                       // 画面表示
void  main( )
/*----------*/
/*  主処理  */
/*----------*/
{
    char c[128];
    int  N;
    printf("\nあみだくじ(AA)\n");
    INIbuf( );                                          // 領域設定
    DISP( );                                            // 画面表示
    while( 1 )
      {
        printf("\n番号を入力してください(1〜%d以外で終了): ",LMAX);
        fflush(stdout);
        gets(c); N=atoi(c);                             // 番号入力
        if ( N<1 || N>LMAX ) break;                     // 範囲外
        KUJI(N);                                        // くじをなぞる
        DISP( );                                        // 画面表示
      }
}
void  INIbuf( )
/*------------*/
/*  領域設定  */
/*------------*/
{
    int  i,j,y,x;
    unsigned long seed;                                 // 乱数の種
    memset(&buf[0][0],' ',XMAX*YMAX);                   // 領域初期化
    //--縦線--
    for( i=0,x=0; i<LMAX; i++,x+=dsx )
      {
        for( y=0; y<YMAX; y++ ) buf[y][x]='*';          // 縦線設定
      }
    //--横線--
    time(&seed);                                        // 時刻取得(秒)
    srand(seed);                                        // 乱数の種をまく
    for( j=0; j<CMAX; )
      {
        i=j%(LMAX-1);                                   // 縦線添字(0〜3)
        x=i*dsx;                                        // 縦線位置
        y=rand( )%YMAX-1;                               // 横線位置
        if ( buf[y][x]=='+' || buf[y][x+dsx]=='+' )     // 交点
            continue;
        memset(&buf[y][x],'*',dsx);                     // 横線設定
        buf[y][x]='+';                                  // 交点(左)
        buf[y][x+dsx]='+';                              // 交点(右)
        j++;
      }
}
void  KUJI(
/*----------------*/
/*  くじをなぞる  */
/*----------------*/
int  N)    // くじ番号
{
    int  x,y,dx,dy;   // 位置,増分
    x=dsx*(N-1); y=0;                                   // 開始位置
    dx=0; dy=1;                                         // 進行方向
    while( y<YMAX )
      {
        if ( buf[y][x]!='+' )                           // 交点でない
          {
            buf[y][x]='0'+N;                            // 通過番号設定
          }
        else
          {
            if ( dy==0 )                                // 横に移動中
              { dx=0; dy=1; }                           // 下へ方向転換
            else                                        // 下に移動中
              {
                dx=1; dy=0;                             // 右へ方向転換
                if ( x>0 )                              // 左端でない
                  {
                    if ( buf[y][x-1]!=' ' )             // 左に線あり
                         dx=-1;                         // 左へ方向転換
                  }
              }
          }
        x+=dx; y+=dy;                                   // 移動
      }
}
void  DISP( )
/*------------*/
/*  画面表示  */
/*------------*/
{
    char c[128];
    int  i,x,y;
    //--番号表示--
    memset(c,' ',XMAX); c[XMAX]='\0';                   // 番号1行
    for( i=0,x=0; i<LMAX; i++,x+=dsx )
      { c[x]='1'+i; }
    printf("\n%.*s\n",x,c);                             // 1行表示
    //--領域表示--
    for( y=0; y<YMAX; y++ )
      { printf("\n%.*s",XMAX,&buf[y][0]); }             // 1行表示
    printf("\n");
    //--結果表示--
    memset(c,' ',XMAX); c[XMAX]='\0';                   // 番号1行
    for( i=0,x=0; i<LMAX; i++,x+=dsx )
      { c[x]='A'+i; }
    printf("\n%.*s\n",x,c);                             // 1行表示
}
    |