-/* $NetBSD: auto.c,v 1.9 2009/07/20 05:44:02 dholland Exp $ */
+/* $NetBSD: auto.c,v 1.11 2009/07/20 06:39:06 dholland Exp $ */
/*-
* Copyright (c) 1999 The NetBSD Foundation, Inc.
/*
* Automatic move.
* intelligent ?
- * Algo :
+ * Algo :
* IF scrapheaps don't exist THEN
- * IF not in danger THEN
+ * IF not in danger THEN
* stay at current position
* ELSE
* move away from the closest robot
* FI
- * ELSE
+ * ELSE
* find closest heap
* find closest robot
* IF scrapheap is adjacent THEN
* FI
* FI
*/
+#include <curses.h>
+#include <string.h>
#include "robots.h"
#define ABS(a) (((a)>0)?(a):-(a))
static int between(COORD *, COORD *);
/* distance():
- * return "move" number distance of the two coordinates
+ * return "move" number distance of the two coordinates
*/
-static int
+static int
distance(int x1, int y1, int x2, int y2)
{
return MAX(ABS(ABS(x1) - ABS(x2)), ABS(ABS(y1) - ABS(y2)));
}
/* xinc():
- * Return x coordinate moves
+ * Return x coordinate moves
*/
static int
xinc(int dir)
}
/* yinc():
- * Return y coordinate moves
+ * Return y coordinate moves
*/
static int
yinc(int dir)
}
/* find_moves():
- * Find possible moves
+ * Find possible moves
*/
static const char *
find_moves(void)
static char ans[sizeof moves];
a = ans;
- for(m = moves; *m; m++) {
+ for (m = moves; *m; m++) {
test.x = My_pos.x + xinc(*m);
test.y = My_pos.y + yinc(*m);
move(test.y, test.x);
switch(winch(stdscr)) {
case ' ':
case PLAYER:
- for(x = test.x - 1; x <= test.x + 1; x++) {
- for(y = test.y - 1; y <= test.y + 1; y++) {
+ for (x = test.x - 1; x <= test.x + 1; x++) {
+ for (y = test.y - 1; y <= test.y + 1; y++) {
move(y, x);
- if(winch(stdscr) == ROBOT)
+ if (winch(stdscr) == ROBOT)
goto bad;
}
}
bad:;
}
*a = 0;
- if(ans[0])
+ if (ans[0])
return ans;
else
return "t";
}
/* closest_robot():
- * return the robot closest to us
- * and put in dist its distance
+ * return the robot closest to us
+ * and put in dist its distance
*/
static COORD *
closest_robot(int *dist)
*dist = mindist;
return minrob;
}
-
+
/* closest_heap():
- * return the heap closest to us
- * and put in dist its distance
+ * return the heap closest to us
+ * and put in dist its distance
*/
static COORD *
closest_heap(int *dist)
}
/* move_towards():
- * move as close to the given direction as possible
+ * move as close to the given direction as possible
*/
-static char
+static char
move_towards(int dx, int dy)
{
char ok_moves[10], best_move;
int move_judge, cur_judge, mvx, mvy;
(void)strcpy(ok_moves, find_moves());
- best_move = ok_moves[0];
+ best_move = ok_moves[0];
if (best_move != 't') {
mvx = xinc(best_move);
mvy = yinc(best_move);
}
/* move_away():
- * move away form the robot given
+ * move away form the robot given
*/
static char
move_away(COORD *rob)
/* move_between():
- * move the closest heap between us and the closest robot
+ * move the closest heap between us and the closest robot
*/
static char
move_between(COORD *rob, COORD *hp)
/* equation of the line between us and the closest robot */
if (My_pos.x == rob->x) {
- /*
- * me and the robot are aligned in x
+ /*
+ * me and the robot are aligned in x
* change my x so I get closer to the heap
* and my y far from the robot
*/
}
else if (My_pos.y == rob->y) {
/*
- * me and the robot are aligned in y
+ * me and the robot are aligned in y
* change my y so I get closer to the heap
* and my x far from the robot
*/
cons = slope * rob->y;
if (ABS(My_pos.x - rob->x) > ABS(My_pos.y - rob->y)) {
/*
- * we are closest to the robot in x
+ * we are closest to the robot in x
* move away from the robot in x and
* close to the scrap in y
*/
My_pos.x, My_pos.y, rob->x, rob->y, hp->x, hp->y, dx, dy));
return move_towards(dx, dy);
}
-
+
/* between():
- * Return true if the heap is between us and the robot
+ * Return true if the heap is between us and the robot
*/
int
between(COORD *rob, COORD *hp)
}
/* automove():
- * find and do the best move if flag
- * else get the first move;
+ * find and do the best move if flag
+ * else get the first move;
*/
char
-automove(void)
+automove(void)
{
#if 0
return find_moves()[0];
robot_close = closest_robot(&robot_dist);
if (robot_dist > 1)
return('.');
- if (!Num_scrap)
+ if (!Num_scrap)
/* no scrap heaps just run away */
return move_away(robot_close);
heap_close = closest_heap(&heap_dist);
- robot_heap = distance(robot_close->x, robot_close->y,
- heap_close->x, heap_close->y);
+ robot_heap = distance(robot_close->x, robot_close->y,
+ heap_close->x, heap_close->y);
if (robot_heap <= heap_dist && !between(robot_close, heap_close)) {
- /*
+ /*
* robot is closest to us from the heap. Run away!
*/
return move_away(robot_close);
}
-
+
return move_between(robot_close, heap_close);
#endif
}