/* A simple AI demonstration presented by Teo Choon Hui */

/* Intro : An object with its own flying pattern will automatically 

fly away whenever mouse pointer moved close to it

 and if mouse pointer is far away, it will moves to mouse

 pointer. And object's speed will change according to thedistance. */

#include 

#include 

#include 

#include 

#include 

#include 

#define MaxDist_1 180

#define MaxDist_2 250

#define MinDist_1 90

#define MinDist_2 50

int ResetMouse(void);/* _AX = 0x00 */

void ShowMouse(void);/* _AX = 0x01 */

void HideMouse(void);/* _AX = 0x02 */

void ReadMouse(void);/* _AX = 0x03 */

void ObRunAway(int speed);/* object runs away from mouse */

void ObCloseTo(int speed);/* object closes to mouse */

void BigPixel(int x, int y, int colour); /* this func. plot 4 pixels

once used */

int mx, my, mb;

int ox=300, oy=200;

main()

    {

    int speed;

    int xDist, yDist;

    int gdriver=DETECT, gmode, errorcode;

    initgraph(&gdriver, &gmode, "");

    cleardevice();

    if(!ResetMouse()) { outtext("Mouse not detected!"); exit(1); }

    gotoxy(1,1);printf("Click left and right mouse buttons to quit.");

    ShowMouse();

        do {

        speed=1;

        ReadMouse();

        xDist = abs(mx-ox);

        yDist = abs(my-oy);

        gotoxy(1,2); printf(" Distance of X (in pixel) = %3d",xDist);

        gotoxy(1,3); printf(" Distance of Y (in pixel) = %3d",yDist);

            if ((xDist < MinDist_1) && (yDist < MinDist_1)) {

              if ((xDist < MinDist_2) && (yDist < MinDist_2))speed=3;

              ObRunAway(speed);

        }

            else if ((xDist > MaxDist_1) || (yDist > MaxDist_1)) {

              if ((xDist > MaxDist_2) || (yDist > MaxDist_2))speed=3;

              ObCloseTo(speed);

        }

        delay(555);

    }while(mb != 3);

    HideMouse();

    closegraph();

}

int ResetMouse()

    {

    int result;

    _AX = 0x00;

    geninterrupt(0x33);

    result = _AX;

    return result;

}

void ShowMouse()

    {

    _AX = 0x01;

    geninterrupt(0x33);

}

void HideMouse()

    {

    _AX = 0x02;

    geninterrupt(0x33);

}

void ReadMouse()

    {

    _AX = 0x03;

    geninterrupt(0x33);

    mb = _BX;

    mx = _CX;

    my = _DX;

    return;

}

void ObRunAway(int speed)