Turbo CPP中的鼠标程序

时间:2017-08-07 13:20:40

标签: c++ turbo-c++

我在turbo cpp中编写了一个程序,它使用鼠标作为基本GUI。 我还编写了一个函数,用于确定鼠标是否已单击某个位置显示的某个文本。第一次运行时一切正常。但是当我运行该程序时,第二次出现问题。即使鼠标刚刚通过选项(而不是单击),它也会被选中并显示下一页。再次感谢那些回答的人。 我还附上鼠标功能的代码..

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

1 个答案:

答案 0 :(得分:0)

我没有看到你的程序的架构,因为缺少重要的东西。我希望你得到一个每页对象的列表,其中包括它们的位置,大小,标签,颜色等,以struct的某些数组的形式,并循环显示用于展位渲染和鼠标处理。像这样的东西

忽略 VCL 内容TCanvas,Graphics::TBitmap,因此请忽略以bmp->scr->开头的行(或将其移植到您的图片中)。

不确定它是否有帮助,但我只是使用鼠标在 Turbo C ++ 中使用部分解算器来挖掘我的古老的扫雷游戏。它看起来像这样:

minesweep

这里有 Turbo C ++ 来源:

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

很抱歉,评论不多。鼠标左键扫描和鼠标右键添加标记(期待炸弹)。如果您需要帮助理解 VGA gfx部分,请参阅:

如果你看main那么你会看到我得到了一个&#34;无限的&#34;循环重绘屏幕并处理鼠标事件+游戏逻辑。我希望你应该有类似的东西。不同之处在于我的对象位于网格中,因此只需通过缩放/偏移鼠标位置即可完成选择。

在你的情况下你应该有对象列表,并且应该遍历它们并找到离鼠标最近的那个并且不要太远......类似于顶部的拖放示例链接答案。

此处还有另一个相关的质量保证: