shithub: battleship

Download patch

ref: 4a3c29c2cc3780e893be27a8445265851eb9758c
parent: 961c08f468a543948e8855d62ce017f61b04fda8
author: rodri <rgl@antares-labs.eu>
date: Sun Oct 8 11:24:56 EDT 2023

make sure andys never stall while searching.

--- a/andy.c
+++ b/andy.c
@@ -39,6 +39,31 @@
 	return nametab[getrand(nelem(nametab))];
 }
 
+/* TODO replace by abort once it becomes noret-ready */
+static _Noreturn void
+myabort(void)
+{
+	abort();
+}
+
+static Point2
+getnextfreecell(Map *m)
+{
+	Point2 p;
+	int i, j;
+
+	for(i = 0; i < MAPW; i++)
+		for(j = 0; j < MAPH; j++)
+			if(gettile(m, p = Pt2(i,j,1)) == Twater)
+				return p;
+	/*
+	 * XXX getting here would mean that we shot every single cell and
+	 * the game's still going, so something went wrong.
+	 */
+	myabort();
+//	return Pt2(0,0,0);
+}
+
 static void
 turnaround(Andy *a)
 {
@@ -91,13 +116,11 @@
 		cells[i] = Pt2(getrand(MAPW-shiplen(i)), getrand(MAPH-shiplen(i)), 1);
 		o[i] = getrand(1<<20)&1? OH: OV;
 		sv[i] = o[i] == OH? Vec2(1,0): Vec2(0,1);
-		fprint(2, "%d%c ", i, o[i] == OH? 'h': 'v');
 		for(j = 0; j < i; j++)
 			if(lineXline(cells[i], addpt2(cells[i], mulpt2(sv[i], shiplen(i))),
 					cells[j], addpt2(cells[j], mulpt2(sv[j], shiplen(j)))))
 				goto Retry;
 	}
-	fprint(2, "\n");
 
 	n = 0;
 	for(i = 0; i < nelem(cells); i++){
@@ -118,12 +141,16 @@
 {
 	Point2 cell;
 	char buf[3+1];
+	int tries;
 
+	tries = 0;
+
 Retry:
 	switch(a->state){
 	case ASearching:
 		do
-			cell = Pt2(getrand(MAPW), getrand(MAPH), 1);
+			cell = ++tries > 100?
+				getnextfreecell(a): Pt2(getrand(MAPW), getrand(MAPH), 1);
 		while(gettile(a, cell) != Twater);
 		break;
 	case ACalibrating:
@@ -192,6 +219,7 @@
 	Andy *a;
 
 	a = emalloc(sizeof *a);
+	memset(a->map, Twater, MAPW*MAPH);
 	a->ego = p;
 	snprint(p->name, sizeof p->name, "%s", getaname());
 	a->state = ASearching;