home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / snip9707.zip / ROLLDICE.C < prev    next >
C/C++ Source or Header  |  1997-07-05  |  3KB  |  92 lines

  1. /* +++Date last modified: 05-Jul-1997 */
  2.  
  3. /*_|_|   ROLLDICE.C
  4. _|_|_|   A function to roll a definable number of dice (1 - 100),
  5. _|_|_|   with a definable number of sides (2 to 255).
  6. _|_|_|   No warrantees or guarantees are given or implied.
  7. _|_|_|   Released to   PUBLIC DOMAIN   by Kurt Kuzba.  (8/25/96)
  8. */
  9.  
  10. #include "rolldice.h"                     /* Also includes stdlib.h     */
  11.  
  12. static int rnd(int min, int max)
  13. {
  14.       long t = (long)rand() * (long)(max - min + 1);
  15.       return min + (int)(t / RAND_MAX);
  16. }
  17.  
  18. char *roll_dice(int d, int s)
  19. {
  20.       char *result = malloc(d * s + 1);
  21.       int shuffle_loop, die, side, temp, random;
  22.  
  23.       if (result == NULL)
  24.             return NULL;
  25.       *(result + d * s) = '\0';
  26.  
  27.       /* initialize your dice */
  28.  
  29.       for (die = 0; die < d; die++)
  30.       {
  31.             for (side = 0; side < s; side++)
  32.                   *(result + die * s + side) = (char)(side + 1);
  33.       }
  34.       for (shuffle_loop = 0; shuffle_loop < 16; shuffle_loop ++)
  35.       {
  36.             /* 'roll' your dice     */
  37.  
  38.             for (die = 0; die < d; die++)
  39.             {
  40.                   for (side = 0; side < s; side++)
  41.                   {
  42.                         random = rnd(1, s) - 1;
  43.                         temp = *(result + die * s + side);
  44.                         *(result + die * s + side) =
  45.                               *(result + die * s + random);
  46.                         *(result + die * s + random) = (char)temp;
  47.                   }
  48.             }
  49.       }
  50.       for (die = 0; die < d; die++)    /* Make an 'upside' string */
  51.             *(result + die) = *(result + die * s);
  52.       *(result + d) = '\0';           /* Trim str for # of dice  */
  53.       return result;
  54. }
  55.  
  56. #ifdef TEST
  57.  
  58. #include <stdio.h>
  59. #include <time.h>
  60. #include <string.h>
  61. #include <conio.h>
  62.  
  63. int main(int c, char *v[])
  64. {
  65.       time_t t;
  66.       int dice, sides;
  67.       char *d;
  68.  
  69.       srand((unsigned)time(&t));
  70.       dice = atoi(v[1]);
  71.       d = strchr(v[1], 'd');
  72.       sides = atoi(++d);
  73.       if (d == NULL || dice < 1 || dice > 100 || sides < 2 || sides > 255)
  74.             return !!puts("USAGE EX: ROLLDICE 2d6   (rolls 2 6-sided dice)");
  75.       d = roll_dice(dice, sides);
  76.       if (d == NULL)
  77.             return !puts("Malloc Failure.");
  78.       dice = sides = 0;
  79.       while (d[dice])
  80.       {
  81.             sides += d[dice];
  82.             printf("%d ", d[dice++]);
  83.       }
  84.       printf("\nYour total = %d\n", sides);
  85.       free(d);   /* Make sure you free your dice after every usage!! */
  86.       return 0;  /* Otherwise, you will leak away all your memory!!! */
  87. }
  88.  
  89. #endif /* TEST */
  90.  
  91. /*_|_|   end   ROLLDICE.C   */
  92.