1 /* %W% %G% %U% - (c) Copyright 1987, 1988 Chuck Simmons */
3 /*
4  *    Copyright (C) 1987, 1988 Chuck Simmons
5  *
6  * See the file COPYING, distributed with empire, for restriction
7  * and warranty information.
8  */
10 /*
11 math.c -- various mathematical routines.
13 This file contains routines used to create random integers.  The
14 initialization routine 'rndini' should be called at program startup.
15 The flavors of random integers that can be generated are:
17     irand(n) -- returns a random integer in the range 0..n-1
18     rndint(a,b) -- returns a random integer in the range a..b
20 Other routines include:
22     dist (a, b) -- returns the straight-line distance between two locations.
23 */
25 #include "empire.h"
26 #include "extern.h"
28 void rndini()
29 {
30         srand((unsigned)(time(0) & 0xFFFF));
31 }
33 long irand(high)
34 long high;
35 {
36         if (high < 2) {
37                 return (0);
38         }
39         return (rand() % high);
40 }
42 int rndint(minp, maxp)
43 int minp, maxp;
44 {
45         int size;
47         size = maxp - minp + 1;
48         return ((rand() % size) + minp);
49 }
51 /*
52 Return the distance between two locations.  This is simply
53 the max of the absolute differnce between the x and y coordinates.
54 */
56 #define MIN(a,b) ((a)<(b) ? (a) : (b))
57 #define MAX(a,b) ((a)>(b) ? (a) : (b))
58 #define ABS(a) ((a) < 0 ? -(a) : (a))
60 int
61 dist (a, b)
62 long a, b;
63 {
64         int ax, ay, bx, by;
66         ax = loc_row (a);
67         ay = loc_col (a);
68         bx = loc_row (b);
69         by = loc_col (b);
71         return (MAX (ABS (ax-bx), ABS (ay-by)));
72 }
74 /*
75 Find the square root of an integer.  We actually return the floor
76 of the square root using Newton's method.
77 */
79 int isqrt (n)
80 int n;
81 {
82         int guess;
84         ASSERT (n >= 0); /* can't take sqrt of negative number */
86         if (n <= 1) return (n); /* do easy cases and avoid div by zero */
88         guess = 2; /* gotta start somewhere */
89         guess = (guess + n/guess) / 2;
90         guess = (guess + n/guess) / 2;
91         guess = (guess + n/guess) / 2;
92         guess = (guess + n/guess) / 2;
93         guess = (guess + n/guess) / 2;
95         if (guess * guess > n) guess -= 1; /* take floor */
96         return (guess);
97 }