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

/* Intro : An object which will automatically flys

away whenever mouse pointer moved close to it */

#include 

#include 

#include 

#include 

#include 

#include 

#define MinDistance 100

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

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

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

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

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

void BigPixel(int x, int y, int colour); 

int mx, my, mb;

int ox=300, oy=200;

main()

    {

    int xDist, yDist;

    int gdriver=DETECT, gmode, errorcode;

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

    cleardevice();

        if(!ResetMouse()) {

        outtext("Mouse not detected!"); 

        exit(1); 

    }

    ShowMouse();

        do {

        ReadMouse();

        xDist = abs(mx-ox);

        yDist = abs(my-oy);

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

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

        if ((xDist < MinDistance) && (yDist < MinDistance))

          ObRunAway();

        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 tmp_ox=ox, tmp_oy=oy;

    if ( (mx < ox) && (ox < 639) || (ox==0))

    ox++;

    else if ( (mx > ox) && (ox > 0) || (ox==639))

    ox--;

    if ( (my < oy) && (oy < 479) )

    oy++;

    else if ( (my > oy) && (oy > 0) )

    oy--;

    BigPixel(tmp_ox, tmp_oy, 0);/* erase the old position */ 

    BigPixel(ox, oy, 2);/* plot new position */

    return;

}

void BigPixel(int x, int y, int colour)

    {

    putpixel(x, y, colour);

    putpixel(x+1, y, colour);

    putpixel(x, y+1, colour);

    putpixel(x+1, y+1, colour);

    return;

}