c++ - Programa de mouse en Turbo CPP



turbo-c++ (1)

No veo la arquitectura de su programa ya que faltan cosas importantes. Esperaría que obtuviera una lista de objetos por página con sus posiciones, tamaño, etiquetas, color, etc. en forma de algunas matrices de struct y bucle a través de eso para el procesamiento de la cabina y el manejo del mouse. Algo como esto

  • ¿Alguien sabe de un ejemplo de bajo nivel (sin marcos) de una lista reorganizable de arrastrar y soltar?

simplemente ignore las cosas de VCL TCanvas,Graphics::TBitmap ignore las líneas que comienzan con bmp-> o scr-> (o scr-> a sus gráficos).

No estoy seguro de si ayuda, pero acabo de cavar mi antiguo juego de barrido de minas con un solucionador parcial usando el mouse en Turbo C ++ Se parece a esto:

Aquí la fuente de Turbo C ++ para ello:

//===========================================================================
//=== 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: ==================================================================
//===========================================================================

Lo siento, no es muy comentado. El botón izquierdo del mouse barre y el botón derecho del mouse agrega una bandera (esperando bomba). Si necesita ayuda para comprender la parte de VGA gfx, consulte:

  • Mostrar una matriz de color en C

Si miras el main , verás que tengo un bucle "infinito" que vuelve a dibujar la pantalla y maneja los eventos del mouse + la lógica del juego. Espero que debas tener algo similar. La diferencia es que mis objetos están en la cuadrícula, por lo que la selección se realiza escalando / compensando la posición del mouse.

En su caso, debe tener una lista de objetos y debe recorrerlos y encontrar el más cercano al mouse y no demasiado lejos ... de manera similar como en el enlace de ejemplo Arrastrar y soltar en la parte superior de la Respuesta.

También aquí otro control de calidad relacionado:

  • Comprender la programación del buscaminas p.roblem

https://ffff65535.com

He escrito un programa en turbo cpp, que usa el mouse para una GUI básica. También he escrito una función que determina si se ha hecho clic con el mouse en cierto texto que se muestra en una determinada posición. Todo funciona bien en la primera ejecución. Pero cuando ejecuto el programa, por segunda vez surge un problema. Incluso cuando se pasa el mouse sobre una opción (sin hacer clic), se selecciona y se muestra la siguiente página. Gracias de nuevo por quienes respondieron. También adjunto el código para las funciones del mouse.

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;
}
}




turbo-c++