⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 在AT89S52上写的一个扫雷程序
💻 C
📖 第 1 页 / 共 2 页
字号:
case 'p'://ENTER:
case 'w'://UP:
case 's'://DOWN:
case 'a': //aLEFT:
case 'd': //RIGHT:
case 'e'://ESC:
case 'u'://SPACE:
case 'f'://LOWERF:
case 'F'://UPPERF:
case 'o'://LOWERA:
case 'O'://UPPERA:
case 'q'://LOWERQ:
case 'Q'://UPPERQ: 
 return DisChar;break;
default:	return	0;
}
}


/*-----------miner.c--------*/

/*------------------------------------------------------------*/
/*                    一些全局变量的定义                       */
/*------------------------------------------------------------*/
#define ROW 8
#define COL 8
#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  xdata	table[ROW][COL]; /*随机生成的8*8点阵的雷区*/
int  xdata	num[ROW][COL];   /*该方块周围有雷的数量*/
int  xdata  flag[ROW][COL];  /*该方块是否被翻开*/
int data pi,pj;
int data	di[8]={-1,-1,0,1,1,1,0,-1};
int data	dj[8]={0,1,1,1,0,-1,-1,-1};

/*------------------------------------------------------------*/
/*                    随机产生8*8的随机数                      */
/*------------------------------------------------------------*/
void generateMine() small
{       /*产生8*8的随机数矩阵*/
int totalMine;
int i,k;
int ri,rj;
int ni,nj;
static int seed=0;
totalMine = ROW * COL /8; /*雷的数量是1/6*/
memset(table, 0 ,sizeof(table));
memset(num, 0 ,sizeof(num));
srand(seed++);
for(i=0;i<totalMine;i++){  /*随机产生1/6的雷*/
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) small
{
 if(i==pi&&j==pj){
switch(flag[i][j]){
case UNFLAG:
photo_disp(i, j, aunflag); /*显示一个未翻开的方块*/
break;
case FLAGED:
photo_disp(i, j, aflaged); /*显示一个插上标记的方块*/
break;
case QUESTION:
photo_disp(i, j, aquestion); /*显示一个不确定的方块*/
break;
case EXPLOD:
photo_disp(i, j, aexplod); /*显示一个炸开的方块*/
break;
case OPEN:
if(num[i][j]>=0 && num[i][j]<=8){
   switch(num[i][j]){
   case 0:
   photo_disp(i, j, azero);break; /*显示一个zero的方块*/
   case 1:
   photo_disp(i, j, aone);break; /*显示一个one的方块*/
   case 2:
   photo_disp(i, j, atwo);break; /*显示一个one的方块*/
   case 3:
   photo_disp(i, j, athree);break; /*显示一个three的方块*/
   case 4:
   photo_disp(i, j, afour);break; /*显示一个four的方块*/
   case 5:
   photo_disp(i, j, afive);break; /*显示一个five的方块*/
   case 6:
   photo_disp(i, j, asix);break; /*显示一个six的方块*/
   case 7:
   photo_disp(i, j, aseven) ;break;/*显示一个seven的方块*/
   case 8:
   photo_disp(i, j, aeight) ;break;/*显示一个eight的方块*/
}
break;
}
}}
else
{switch(flag[i][j]){
case UNFLAG:
photo_disp(i, j, unflag); /*显示一个未翻开的方块*/
break;
case FLAGED:
photo_disp(i, j, flaged); /*显示一个插上标记的方块*/
break;
case QUESTION:
photo_disp(i, j, question); /*显示一个不确定的方块*/
break;
case EXPLOD:
photo_disp(i, j, explod); /*显示一个炸开的方块*/
break;
case OPEN:
if(num[i][j]>=0 && num[i][j]<=8){
   switch(num[i][j]){
   case 0:
   photo_disp(i, j, zero);break; /*显示一个zero的方块*/
   case 1:
   photo_disp(i, j, one);break; /*显示一个one的方块*/
   case 2:
   photo_disp(i, j, two);break; /*显示一个one的方块*/
   case 3:
   photo_disp(i, j, three);break; /*显示一个three的方块*/
   case 4:
   photo_disp(i, j, four);break; /*显示一个four的方块*/
   case 5:
   photo_disp(i, j, five);break; /*显示一个five的方块*/
   case 6:
   photo_disp(i, j, six);break; /*显示一个six的方块*/
   case 7:
   photo_disp(i, j, seven) ;break;/*显示一个seven的方块*/
   case 8:
   photo_disp(i, j, eight) ;break;/*显示一个eight的方块*/
}
break;
}
}}
 
}

/*------------------------------------------------------------*/
/*                    画这个扫雷表格                            */
/*------------------------------------------------------------*/
void drawTable() small
{
int i,j;
for(i=0;i<ROW;i++)
for(j=0;j<COL;j++) drawBlock(i,j);
}

/*------------------------------------------------------------*/
/*                    开始一个新游戏                            */
/*------------------------------------------------------------*/
void newGame() small
{
generateMine();
pi = pj = 1;
drawTable();
}

/*------------------------------------------------------------*/
/*                  检查所有的雷是否都开了                     */
/*------------------------------------------------------------*/
int checkWin()small
{
int i,j;
for(i=0;i<ROW;i++){
for(j=0;j<COL;j++){
if(table[i][j] == 0 && flag[i][j] != OPEN) return 0;
}
}
return 1;
}

/*------------------------------------------------------------*/
/*                  询问是否要继续还是退出                     */
/*------------------------------------------------------------*/
int confirm(int res)small
{
if(res == 1) {    /*显示胜利界面,询问是否要继续*/
bmp_disp(win);
byte_disp(6,1,a);
byte_disp(6,2,g);
byte_disp(6,3,a);
byte_disp(6,4,i);
byte_disp(6,5,n);
}

else if(res == -1)
{ /*显示失败界面,询问是否要继续*/
byte_disp(3,2,l);
byte_disp(3,3,o);
byte_disp(3,4,s);
byte_disp(3,5,t);

byte_disp(5,1,a);
byte_disp(5,2,g);
byte_disp(5,3,a);
byte_disp(5,4,i);
byte_disp(5,5,n);

}

else {              /*询问是否要退出*/
byte_disp(3,2,e);
byte_disp(3,3,x);
byte_disp(3,4,i);
byte_disp(3,5,t);

byte_disp(5,1,a);
byte_disp(5,2,g);
byte_disp(5,3,a);
byte_disp(5,4,i);
byte_disp(5,5,n);

}
Delay400Ms();
BF=0;

while(1){			
if (BF==1)
{ Decode(KeyV);break;}
else				
EA = 1;
}
if(DisChar == 'Y' || DisChar == 'y') return 0;
return 1;
}

/*------------------------------------------------------------*/
/*                    向上移动                                */
/*------------------------------------------------------------*/
void moveUp(){
if(pi>0){
pi=pi-1;
drawBlock(pi+1,pj);
drawBlock(pi,pj);
}

/*------------------------------------------------------------*/
/*                     向下移动                                */
/*------------------------------------------------------------*/
}
void moveDown(){
if(pi<ROW-1){
pi=pi+1;
drawBlock(pi-1,pj);
drawBlock(pi,pj);
}

/*------------------------------------------------------------*/
/*                     向左移动                                */
/*------------------------------------------------------------*/
}
void moveLeft(){
if(pj>0){
pj=pj-1;
drawBlock(pi,pj+1);
drawBlock(pi,pj);
}
}

/*------------------------------------------------------------*/
/*                     向右移动                                */
/*------------------------------------------------------------*/
void moveRight(){
if(pj<COL-1){
pj=pj+1;
drawBlock(pi,pj-1);
drawBlock(pi,pj);
}
}

/*------------------------------------------------------------*/
/*                  标志方块有雷的转化程序                     */
/*------------------------------------------------------------*/
void flagBlock(int i,int j)small
{
if(flag[i][j] == FLAGED){
flag[i][j] = UNFLAG;
}
else if(flag[i][j] == UNFLAG){
flag[i][j] = FLAGED;
}
drawBlock(i,j);
}

/*------------------------------------------------------------*/
/*                  标志方块有疑问的转化程序                    */
/*------------------------------------------------------------*/
void questBlock(int i,int j)small
{
if(flag[i][j] == QUESTION){
flag[i][j] = UNFLAG;
}
else {
if(flag[i][j] == UNFLAG) flag[i][j] = QUESTION;
}
drawBlock(i,j);
}

/*------------------------------------------------------------*/
/*                  扫雷(一个方块)                           */
/*------------------------------------------------------------*/
int openMine(int i,int j) small reentrant
{
int ii,jj,k;
if(flag[i][j] == OPEN) return 0;
if(table[i][j]){ /*meet a mine*/
for(ii=0;ii<ROW;ii++){
for(jj=0;jj<COL;jj++){
if(table[ii][jj] && flag[ii][jj] == UNFLAG){
flag[ii][jj] = EXPLOD;
drawBlock(ii,jj);
}
}
}
return -1; /*lose the game*/
}
else{
flag[i][j] = OPEN;
drawBlock(i,j);
if(num[i][j]==0){
for(k=0;k<8;k++){
int ni = i + di[k];
int nj = j + dj[k];
if(ni>=0 && ni< ROW && nj>=0 && nj<COL)
openMine(ni,nj);
}
}
return 0;
}
}

/*------------------------------------------------------------*/
/*                  自动扫雷                                  */
/*------------------------------------------------------------*/
int autoOpen(int i,int j) small
{
int k,c=0;
int ni,nj;
int ret=0;
if(! (flag[i][j] == OPEN)) return 0;
for(k=0;k<8;k++){
ni = i + di[k];
nj = j + dj[k];
if(ni>=0 && ni< ROW && nj>=0 && nj<COL)
if(flag[ni][nj] == FLAGED) c++;
}
if(c == num[i][j]){
for(k=0;k<8;k++){
int ni = i + di[k];
int nj = j + dj[k];
if(ni>=0 && ni< ROW && nj>=0 && nj<COL)
if(flag[ni][nj] == UNFLAG){
if(openMine(ni,nj) == -1) ret = -1;
}
}
}
return ret;
}




/*----------main.c------------*/

void main() small
{
    int data	gameRes;
	 unsigned char data	key;
    RS=0;  /*初始化LCD显示器和8255*/
    E=0;
    com8255=0x80;
    init_lcd();
    Clr_Scr();
    bmp_disp(cover);
        IT1 = 0; 
	  EA = 1;
	  EX1 = 1;
    while(1)
     {  if(BF) 
          {BF=0;break;}
      }
    bmp_disp(start);
	 
do {
newGame();/*开始一个新游戏*/
gameRes=0;
/*当按键按下后主循环的处理过程*/
do{
key = getKey();
if(key == 'e') break;
switch(key){
case 'p':/*ENTER: case SPACE:*/ gameRes = openMine(pi,pj);break;
case 'w'/*UP*/: moveUp();break;
case 's'/*DOWN*/: moveDown();break;
case 'a':/*LEFT:*/ moveLeft();break;
case 'd':/*RIGHT:*/ moveRight();break;
case 'f':/*LOWERF: case UPPERF:*/ flagBlock(pi,pj);break;
case 'o':/*LOWERA: case UPPERA:*/ gameRes = autoOpen(pi,pj);break;
case 'q':/*LOWERQ:case UPPERQ:*/ questBlock(pi,pj);break;
}
if(checkWin()) gameRes = 1;
}while(!gameRes);

}while(!confirm(gameRes));
Clr_Scr();
while(1){;}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -