#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<curses.h>

#define YMAX	25
#define XMAX	100
#define ROBOTS	25
#define	ITEMS	260

char desk[YMAX][XMAX];

typedef struct {
  signed char dirx, diry;
  char carry;
  char posx, posy;
} t_robot;

t_robot *robots[ROBOTS];


void paint_desk()
{
  int x, y; char disp[5]=" =@#";
  for(y=0; y<YMAX; y++) for (x=0; x<XMAX; x++) { mvaddch(y+2, 2+x, disp[desk[y][x]]); }
}

void move_robot(t_robot *robo)
{
  desk[robo->posy][robo->posx]=0; mvaddch(0,0,' ');
 
  do {
    if (rand()%15==8 && robo->dirx<1) robo->dirx++; else
    if (rand()%15==4 && robo->diry<1) robo->diry++; else
    if (rand()%15==6 && robo->dirx>-1) robo->dirx--; else
    if (rand()%15==9 && robo->diry>-1) robo->diry--;
  } while (desk[robo->posy+robo->diry][robo->posx+robo->dirx]>1);
  
  if (robo->posx+robo->dirx>0 && robo->posx+robo->dirx<XMAX &&
      robo->posy+robo->diry>0 && robo->posy+robo->diry<YMAX &&
      desk[robo->posy+robo->diry][robo->posx+robo->dirx]==1 && robo->carry)
  { robo->dirx-=(robo->dirx)*2; robo->diry-=(robo->diry)*2;
    desk[robo->posy][robo->posx]=1; robo->carry=0; mvaddch(0,0,'*'); }
  if (desk[robo->posy+robo->diry][robo->posx+robo->dirx]==1 && robo->carry==0)
  { desk[robo->posy+robo->diry][robo->posx+robo->dirx]=0; robo->carry++; }

  robo->posx+=robo->dirx; robo->posy+=robo->diry;
  if (robo->posx<0) { robo->posx=0; robo->dirx+=rand()%2+1; } else
    if (robo->posx>XMAX-1) { robo->posx=XMAX-1; robo->dirx-=rand()%2+1; }
  if (robo->posy<0) { robo->posy=0; robo->diry+=rand()%2+1; } else
    if (robo->posy>YMAX-1) { robo->posy=YMAX-1; robo->diry-=rand()%2+1; }
  
  desk[robo->posy][robo->posx]=2+robo->carry;
}

void main()
{
  int key, watch=1, x, y; char mezi[256];
  initscr();
  refresh();
  srand(time(NULL));
 
  for (key=0; key<ITEMS; key++) { do { x=rand()%XMAX; y=rand()%YMAX; } while (desk[y][x]); desk[y][x]=1; }
  for (key=0; key<ROBOTS; key++) { do { x=rand()%XMAX; y=rand()%YMAX; } while (desk[y][x]); desk[y][x]=2;
  				   robots[key]=malloc(sizeof(t_robot)); robots[key]->dirx=rand()%3-1; robots[key]->diry=rand()%3-1;
  				   robots[key]->carry=0; robots[key]->posx=x; robots[key]->posy=y; }

  paint_desk();
  key=getch();
  while (1) {
    for (key=0; key<ROBOTS; key++) move_robot(robots[key]);
    paint_desk();
    refresh();
    usleep(50000);
  }
  
  endwin();
}
