aboutsummaryrefslogtreecommitdiff
path: root/util.c
diff options
context:
space:
mode:
authorrodri <rgl@antares-labs.eu>2023-10-07 17:17:30 +0000
committerrodri <rgl@antares-labs.eu>2023-10-07 17:17:30 +0000
commit353cbde75a19b004ab0c5339684f33ea47ef1244 (patch)
tree0739eb09e33959e144eba0c160ad6d35e4b6300a /util.c
parentf0c1d251cbf8bc1213c192fc3afcc0fe566bafb5 (diff)
downloadbattleship-353cbde75a19b004ab0c5339684f33ea47ef1244.tar.gz
battleship-353cbde75a19b004ab0c5339684f33ea47ef1244.tar.bz2
battleship-353cbde75a19b004ab0c5339684f33ea47ef1244.zip
use a better random source. fix a bug with andys generating oob cell coordinates.
Diffstat (limited to 'util.c')
-rw-r--r--util.c28
1 files changed, 26 insertions, 2 deletions
diff --git a/util.c b/util.c
index da5e8b0..1ff9a42 100644
--- a/util.c
+++ b/util.c
@@ -1,5 +1,7 @@
#include <u.h>
#include <libc.h>
+#include <mp.h>
+#include <libsec.h>
#include <thread.h>
#include <draw.h>
#include <mouse.h>
@@ -33,13 +35,19 @@ static char *statenametab[] = {
};
+int
+isoob(Point2 cell)
+{
+ return cell.x < 0 || cell.x >= MAPW ||
+ cell.y < 0 || cell.y >= MAPH;
+}
+
char *
cell2coords(Point2 cell)
{
static char s[3+1];
- assert(cell.x >= 0 && cell.x < MAPW
- && cell.y >= 0 && cell.y < MAPH);
+ assert(!isoob(cell));
snprint(s, sizeof s, "%c%d", rowtab[(int)cell.y], (int)cell.x);
return s;
@@ -72,6 +80,7 @@ gettile(Map *m, Point2 cell)
void
settile(Map *m, Point2 cell, int type)
{
+ assert(!isoob(cell));
m->map[(int)cell.x][(int)cell.y] = type;
}
@@ -84,6 +93,7 @@ settiles(Map *m, Point2 cell, int o, int ncells, int type)
sv = o == OH? Vec2(1,0): Vec2(0,1);
while(ncells-- > 0){
+ assert(!isoob(cell));
settile(m, cell, type);
cell = addpt2(cell, sv);
}
@@ -211,3 +221,17 @@ chanvprint(Channel *c, char *fmt, va_list arg)
yield(); /* let recipient handle message immediately */
return n;
}
+
+ulong
+getrand(ulong max)
+{
+ mpint *n, *r;
+ ulong c;
+
+ n = uitomp(max, nil);
+ r = mpnrand(n, genrandom, nil);
+ c = mptoui(r);
+ mpfree(n);
+ mpfree(r);
+ return c;
+}