-4

I have written a program in turbo cpp, which uses mouse for a basic GUI. I have also written a function that determines if the mouse has been clicked on a certain text displayed at a certain position. Everything works fine on the first run. But when i run the program, a second time a problem arises. Even when the mouse is just passed over an option(not clicking) it gets selected and the next page is displayed. Thanks again for those who answers. I am also attaching the code for mouse functions..

union REGS in,out;
int callmouse()
{
in.x.ax=1;
int86(51,&in,&out);
return 1;
}


void mouseposi(int &xpos,int &ypos,int &click)
{
 in.x.ax=3;
 int86(51,&in,&out);
 click=out.x.bx;                //CLICK ==1,IF LEFT BUTTON PRESSED
 xpos=out.x.cx;                 //CLICK ==2,IF RIGHT BUTTON PRESSED
ypos=out.x.dx;
} 


int mousehide()
{
in.x.ax=2;
int86(51,&in,&out);
return 1;
}


void setposi(int xpos,int ypos)
{                                 
in.x.ax=4;      
in.x.cx=xpos;
in.x.dx=ypos;
int86(51,&in,&out);
}


void restrictmouseptr(int x1,int y1,int x2,int y2)
{
in.x.ax=7;              
in.x.cx=x1;             
in.x.dx=x2;
int86(51,&in,&out);
in.x.ax=8;
in.x.cx=y1;
in.x.dx=y2;
int86(51,&in,&out);
}


 int mouseclick(int x_org,int y_org,char str[], int x_cur, int y_cur, int cl)
{
static int flag=0;
int y_diff=y_cur-y_org;
int x_diff=x_cur-x_org;
if((y_diff>=0 && y_diff<=textheight(str))&&(x_diff>=0 && x_diff<=textwidth(str)))
{
    if(flag==0)
    {   int oldcolor=getcolor();
        setcolor(15);
        outtextxy(x_org,y_org,str);
        setcolor(oldcolor);
        flag=1;
    }
    if(cl!=1)
    return 0;             //RETURNS 0 IF LEFT BUTTON IS NOT PRESSED
    else
    {
        mousehide();
        return 1;        //RETURNS 1 IF X AND Y COORDINATES ARE 
                 //WITHIN THEIR EXTREMITIES.
    }
}
else if(flag==1);
{
      setcolor(11);
      flag=0;
      outtextxy(x_org,y_org,str);
      return 0;
}
}
  • 5
    Solution: Don't write turbo c++. – DimChtz Aug 07 '17 at 13:21
  • Its a school project. So i have to write in turbo cpp – The boy who lived Aug 07 '17 at 13:22
  • 2
    Solution 2: Change school (kidding :P). – DimChtz Aug 07 '17 at 13:35
  • 1
    @Theboywholived So change your school (or your teacher) then. There is no point in learning ancient, pre-standard C++, nowadays. – Algirdas Preidžius Aug 07 '17 at 13:42
  • 1
    Pleeeease stop using turbo C, there is absolutely no reason to use this outdated pre standard software that is probably twice as old as you. Today there are enough modern free tools available running on any halfway decent computer. – Jabberwocky Aug 07 '17 at 13:46
  • Wow, haven't used `int86(33h, &in, &out)` for more than 25 years... More seriously, instead of showing us low level functions reading or writing the mouse, you should show **your** code, ideally a [mcve]. Currently I really cannot guess what you have done... – Serge Ballesta Aug 07 '17 at 13:49
  • @MichaelWalz: Yes there can be a reason if a school cannot get anything else than very old computers. I do agree that it is no good for learning C++, but it can be enough to learn algorithmic basics. Anyway playing with MS/DOS interrupts in 2017 is hmm weird... – Serge Ballesta Aug 07 '17 at 13:53
  • For those interesting in it, a *bible* for MS/DOS interrupts is [here](http://www.ctyme.com/rbrown.htm) – Serge Ballesta Aug 07 '17 at 13:56
  • 1
    @Theboywholived you need to provide us with more code, in the code you have provided there is no `main` function and there is no code that actually calls any of the mouse functions. – Jabberwocky Aug 07 '17 at 14:01
  • I added example of mouse select usage as Answer. anyway `union REGS in,out;` looks suspicious and I am missing any `push/pop` but I may be wrong as I used `asm` instead of `int86(51,&in,&out);`. – Spektre Aug 08 '17 at 07:27
  • @SergeBallesta I think the problem is not in interrupts but in pgm architecture and algorithms instead. The best MS-DOS help on the topics I ever saw was [PCGPE1.0](https://www.pcorner.com/list/UPLOAD/PCGPE.ZIP/INFO/) it covers effects, sound, mouse, 2D/3D graphics even fake 3D like Wolfenstein I learned a lot from it in the ancient times... I also saw some win help version of it (cant find it now) – Spektre Aug 09 '17 at 07:00
  • 1
    @SergeBallesta: These schools don't have old computers; they force their students to install DOS emulators so they can run the Turbo C++ software (which is even worse) – Lightness Races in Orbit Mar 26 '18 at 11:35

1 Answers1

1

I do not see the architecture of your program as the important stuff is missing. I would expect you got a list of objects per page with their positions,size,labels,color etc. in form of some arrays of struct and loop through that for booth rendering and mouse handling. Something like this

just ignore the VCL stuff TCanvas,Graphics::TBitmap so ignore lines starting with bmp-> or scr-> (or port them into your graphics).

not sure if it helps but I just dig my ancient mine sweep game with partial solver using mouse in Turbo C++. It looks like this:

minesweep

Here Turbo C++ source for it:

//===========================================================================
//=== Includes: =============================================================
//===========================================================================
#include <stdlib.h>
//===========================================================================
//=== Types: ================================================================
//===========================================================================
typedef unsigned char byte;
typedef unsigned int  word;
typedef unsigned long dword;
//===========================================================================
//=== Headers: ==============================================================
//===========================================================================
void initscr();         // 320*200*256, BW palette
void clrscr();          // clear  scr
void rfsscr();          // vga << scr
void box(word x,word y,word a); // draw box a <0..cfree> at x,y
void boardint();        // init mines, clear board map
void boardprn();        // draw board map
void mouseint();        // init mouse
void mousetst();        // test mouse (x,y,buttons)
void numprn(word x,word y,word n);  // write number n <0..9999> at x,y

void boardtst0(int x,int y,int &n); // sub test count number of mines around
void boardtst(int x,int y);     // test number of mines around if error then boardend;
void boardend();            // game over (lose)
void boardwin();            // game over (win)
int  boardopt0(int x,int y);
void boardopt1(int x,int y,int &c);
int  boardopt2(int x,int y);
void boardopt3(int x,int y,int &c);
void boardopt();            // optimized search
//===========================================================================
//=== Global data: ==========================================================
//===========================================================================
const   c0=25; // used colors
const   c1=30;
const   c2=20;
const   c3=40;
const   c4=34;
const   c5=35;
const   c6=5;
const   cfree=13;

const   boardx=30; // board size
const   boardy=16;
const   minesn=99; // number of mines

const   boardx0=(320-(10*boardx))/2;
const   boardy0=(190-(10*boardy))/2+10;



byte        board[32][20];
byte        mines[32][20];
word far    *pit;

long        xtime0,xtime;
int     flags;


word        scrseg,scrofs;
word        mousex=0,mousey=0,
        mousel=0,mouser=0,
        mousel0=0,mouser0=0,
        mousebx=255,mouseby=255;
byte far    scr[64000],*vga; // 320x200x8bpp backbuffer and VGA screen

byte far    mouset[10][10]= // mouse cursor
        {
        1,1,0,0,0,0,0,0,0,0,
        1,1,1,1,0,0,0,0,0,0,
        1,1,1,1,1,1,0,0,0,0,
        1,1,1,1,0,0,0,0,0,0,
        1,1,1,1,0,0,0,0,0,0,
        1,0,0,1,1,0,0,0,0,0,
        1,0,0,0,1,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0
        };

byte far    txr[14*100]= // board tiles
        {
        c2,c1,c1,c1,c1,c1,c1,c1,c1,c1,
        c1,c0,c0,c0,c0,c0,c0,c0,c0,c2,
        c1,c0,c0,c0,c5,c5,c0,c0,c0,c2,
        c1,c0,c0,c5,c0,c0,c5,c0,c0,c2,
        c1,c0,c0,c5,c0,c0,c5,c0,c0,c2,
        c1,c0,c0,c5,c0,c0,c5,c0,c0,c2,
        c1,c0,c0,c5,c0,c0,c5,c0,c0,c2,
        c1,c0,c0,c0,c5,c5,c0,c0,c0,c2,
        c1,c0,c0,c0,c0,c0,c0,c0,c0,c2,
        c1,c2,c2,c2,c2,c2,c2,c2,c2,c2,

        c2,c1,c1,c1,c1,c1,c1,c1,c1,c1,
        c1,c0,c0,c0,c0,c0,c0,c0,c0,c2,
        c1,c0,c0,c0,c0,c3,c0,c0,c0,c2,
        c1,c0,c0,c0,c3,c3,c0,c0,c0,c2,
        c1,c0,c0,c0,c0,c3,c0,c0,c0,c2,
        c1,c0,c0,c0,c0,c3,c0,c0,c0,c2,
        c1,c0,c0,c0,c0,c3,c0,c0,c0,c2,
        c1,c0,c0,c0,c3,c3,c3,c0,c0,c2,
        c1,c0,c0,c0,c0,c0,c0,c0,c0,c2,
        c1,c2,c2,c2,c2,c2,c2,c2,c2,c2,

        c2,c1,c1,c1,c1,c1,c1,c1,c1,c1,
        c1,c0,c0,c0,c0,c0,c0,c0,c0,c2,
        c1,c0,c0,c0,c3,c3,c0,c0,c0,c2,
        c1,c0,c0,c3,c0,c0,c3,c0,c0,c2,
        c1,c0,c0,c0,c0,c0,c3,c0,c0,c2,
        c1,c0,c0,c0,c3,c3,c0,c0,c0,c2,
        c1,c0,c0,c3,c0,c0,c0,c0,c0,c2,
        c1,c0,c0,c3,c3,c3,c3,c0,c0,c2,
        c1,c0,c0,c0,c0,c0,c0,c0,c0,c2,
        c1,c2,c2,c2,c2,c2,c2,c2,c2,c2,

        c2,c1,c1,c1,c1,c1,c1,c1,c1,c1,
        c1,c0,c0,c0,c0,c0,c0,c0,c0,c2,
        c1,c0,c0,c0,c3,c3,c0,c0,c0,c2,
        c1,c0,c0,c4,c0,c0,c3,c0,c0,c2,
        c1,c0,c0,c0,c0,c3,c0,c0,c0,c2,
        c1,c0,c0,c0,c0,c0,c3,c0,c0,c2,
        c1,c0,c0,c4,c0,c0,c3,c0,c0,c2,
        c1,c0,c0,c0,c3,c3,c0,c0,c0,c2,
        c1,c0,c0,c0,c0,c0,c0,c0,c0,c2,
        c1,c2,c2,c2,c2,c2,c2,c2,c2,c2,

        c2,c1,c1,c1,c1,c1,c1,c1,c1,c1,
        c1,c0,c0,c0,c0,c0,c0,c0,c0,c2,
        c1,c0,c0,c0,c3,c0,c0,c0,c0,c2,
        c1,c0,c0,c0,c3,c0,c0,c0,c0,c2,
        c1,c0,c0,c3,c0,c0,c0,c0,c0,c2,
        c1,c0,c0,c3,c0,c3,c0,c0,c0,c2,
        c1,c0,c0,c3,c3,c3,c3,c0,c0,c2,
        c1,c0,c0,c0,c0,c3,c0,c0,c0,c2,
        c1,c0,c0,c0,c0,c0,c0,c0,c0,c2,
        c1,c2,c2,c2,c2,c2,c2,c2,c2,c2,

        c2,c1,c1,c1,c1,c1,c1,c1,c1,c1,
        c1,c0,c0,c0,c0,c0,c0,c0,c0,c2,
        c1,c0,c0,c3,c3,c3,c3,c0,c0,c2,
        c1,c0,c0,c3,c0,c0,c0,c0,c0,c2,
        c1,c0,c0,c3,c3,c3,c0,c0,c0,c2,
        c1,c0,c0,c0,c0,c0,c3,c0,c0,c2,
        c1,c0,c0,c3,c0,c0,c3,c0,c0,c2,
        c1,c0,c0,c0,c3,c3,c0,c0,c0,c2,
        c1,c0,c0,c0,c0,c0,c0,c0,c0,c2,
        c1,c2,c2,c2,c2,c2,c2,c2,c2,c2,

        c2,c1,c1,c1,c1,c1,c1,c1,c1,c1,
        c1,c0,c0,c0,c0,c0,c0,c0,c0,c2,
        c1,c0,c0,c0,c3,c3,c4,c0,c0,c2,
        c1,c0,c0,c3,c0,c0,c0,c0,c0,c2,
        c1,c0,c0,c3,c3,c3,c0,c0,c0,c2,
        c1,c0,c0,c3,c0,c0,c3,c0,c0,c2,
        c1,c0,c0,c3,c0,c0,c3,c0,c0,c2,
        c1,c0,c0,c0,c3,c3,c0,c0,c0,c2,
        c1,c0,c0,c0,c0,c0,c0,c0,c0,c2,
        c1,c2,c2,c2,c2,c2,c2,c2,c2,c2,

        c2,c1,c1,c1,c1,c1,c1,c1,c1,c1,
        c1,c0,c0,c0,c0,c0,c0,c0,c0,c2,
        c1,c0,c0,c3,c3,c3,c3,c0,c0,c2,
        c1,c0,c0,c0,c0,c0,c3,c0,c0,c2,
        c1,c0,c0,c0,c0,c3,c0,c0,c0,c2,
        c1,c0,c0,c0,c0,c3,c0,c0,c0,c2,
        c1,c0,c0,c0,c3,c0,c0,c0,c0,c2,
        c1,c0,c0,c0,c3,c0,c0,c0,c0,c2,
        c1,c0,c0,c0,c0,c0,c0,c0,c0,c2,
        c1,c2,c2,c2,c2,c2,c2,c2,c2,c2,

        c2,c1,c1,c1,c1,c1,c1,c1,c1,c1,
        c1,c0,c0,c0,c0,c0,c0,c0,c0,c2,
        c1,c0,c0,c0,c3,c3,c0,c0,c0,c2,
        c1,c0,c0,c3,c0,c0,c3,c0,c0,c2,
        c1,c0,c0,c0,c3,c3,c0,c0,c0,c2,
        c1,c0,c0,c3,c0,c0,c3,c0,c0,c2,
        c1,c0,c0,c3,c0,c0,c3,c0,c0,c2,
        c1,c0,c0,c0,c3,c3,c0,c0,c0,c2,
        c1,c0,c0,c0,c0,c0,c0,c0,c0,c2,
        c1,c2,c2,c2,c2,c2,c2,c2,c2,c2,

        c2,c1,c1,c1,c1,c1,c1,c1,c1,c1,
        c1,c0,c0,c0,c0,c0,c0,c0,c0,c2,
        c1,c0,c0,c0,c3,c3,c0,c0,c0,c2,
        c1,c0,c0,c3,c0,c0,c3,c0,c0,c2,
        c1,c0,c0,c0,c3,c3,c3,c0,c0,c2,
        c1,c0,c0,c0,c0,c0,c3,c0,c0,c2,
        c1,c0,c0,c4,c0,c0,c3,c0,c0,c2,
        c1,c0,c0,c0,c3,c3,c0,c0,c0,c2,
        c1,c0,c0,c0,c0,c0,c0,c0,c0,c2,
        c1,c2,c2,c2,c2,c2,c2,c2,c2,c2,

        c2,c1,c1,c1,c1,c1,c1,c1,c1,c1,
        c1,c0,c0,c0,c0,c0,c0,c0,c0,c2,
        c1,c0,c0,c6,c6,c0,c0,c0,c0,c2,
        c1,c0,c0,c6,c6,c6,c6,c0,c0,c2,
        c1,c0,c0,c6,c6,c6,c6,c0,c0,c2,
        c1,c0,c0,c6,c0,c6,c6,c0,c0,c2,
        c1,c0,c0,c6,c0,c0,c0,c0,c0,c2,
        c1,c0,c0,c6,c0,c0,c0,c0,c0,c2,
        c1,c0,c0,c0,c0,c0,c0,c0,c0,c2,
        c1,c2,c2,c2,c2,c2,c2,c2,c2,c2,

        c2,c1,c1,c1,c1,c1,c1,c1,c1,c1,
        c1,c0,c0,c0,c0,c0,c0,c0,c0,c2,
        c1,c0,c0,c0,c0,c0,c0,c0,c0,c2,
        c1,c0,c0,c0,c6,c6,c0,c0,c0,c2,
        c1,c0,c0,c6,c6,c6,c6,c0,c0,c2,
        c1,c0,c0,c6,c6,c6,c6,c0,c0,c2,
        c1,c0,c0,c0,c6,c6,c0,c0,c0,c2,
        c1,c0,c0,c0,c0,c0,c0,c0,c0,c2,
        c1,c0,c0,c0,c0,c0,c0,c0,c0,c2,
        c1,c2,c2,c2,c2,c2,c2,c2,c2,c2,

        c2,c1,c1,c1,c1,c1,c1,c1,c1,c1,
        c1,c0,c0,c0,c0,c0,c0,c0,c0,c2,
        c1,c0,c6,c0,c0,c0,c0,c6,c0,c2,
        c1,c0,c0,c6,c0,c0,c6,c0,c0,c2,
        c1,c0,c0,c0,c6,c6,c0,c0,c0,c2,
        c1,c0,c0,c0,c6,c6,c0,c0,c0,c2,
        c1,c0,c0,c6,c0,c0,c6,c0,c0,c2,
        c1,c0,c6,c0,c0,c0,c0,c6,c0,c2,
        c1,c0,c0,c0,c0,c0,c0,c0,c0,c2,
        c1,c2,c2,c2,c2,c2,c2,c2,c2,c2,

        c2,c1,c1,c1,c1,c1,c1,c1,c1,c1,
        c1,c0,c0,c0,c0,c0,c0,c0,c0,c2,
        c1,c0,c0,c0,c0,c0,c0,c0,c0,c2,
        c1,c0,c0,c0,c0,c0,c0,c0,c0,c2,
        c1,c0,c0,c0,c0,c0,c0,c0,c0,c2,
        c1,c0,c0,c0,c0,c0,c0,c0,c0,c2,
        c1,c0,c0,c0,c0,c0,c0,c0,c0,c2,
        c1,c0,c0,c0,c0,c0,c0,c0,c0,c2,
        c1,c0,c0,c0,c0,c0,c0,c0,c0,c2,
        c1,c2,c2,c2,c2,c2,c2,c2,c2,c2
        };
//===========================================================================
//=== Subroutines: ==========================================================
//===========================================================================
void initscr()
    {
    dword   h,l;
    int i;
    vga=(byte far*)0x0A0000000;
    h=(unsigned long)scr; l=h;
    l=l & 65535;
    h=h >> 16;
    scrseg=h;
    scrofs=l;
    asm {
        mov ax,0x0013
        int 0x10
        }
    for (i=0;i<256;i++) // set color palette to grayscale
    asm {
        mov dx,0x03C8
        mov ax,i
        out dx,al
        mov dx,0x03C9
        mov ax,i
        out dx,al
        out dx,al
        out dx,al
        }
    }
//===========================================================================
void clrscr()
    {
    asm {
        pusha
        push    es
        mov di,scrofs
        mov es,scrseg
        mov ax,0x1313
        mov cx,32000
        rep stosw
        pop es
        popa
        }
    }
//===========================================================================
void rfsscr()
    {
    asm {
        pusha
        push    ds
        push    es
        mov di,0
        mov si,scrofs
        mov ds,scrseg
        mov ax,0xA000
        mov es,ax
        mov cx,32000
        rep movsw
        pop es
        pop ds
        popa
        }
    }
//===========================================================================
void box(word x,word y,word a)
    {
    word    b;
    a=a*100;
    b=x+320*y;
    for (y=0;y<10;y++)
        {
        for (x=0;x<10;x++) scr[b+x]=txr[a+x];
        b+=320;
        a+=10;
        }
    }
//===========================================================================
void boardint()
    {
    word i,x,y;
    for (y=0;y<boardy;y++)
    for (x=0;x<boardx;x++)
        {
        board[x][y]=cfree;
        mines[x][y]=0;
        }
    randomize();
    for (i=0;i<minesn;i++)
        {
        x=random(boardx);
        y=random(boardy);
        if (mines[x][y]) i--;
        else mines[x][y]=1;
        }
    }
//===========================================================================
void boardprn()
    {
    word x,y,i,j;
    clrscr();
    x=boardx0;
    y=boardy0;
    for (j=0;j<boardy;j++)
    for (i=0;i<boardx;i++) box(x+10*i,y+10*j,board[i][j]);
    box(310,0,12);      // X .. exit button
    box(150,0,11);      // O .. restart button
    box(160,0,11);
    box(  0,0,10);      // flag
    xtime=pit[0];       // time
    xtime=xtime-xtime0;
    if (xtime<0) xtime=-xtime;
    xtime=xtime*55/1000;
    if (xtime>9999) xtime=9999;
    numprn(260,0,xtime);
    numprn( 20,0,flags);    // flags
    }
//===========================================================================
void    mouseint()
    {
    mousex=0;
    mousey=0;
    mousel=0;
    mouser=0;
    asm {
        pusha
        push    ds
        push    es
        mov ax,0    // reset mouse
        int 0x33
        mov cx,0    // set range
        mov dx,319
        mov ax,7
        int 0x33
        mov cx,0
        mov dx,199
        mov ax,8
        int 0x33
        mov cx,mousex   // set pos.
        mov dx,mousey
        mov ax,4
        int 0x33
        pop es
        pop ds
        popa
        }
    mousetst();
    }
//===========================================================================
void mousetst()
    {
    int b,x,y;
    asm {
        mov ax,3    // in mouse status test
        int 0x33
        mov mousex,cx
        mov mousey,dx
        and bx,3
        mov b,bx
        }
    mousel0=mousel;
    mouser0=mouser;
    mousel=b&1;
    mouser=(b&2)>>1;
    for (y=0;y<10;y++)
    for (x=0;x<10;x++)
        {
        if (mouset[y][x])
        if (x+mousex<320)
        if (y+mousey<200)
        scr[(x+mousex)+320*(y+mousey)]=63;
        }
    mousebx=255;    x=mousex-boardx0;
    mouseby=255;    y=mousey-boardy0;
    if (x>=0) if (x<boardx*10) if (x%10>1) if (x%10<9) mousebx=x/10;
    if (y>=0) if (y<boardy*10) if (y%10>1) if (y%10<9) mouseby=y/10;
    }
//===========================================================================
void numprn(word x,word y,word n)
    {
    int     i,c;
    x+=3*10;
    c=10;
    for (i=0;i<4;i++)
        {
        box(x,y,n%c);
        n=(n-(n%c))/c;
        x-=10;
        }
    }
//===========================================================================
void boardtst0(int x,int y,int &n)
    {
    if (x>=0) if (x<boardx)
    if (y>=0) if (y<boardy)
    if (mines[x][y])
    n++;
    }
//===========================================================================
void boardtst(int x,int y)
    {
    int n=0;
    if (x>=0) if (x<boardx)
    if (y>=0) if (y<boardy)
    if (board[x][y]==cfree)
        {
        boardtst0(x-1,y+0,n);
        boardtst0(x+1,y+0,n);
        boardtst0(x-1,y-1,n);
        boardtst0(x+0,y-1,n);
        boardtst0(x+1,y-1,n);
        boardtst0(x-1,y+1,n);
        boardtst0(x+0,y+1,n);
        boardtst0(x+1,y+1,n);
        board[x][y]=n;
        if (n==0)
            {
            boardtst(x-1,y+0);
            boardtst(x+1,y+0);
            boardtst(x-1,y-1);
            boardtst(x+0,y-1);
            boardtst(x+1,y-1);
            boardtst(x-1,y+1);
            boardtst(x+0,y+1);
            boardtst(x+1,y+1);
            }
        }
    }
//===========================================================================
void boardend()
    {
    int x,y;
    byte    a,b,c;
    for (y=0;y<boardy;y++)
    for (x=0;x<boardx;x++)
        {
        a=mines[x][y];
        b=board[x][y];
        c=b;
        if (a) if (b!=10) c=11;
        if (!a) if (b==10) c=12;
        board[x][y]=c;
        }
    boardprn();
    rfsscr();
    do { mousetst(); } while (mousel==1);
    do { mousetst(); } while (mousel==0);
    boardint();
    xtime0=pit[0];
    flags=minesn;
    }
//===========================================================================
void boardwin()
    {
    int x,y;
    byte    a,b,c;
    c=1;
    for (y=0;y<boardy;y++)
    for (x=0;x<boardx;x++)
        {
        a=mines[x][y];
        b=board[x][y];
        if ( a) if (b!=10)  c=0;
        if (!a) if (b==10)  c=0;
        if (!a) if (b==cfree)   c=0;
        }
    if (c)  {
        boardprn();
        box(150,0,10);      // O .. restart button
        box(160,0,10);
        rfsscr();
        do { mousetst(); } while (mousel==1);
        do { mousetst(); } while (mousel==0);
        boardint();
        xtime0=pit[0];
        flags=minesn;
        }
    }
//===========================================================================
int boardopt0(int x,int y)
    {
    int n=0;
    if (x>=0) if (x<boardx)
    if (y>=0) if (y<boardy)
    if (board[x][y]<9) n=1;
    return n;
    }
//===========================================================================
void boardopt1(int x,int y,int &c)
    {
    if (x>=0) if (x<boardx)
    if (y>=0) if (y<boardy)
    if (board[x][y]==cfree)
    if (flags)
        {
        board[x][y]=10;
        flags--;
        c=1;
        }
    }
//===========================================================================
int boardopt2(int x,int y)
    {
    int n=0;
    if (x>=0) if (x<boardx)
    if (y>=0) if (y<boardy)
    if (board[x][y]==10)    n=1;
    return n;
    }
//===========================================================================
void boardopt3(int x,int y,int &c)
    {
    if (x>=0) if (x<boardx)
    if (y>=0) if (y<boardy)
    if (board[x][y]==cfree)
        {
        boardtst(x,y);
        c=1;
        }
    }
//===========================================================================
void boardopt()
    {
    int x,y,n,c;
    byte    a;

    do  {
        c=0;                    // flag map changed
        for (y=0;y<boardy;y++)
        for (x=0;x<boardx;x++)
            {
            a=board[x][y];
            if (a!=cfree)
                {
                n=8;            // add flags
                if (boardopt0(x-1,y+0)) n--;
                if (boardopt0(x+1,y+0)) n--;
                if (boardopt0(x-1,y-1)) n--;
                if (boardopt0(x+0,y-1)) n--;
                if (boardopt0(x+1,y-1)) n--;
                if (boardopt0(x-1,y+1)) n--;
                if (boardopt0(x+0,y+1)) n--;
                if (boardopt0(x+1,y+1)) n--;
                if (n==a)
                    {
                    boardopt1(x-1,y+0,c);
                    boardopt1(x+1,y+0,c);
                    boardopt1(x-1,y-1,c);
                    boardopt1(x+0,y-1,c);
                    boardopt1(x+1,y-1,c);
                    boardopt1(x-1,y+1,c);
                    boardopt1(x+0,y+1,c);
                    boardopt1(x+1,y+1,c);
                    }
                n=0;            // add space
                if (boardopt2(x-1,y+0)) n++;
                if (boardopt2(x+1,y+0)) n++;
                if (boardopt2(x-1,y-1)) n++;
                if (boardopt2(x+0,y-1)) n++;
                if (boardopt2(x+1,y-1)) n++;
                if (boardopt2(x-1,y+1)) n++;
                if (boardopt2(x+0,y+1)) n++;
                if (boardopt2(x+1,y+1)) n++;
                if (n==a)
                    {
                    boardopt3(x-1,y+0,c);
                    boardopt3(x+1,y+0,c);
                    boardopt3(x-1,y-1,c);
                    boardopt3(x+0,y-1,c);
                    boardopt3(x+1,y-1,c);
                    boardopt3(x-1,y+1,c);
                    boardopt3(x+0,y+1,c);
                    boardopt3(x+1,y+1,c);
                    }
                }
            }
        } while (c);
    }
//===========================================================================
//=== Main: =================================================================
//===========================================================================
void main()
    {
    byte    a,b;

    pit=(word far*)0x0000046C;
    initscr();
    mouseint();
    boardint();

    xtime0=pit[0];
    flags=minesn;
    do  {
        boardprn(); //render screen

        if ((mousel)&&(mousey/10==0))
        if ((mousex/10==15)||(mousex/10==16))
            boardend();

        if ((!mouser0)&&(mouser)&&(mousebx!=255)&&(mouseby!=255))
            {
            a=board[mousebx][mouseby]; b=a;
            if (a==10)
                {
                b=cfree;
                flags++;
                }
            if ((a==cfree)&&(flags!=0))
                {
                b=10;
                flags--;
                }
            board[mousebx][mouseby]=b;
            }

        if ((!mousel0)&&(mousel)&&(mousebx!=255)&&(mouseby!=255))
        if (board[mousebx][mouseby]==cfree)
            {
            a=mines[mousebx][mouseby];
            if (a==0) boardtst(mousebx,mouseby);
            if (a==1) boardend();
            }

        if (mousel+mouser) boardopt();
        if (!flags) boardwin();

        mousetst();
        rfsscr(); // swap buffers to avoid flickering
        }
        while (!((mousel)&&(mousex/10==31)&&(mousey/10==0)));
    asm {
        mov ax,0x0003
        int 0x10
        }
    }
//===========================================================================
//=== End: ==================================================================
//===========================================================================

Sorry it is not much commented. Left mouse button sweeps and right mouse button add flag (expecting bomb). If you need help understanding the VGA gfx part then see:

If you look at the main then you see I got one "infinite" loop redrawing the screen and handling mouse events + game logic. I expect you should have something similar. The difference is that my objects are in grid so the selection is done just by scaling/offsetting mouse position.

In your case you should have list of objects and should loop through them and find the one closest to mouse and not too far ... similarly like in the Drag&Drop example link at the top of Answer.

Also here another related QA:

Spektre
  • 49,595
  • 11
  • 110
  • 380
  • Thnx for your help. The reason I have not included the main function or anything else was because i thought the problem was with the mouse functions( which i have attached). My requirement of the mouse is to know if the mouse has been clicked over an option. I have a do while loop inside which a function is called to checked if the mouse is clicked. This is done for all the options, and the loop only exits when any of the options have been pressed. My whole code is about 2k lines long, if you can help, i will attach it. – The boy who lived Aug 09 '17 at 11:42
  • @Theboywholived attaching source is a good idea the body limit is ~30KB so it should fit with ease ... – Spektre Aug 09 '17 at 11:59