aboutsummaryrefslogtreecommitdiff
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
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.
-rw-r--r--andy.c10
-rw-r--r--btsd.c1
-rw-r--r--fns.h2
-rw-r--r--util.c28
4 files changed, 33 insertions, 8 deletions
diff --git a/andy.c b/andy.c
index 057afb3..92a43f3 100644
--- a/andy.c
+++ b/andy.c
@@ -39,7 +39,7 @@ Point2 nwes[] = {
static char *
getaname(void)
{
- return nametab[ntruerand(nelem(nametab))];
+ return nametab[getrand(nelem(nametab))];
}
static void
@@ -69,21 +69,21 @@ Retry:
switch(a->state){
case ASearching:
do
- cell = Pt2(ntruerand(MAPW), ntruerand(MAPH), 1);
+ cell = Pt2(getrand(MAPW), getrand(MAPH), 1);
while(gettile(a, cell) != Twater);
break;
case ACalibrating:
do
cell = addpt2(a->firsthit, nwes[--a->ntries&3]);
- while(gettile(a, cell) != Twater && a->ntries > 1);
- if(a->ntries < 1 && gettile(a, cell) != Twater){
+ while((gettile(a, cell) != Twater || isoob(cell)) && a->ntries > 1);
+ if(gettile(a, cell) != Twater || isoob(cell)){
a->disengage(a);
goto Retry;
}
break;
case ABombing:
cell = addpt2(a->lastshot, a->passdir);
- if(gettile(a, cell) != Twater){
+ if(gettile(a, cell) != Twater || isoob(cell)){
turnaround(a);
goto Retry;
}
diff --git a/btsd.c b/btsd.c
index b7f6016..501e624 100644
--- a/btsd.c
+++ b/btsd.c
@@ -388,7 +388,6 @@ aiproc(void *arg)
if(ct == nil)
goto Nocmd;
-// sleep(ntruerand(5000));
switch(ct->index){
case ACMlayout: ai->layout(ai, newmsg(ai->ego, nil)); break;
case ACMplay: ai->shoot(ai, newmsg(ai->ego, nil)); break;
diff --git a/fns.h b/fns.h
index 97667fb..f8473fd 100644
--- a/fns.h
+++ b/fns.h
@@ -11,6 +11,7 @@ Image *eallocimage(Display*, Rectangle, ulong, int, ulong);
/*
* util
*/
+int isoob(Point2);
char *cell2coords(Point2);
Point2 coords2cell(char*);
int gettile(Map*, Point2);
@@ -26,6 +27,7 @@ int max(int, int);
int bitpackmap(uchar*, ulong, Map*);
int bitunpackmap(Map*, uchar*, ulong);
int chanvprint(Channel*, char*, va_list);
+ulong getrand(ulong);
/*
* menulist
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;
+}