📄 main.c
字号:
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 + -