You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
157 lines
2.8 KiB
157 lines
2.8 KiB
/** @file gobble1.c
|
|
@author M.P. Hayes
|
|
@date 28 Sep 2013
|
|
@brief
|
|
*/
|
|
|
|
#include <stdlib.h>
|
|
#include "system.h"
|
|
#include "pacer.h"
|
|
#include "tinygl.h"
|
|
|
|
/* Number of initial objects. */
|
|
#define NUM_MONSTERS 6
|
|
|
|
#define LOOP_RATE 300
|
|
|
|
#define MOVE_RATE 10
|
|
|
|
|
|
typedef struct monster_struct
|
|
{
|
|
tinygl_point_t pos;
|
|
bool alive;
|
|
} monster_t;
|
|
|
|
|
|
static int8_t monster_find (monster_t *monsters, uint8_t num,
|
|
uint8_t x, uint8_t y)
|
|
{
|
|
uint8_t i;
|
|
|
|
for (i = 0; i < num; i++)
|
|
{
|
|
if (monsters[i].pos.x == x
|
|
&& monsters[i].pos.y == y
|
|
&& monsters[i].alive)
|
|
return i;
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
|
|
static int8_t monster_choose (monster_t *monsters, uint8_t num)
|
|
{
|
|
while (1)
|
|
{
|
|
int8_t this;
|
|
|
|
this = rand () % num;
|
|
|
|
if (monsters[this].alive)
|
|
return this;
|
|
}
|
|
}
|
|
|
|
|
|
static void monster_move (monster_t *monsters, uint8_t num)
|
|
{
|
|
uint8_t x;
|
|
uint8_t y;
|
|
uint8_t this;
|
|
|
|
this = monster_choose (monsters, num);
|
|
|
|
tinygl_draw_point (monsters[this].pos, 0);
|
|
|
|
x = monsters[this].pos.x;
|
|
y = monsters[this].pos.y;
|
|
|
|
while (1)
|
|
{
|
|
int8_t dx;
|
|
int8_t dy;
|
|
|
|
dx = (rand () % 3) - 1;
|
|
dy = (rand () % 3) - 1;
|
|
|
|
if ((dx || dy)
|
|
&& x + dx >= 0 && x + dx < TINYGL_WIDTH
|
|
&& y + dy >= 0 && y + dy < TINYGL_HEIGHT)
|
|
{
|
|
int8_t other;
|
|
|
|
other = monster_find (monsters, num, x + dx, y + dy);
|
|
|
|
if (other != -1)
|
|
monsters[other].alive = 0;
|
|
|
|
monsters[this].pos.x = x + dx;
|
|
monsters[this].pos.y = y + dy;
|
|
tinygl_draw_point (monsters[this].pos, 1);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
static void monsters_create (monster_t *monsters, uint8_t num)
|
|
{
|
|
uint8_t i;
|
|
|
|
for (i = 0; i < num; i++)
|
|
{
|
|
uint8_t x;
|
|
uint8_t y;
|
|
|
|
do
|
|
{
|
|
x = rand () % TINYGL_WIDTH;
|
|
y = rand () % TINYGL_HEIGHT;
|
|
} while (monster_find (monsters, i, x, y) != -1);
|
|
|
|
monsters[i].pos.x = x;
|
|
monsters[i].pos.y = y;
|
|
monsters[i].alive = 1;
|
|
|
|
tinygl_draw_point (things[i].pos, 1);
|
|
}
|
|
}
|
|
|
|
|
|
int main (void)
|
|
{
|
|
uint16_t tick = 0;
|
|
monster_t monsters[NUM_MONSTERS];
|
|
|
|
system_init ();
|
|
|
|
tinygl_init (LOOP_RATE);
|
|
|
|
pacer_init (LOOP_RATE);
|
|
|
|
monsters_create (monsters, NUM_MONSTERS);
|
|
|
|
while (1)
|
|
{
|
|
uint8_t col;
|
|
|
|
/* Refresh monsters. */
|
|
for (col = 0; col < TINYGL_WIDTH; col++)
|
|
{
|
|
pacer_wait ();
|
|
|
|
tinygl_update ();
|
|
}
|
|
|
|
tick++;
|
|
if (tick >= LOOP_RATE / MOVE_RATE)
|
|
{
|
|
tick = 0;
|
|
|
|
monster_move (monsters, NUM_MONSTERS);
|
|
}
|
|
}
|
|
return 0;
|
|
}
|