BALL.C
上传用户:sunrenlu
上传日期:2022-06-13
资源大小:1419k
文件大小:2k
源码类别:

操作系统开发

开发平台:

DOS

  1. /*
  2.  * ball - balls bounce around
  3.  */
  4. #include <dos.h>
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <rtos.h>
  8. #define MAXBALLS 400
  9. #define SCALE 10
  10. #define RANDOMNESS 2
  11. #define MAXX ( 79 * SCALE )
  12. #define MAXY ( 24 * SCALE )
  13. typedef struct {
  14.     BYTE color;
  15.     WORD x, y;
  16.     WORD deltax, deltay;
  17. } ball_str;
  18. ball_str balls[ MAXBALLS ];
  19. void put_on_screen( int x, int y, WORD ch, WORD opt_attr )
  20. {
  21.     static WORD far *screen = 0xb8000000;
  22.     WORD ofs;
  23.     ofs = (y/SCALE) * 80 + (x/SCALE);
  24.     screen[ ofs ] = (WORD)ch | ((WORD)opt_attr)<<8;
  25. }
  26. void ball( DWORD num )
  27. {
  28.     ball_str *b;
  29.     int tempx, tempy;
  30.     b = &balls[ num ];
  31.     b->color = (num % 7) + 9;
  32.     b->x = MAXX / 2;
  33.     b->y = MAXY / 2;
  34.     b->deltax = SCALE/2 - (rand() / ( RAND_MAX/SCALE/RANDOMNESS));
  35.     b->deltay = SCALE/2 - (rand() / ( RAND_MAX/SCALE/RANDOMNESS));
  36.     do {
  37.         /* get new locaton */
  38.         tempx = b->x + b->deltax;
  39.         if ( (tempx < SCALE) || ( tempx > MAXX )) {
  40.             tempx = b->x;
  41.             b->deltax = -b->deltax;
  42.         }
  43.         tempy = b->y + b->deltay;
  44.         if ( (tempy < SCALE) || ( tempy > MAXY )) {
  45.             tempy = b->y;
  46.             b->deltay = -b->deltay;
  47.         }
  48.         /* erase old and accept new */
  49.         if ( (b->y != tempy ) || (b->x != tempx )) {
  50.             put_on_screen( b->x, b->y, ' ', 0 );
  51.             b->x = tempx;
  52.             b->y = tempy;
  53.         }
  54.         /* draw the ball */
  55.         put_on_screen( b->x, b->y, 9, b->color );
  56.         rt_sleep( 10 );
  57.     } while ( 1 );
  58. }
  59. void help( void )
  60. {
  61.     cprintf("BALL num    where num is in the range 1 to %urn", MAXBALLS);
  62.     cputs("Actual limit is based on how much memory is availablern");
  63.     exit( 0 );
  64. }
  65. main(int argc, char **argv )
  66. {
  67.     int temp, max;
  68.     DWORD dummy;
  69.     char buf[128];
  70.     rt_init( 100 );
  71.     kdebug = 1;
  72.     if ( argc < 2 ) help();
  73.     max = atoi( argv[1] );
  74.     if ( (max < 0) || (max >= MAXBALLS )) help();
  75.     rt_timerfreq( 100 );
  76.     for ( temp = 0 ; temp < max; ++temp )
  77.         rt_newthread( &ball, temp, 1024, 0, "a ball");
  78.     while ( 1 ) {
  79.         rt_sleep( 1000 );
  80.     }
  81. }