设计一个按钮集合,数量由段数控制。然后对按钮的位置下设随即数。
*来自互联网,未经验证*
#include <bios.h>
#include <graphics.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#define ENTER 0x1c0d
#define UP 0x4800
#define DOWN 0x5000
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define ESC 0x011b
#define SPACE 0x3920
#define LOWERF 0x2166
#define UPPERF 0x2146
#define LOWERA 0x1e61
#define UPPERA 0x1e41
#define LOWERQ 0x1071
#define UPPERQ 0x1051
#define ROW 16
#define COL 16
#define STARTX 50
#define STARTY 50
#define SIZEX 20
#define SIZEY 20
#define UNFLAG 0
#define FLAGED 1
#define QUESTION 20
#define EXPLOD 30
#define OPEN 40
int table[ROW][COL];
int num[ROW][COL];
int flag[ROW][COL];
int pi,pj;
int di[8]={-1,-1,0,1,1,1,0,-1};
int dj[8]={0,1,1,1,0,-1,-1,-1};
int getKey(void){
while(1){
int key=bioskey(0);
switch(key){
case ENTER:
case UP:
case DOWN:
case LEFT:
case RIGHT:
case ESC:
case SPACE:
case LOWERF:
case UPPERF:
case LOWERA:
case UPPERA:
case LOWERQ:
case UPPERQ: return key;
}
}
}
void initGraph(){
int gdriver = DETECT, gmode, errorcode;
initgraph(&gdriver, &gmode, "d:\\turboc2\\bgi\\");
errorcode = graphresult();
if (errorcode != grOk)
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1);
}
}
void generateMine(){
int totalMine;
int i,k;
int ri,rj;
int ni,nj;
static int seed=0;
totalMine = ROW * COL / 6;
memset(table, 0 ,sizeof(table));
memset(num, 0 ,sizeof(num));
srand(seed++);
for(i=0;i<totalMine;i++){
do{
ri = rand()%ROW;
rj = rand()%COL;
}while(table[ri][rj]);
for(k=0;k<8;k++){
ni = ri + di[k];
nj = rj + dj[k];
if(ni>=0 && ni< ROW && nj>=0 && nj<COL) num[ni][nj]++;
}
table[ri][rj] = 1;
}
memset(flag,UNFLAG,sizeof(flag));
}
void drawBlock(int i, int j){
int x,y,xx,yy;
int color;
int mx,my;
x = STARTX+j*SIZEX;
y = STARTY+i*SIZEY;
xx = x+SIZEX-1;
yy = y+SIZEY-1;
color = (flag[i][j]==UNFLAG)?LIGHTGRAY:DARKGRAY;
setcolor(WHITE);
rectangle(x,y,xx,yy);
setfillstyle(SOLID_FILL,color);
floodfill(x+1,y+1,WHITE);
setcolor(WHITE); line(x,y,xx,y);line(x,y,x,yy);
setcolor(BLACK); line(xx,y,xx,yy);line(x,yy,xx,yy);
if(pi==i && pj==j){
setcolor(RED);
rectangle(x+1,y+1,xx-1,yy-1);
}
mx = x+5;
my = y+5;
setcolor(LIGHTGRAY);
switch(flag[i][j]){
case UNFLAG:
outtextxy(mx,my," ");
break;
case FLAGED:
outtextxy(mx,my,"F");
break;
case QUESTION:
outtextxy(mx,my,"?");
break;
case EXPLOD:
outtextxy(mx,my,"*");
break;
case OPEN:
if(num[i][j]>=1 && num[i][j]<=8){
char buf[3];
itoa(num[i][j],buf,10);
outtextxy(mx,my,buf);
}
break;
}
}
void drawTable(){
int i,j;
for(i=0;i<ROW;i++)
for(j=0;j<COL;j++) drawBlock(i,j);
}
/*do initiation when start game*/
void newGame(){
cleardevice();
generateMine();
pi = pj = 0;
drawTable();
}