我在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;
}
}
答案 0 :(得分:0)
我没有看到你的程序的架构,因为缺少重要的东西。我希望你得到一个每页对象的列表,其中包括它们的位置,大小,标签,颜色等,以struct
的某些数组的形式,并循环显示用于展位渲染和鼠标处理。像这样的东西
忽略 VCL 内容TCanvas,Graphics::TBitmap
,因此请忽略以bmp->
或scr->
开头的行(或将其移植到您的图片中)。
不确定它是否有帮助,但我只是使用鼠标在 Turbo C ++ 中使用部分解算器来挖掘我的古老的扫雷游戏。它看起来像这样:
这里有 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;循环重绘屏幕并处理鼠标事件+游戏逻辑。我希望你应该有类似的东西。不同之处在于我的对象位于网格中,因此只需通过缩放/偏移鼠标位置即可完成选择。
在你的情况下你应该有对象列表,并且应该遍历它们并找到离鼠标最近的那个并且不要太远......类似于顶部的拖放示例链接答案。
此处还有另一个相关的质量保证: