本文目錄一覽:
C語言 掃雷
#includestdio.h
int main(void)
{
char plat[100][100]; //雷的地圖
char plat_new[100][100]; //數字映射圖
int n, m; //存儲行、列數
int in, im;
int mark = 0; //記錄該點附近8個坐標雷的總數
int j = 1;
scanf(“%d %d”, n, m);
getchar(); //消除回車符的影響
do {
if (n == 0 m == 0)
break;
for (in = 0; in n; in++)
{
for (im = 0; im m; im++)
{
scanf(“%c”, plat[in][im]);
}
getchar();
}
for (in = 0; in n; in++)
for (im = 0; im m; im++)
{
if (plat[in][im] == ‘*’) /*該點有雷,無需檢測*/
{
plat_new[in][im]= plat[in][im];
continue;
}
if (in – 1 = 0) //檢測上面3個點的雷數
{
if (plat[in – 1][im] == ‘*’)
mark++;
if (im – 1 = 0 plat[in -1][im – 1] == ‘*’)
mark++;
if (im + 1 mplat[in -1][im + 1] == ‘*’)
mark++;
}
if (im – 1 = 0 plat[in][im- 1] == ‘*’) //檢測左右兩個點的雷數
mark++;
if (im + 1 m plat[in][im+ 1] == ‘*’)
mark++;
if (in + 1 n) //檢測下面3個點的雷數
{
if (plat[in + 1][im] == ‘*’)
mark++;
if (im – 1 = 0 plat[in +1][im – 1] == ‘*’)
mark++;
if (im + 1 mplat[in +1][im + 1] == ‘*’)
mark++;
}
switch (mark)
{
case 0:plat_new[in][im] = ‘0’; break;
case 1:plat_new[in][im] = ‘1’; break;
case 2:plat_new[in][im] = ‘2’; break;
case 3:plat_new[in][im] = ‘3’; break;
case 4:plat_new[in][im] = ‘4’; break;
case 5:plat_new[in][im] = ‘5’; break;
case 6:plat_new[in][im] = ‘6’; break;
case 7:plat_new[in][im] = ‘7’; break;
case 8:plat_new[in][im] = ‘8’; break;
}
mark = 0; //重置雷數
}
if (j != 1)
putchar(‘\n’);
printf(“Field#%d:\n”, j);
for (in = 0; in n; in++) //打印數字地圖
{
for (im = 0; im m; im++)
{
printf(“%c”, plat_new[in][im]);
}
if(in!=n-1)
putchar(‘\n’);
}
scanf(“%d %d”, n, m);
getchar();
j++;
} while (1);
return 0;
}
C語言掃雷算法,也可以別的語言,解釋清楚算法就好
在這上面不好說明, 我有C的代碼, 你看一下(DEVC++)
#include stdio.h
#include stdlib.h
#include time.h
#include windows.h
#define n 15
int restart=0;
int last_sel_x,last_sel_y;
char in[20];
struct POINT
{
int x;
int y;
} pt;
//設置CMD窗口光標位置
void setxy(int x, int y)
{
COORD coord = {x, y};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
//獲取當前CMD當前光標所在位置
void getxy()
{
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
COORD coordScreen = {0, 0}; //光標位置
CONSOLE_SCREEN_BUFFER_INFO csbi;
if (GetConsoleScreenBufferInfo(hConsole, csbi))
{
// printf(“光標坐標:(%d,%d)\n”, csbi.dwCursorPosition.X, csbi.dwCursorPosition.Y);
pt.x=csbi.dwCursorPosition.X;
pt.y=csbi.dwCursorPosition.Y;
}
}
struct A
{
int value; //-1為雷
int state; //顯示狀態: 0為未打開, 1為已打開
int lock; //鎖定狀態
int bomb; //雷已標記: 0為未標記, 1為已標記
};
struct A s[10][10];
int calc()
{
int i,j,count=0;
for(i=0;i10;i++)
{
for(j=0;j10;j++)
{
if(s[i][j].state==0) count++;
}
}
return count;
}
int prt()
{
system(“cls”);
int count=calc();
int i,j;
printf(“%3c”,’ ‘);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |
FOREGROUND_GREEN);
for(i=0;i10;i++)
{
printf(“%3d”,i);
}
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |
FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
for(i=0;i10;i++)
{
printf(“\n”);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |
FOREGROUND_GREEN);
printf(“%3d”,i);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |
FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
for(j=0;j10;j++)
{
if(s[i][j].bomb==1)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |
FOREGROUND_RED);
printf(“%3c”,’*’);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |
FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
}
else if(s[i][j].state==1)
{
if(s[i][j].value==0) printf(“%3c”,’ ‘);
else printf(“%3d”,s[i][j].value);
}
else
{
printf(“%3c”,’-‘);
}
/* if(s[i][j].value==-1) printf(“%3c”,’*’);
else printf(“%3d”,s[i][j].value);*/
}
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |
FOREGROUND_GREEN);
printf(“%3d”,i);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |
FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
}
printf(“\n”);
printf(“%3c”,’ ‘);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |
FOREGROUND_GREEN);
for(i=0;i10;i++)
{
printf(“%3d”,i);
}
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |
FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
printf(“\n”);
getxy();
setxy(45,0);
printf(“%d”,count);
setxy(40,5);
printf(“說明”);
setxy(40,7);
printf(“1: 輸入 *xy(如:*55),則把第5行第5列”);
setxy(40,8);
printf(” 標記為地雷”);
setxy(40,10);
printf(“2: 輸入 xy(如55),則把第5行第5列打開”);
if(count==n)
{
for(i=0;i10;i++)
{
for(j=0;j10;j++)
{
if(s[i][j].value==-1 s[i][j].bomb==0) s[i][j].bomb=1;
if(s[i][j].value!=-1 s[i][j].state==0) s[i][j].state=1;
}
}
setxy(50,2);
printf(“success!”);
setxy(pt.x,pt.y);
fflush(stdin);
getchar();
return 1;
}
setxy(pt.x,pt.y);
return 0;
}
void space_process(int x,int y)
{
int i,j;
if(x-1=0 y-1=0)
{
if(s[x-1][y-1].value==0 s[x-1][y-1].lock==0) {s[x-1][y-1].state=1; s[x-1][y-1].lock=1; space_process(x-1,y-1);}
else if(s[x-1][y-1].value!=-1) s[x-1][y-1].state=1;
}
if(x-1=0)
{
if(s[x-1][y].value==0 s[x-1][y].lock==0) {s[x-1][y].state=1; s[x-1][y].lock=1; space_process(x-1,y);}
else if(s[x-1][y].value!=-1) s[x-1][y].state=1;
}
if(x-1=0 y+110)
{
if(s[x-1][y+1].value==0 s[x-1][y+1].lock==0) {s[x-1][y+1].state=1; s[x-1][y+1].lock=1; space_process(x-1,y+1);}
else if(s[x-1][y+1].value!=-1) s[x-1][y+1].state=1;
}
if(y-1=0)
{
if(s[x][y-1].value==0 s[x][y-1].lock==0) {s[x][y-1].state=1; s[x][y-1].lock=1; space_process(x,y-1);}
else if(s[x][y-1].value!=-1) s[x][y-1].state=1;
}
if(y+110)
{
if(s[x][y+1].value==0 s[x][y+1].lock==0) {s[x][y+1].state=1; s[x][y+1].lock=1; space_process(x,y+1);}
else if(s[x][y+1].value!=-1) s[x][y+1].state=1;
}
if(x+110 y-1=0)
{
if(s[x+1][y-1].value==0 s[x+1][y-1].lock==0) {s[x+1][y-1].state=1; s[x+1][y-1].lock=1; space_process(x+1,y-1);}
else if(s[x+1][y-1].value!=-1) s[x+1][y-1].state=1;
}
if(x+110)
{
if(s[x+1][y].value==0 s[x+1][y].lock==0) {s[x+1][y].state=1; s[x+1][y].lock=1; space_process(x+1,y);}
else if(s[x+1][y].value!=-1) s[x+1][y].state=1;
}
if(x+110 y+110)
{
if(s[x+1][y+1].value==0 s[x+1][y+1].lock==0) {s[x+1][y+1].state=1; s[x+1][y+1].lock=1; space_process(x+1,y+1);}
else if(s[x+1][y+1].value!=-1) s[x+1][y+1].state=1;
}
}
int process_char(char* t,int* i,int* j)
{
int len=strlen(t);
int x,y=0;
for(x=0;xlen;x++)
{
if(t[x]==’ ‘)
{
continue;
}
else
{
t[y++]=t[x];
}
}
t[y]=’\0′;
if(t[0]==’*’)
{
*i=t[1]-‘0’;
*j=t[2]-‘0’;
if(s[*i][*j].bomb==1)
{
s[*i][*j].bomb=0;
s[*i][*j].state=0;
}
else if(s[*i][*j].bomb==0 s[*i][*j].state==0)
{
s[*i][*j].bomb=1;
}
return 1;
}
else if(t[0]=’0′ t[0]=’9′)
{
*i=t[0]-‘0’;
*j=t[1]-‘0’;
return 0;
}
return 1;
}
int plus(int x, int y) //返回0為出錯,返回1為正確,返回-1為取消
{
int count=s[x][y].value;
int bomb=0;
if(count==0 || count==-1) return -1;
if(x-1=0 y-1=0)
{
if(s[x-1][y-1].bomb==1) bomb++;
}
if(x-1=0)
{
if(s[x-1][y].bomb==1) bomb++;
}
if(x-1=0 y+110)
{
if(s[x-1][y+1].bomb==1) bomb++;
}
if(y-1=0)
{
if(s[x][y-1].bomb==1) bomb++;
}
if(y+110)
{
if(s[x][y+1].bomb==1) bomb++;
}
if(x+110 y-1=0)
{
if(s[x+1][y-1].bomb==1) bomb++;
}
if(x+110)
{
if(s[x+1][y].bomb==1) bomb++;
}
if(x+110 y+110)
{
if(s[x+1][y+1].bomb==1) bomb++;
}
if(bomb==s[x][y].value)
{
if(x-1=0 y-1=0)
{
if(s[x-1][y-1].value==-1 s[x-1][y-1].bomb==0) {return 0;}
}
if(x-1=0)
{
if(s[x-1][y].value==-1 s[x-1][y].bomb==0) return 0;
}
if(x-1=0 y+110)
{
if(s[x-1][y+1].value==-1 s[x-1][y+1].bomb==0) return 0;
}
if(y-1=0)
{
if(s[x][y-1].value==-1 s[x][y-1].bomb==0) return 0;
}
if(y+110)
{
if(s[x][y+1].value==-1 s[x][y+1].bomb==0) return 0;
}
if(x+110 y-1=0)
{
if(s[x+1][y-1].value==-1 s[x+1][y-1].bomb==0) return 0;
}
if(x+110)
{
if(s[x+1][y].value==-1 s[x+1][y].bomb==0) return 0;
}
if(x+110 y+110)
{
if(s[x+1][y+1].value==-1 s[x+1][y+1].bomb==0) return 0;
}
space_process(x,y);
int i,j;
for(i=0;i10;i++)
{
for(j=0;j10;j++)
{
s[i][j].lock=0;
}
}
return 1;
}
else
{
return -1;
}
}
void prt_selected(int x, int y, int flag)
{
if(flag==0)
{
if(x=0) x=last_sel_x;
if(y=0) y=last_sel_y;
}
int plus=2;
getxy();
if(x=0)
{
last_sel_x=x;
setxy(3,x+1);
int j;
if(flag==1) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_BLUE | FOREGROUND_INTENSITY);
else SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |
FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
for(j=0;j10;j++)
{
if(s[x][j].bomb==1)
{
if(flag==1) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |
FOREGROUND_RED | BACKGROUND_BLUE);
else SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |
FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
printf(“%3c”,’*’);
}
else if(s[x][j].state==1)
{
if(s[x][j].value==0) printf(“%3c”,’ ‘);
else printf(“%3d”,s[x][j].value);
}
else
{
printf(“%3c”,’-‘);
}
}
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |
FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
}
if(y=0)
{
int i;
last_sel_y=y;
for(i=0;i10;i++)
{
if(last_sel_x==i) continue;
if(flag==1) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_BLUE | FOREGROUND_INTENSITY);
else SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |
FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
setxy(3*y+3,i+1);
if(s[i][y].bomb==1)
{
if(flag==1) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |
FOREGROUND_RED | BACKGROUND_BLUE);
else SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |
FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
printf(“%3c”,’*’);
}
else if(s[i][y].state==1)
{
if(s[i][y].value==0) printf(“%3c”,’ ‘);
else printf(“%3d”,s[i][y].value);
}
else
{
printf(“%3c”,’-‘);
}
}
}
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |
FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
setxy(pt.x,pt.y);
}
void input() //實時獲取鍵盤輸入
{
int c;
int x=-1,y=-1;
int i=0;
int first_num=0;
while(1)
{
fflush(stdin);
c=getch();
printf(“%c”,c);
if(c==10 || c==13) break;
if(c==8 i0)
{
in[i-1]=’\0′;
if(in[0]==’*’)
{
if(in[1]’0′ || in[1]’9′)
{
x=-1;
prt_selected(last_sel_x,-1,0);
}
if(in[2]’0′ || in[2]’9′)
{
y=-1;
prt_selected(-1,last_sel_y,0);
}
}
else
{
if(in[0]’0′ || in[0]’9′)
{
x=-1;
prt_selected(last_sel_x,-1,0);
}
if(in[1]’0′ || in[1]’9′)
{
y=-1;
prt_selected(-1,last_sel_y,0);
}
}
i–;
getxy();
setxy(pt.x,pt.y);
printf(” “);
setxy(pt.x,pt.y);
}
else if(c==’*’ || (c=’0′ c=’9′))
{
in[i++]=c;
if(in[0]==’*’)
{
if(in[1]!=’\0′ in[1]=’0′ in[1]=’9′)
{
x=in[1]-‘0’;
}
else
{
x=-1;
}
if(in[2]!=’\0′ in[2]=’0′ in[2]=’9′)
{
y=in[2]-‘0’;
}
else
{
y=-1;
}
}
else if(in[0]=’0′ in[0]=’9′)
{
x=in[0]-‘0’;
if(in[1]=’0′ in[1]=’9′)
{
y=in[1]-‘0’;
}
else
{
y=-1;
}
}
else x=-1;
if(x-1) prt_selected(x,-1,1);
if(y-1) prt_selected(-1,y,1);
}
}
}
int main()
{
int i=0,j,x,y;
while(1)
{
restart=0;
for(i=0;i10;i++)
{
for(j=0;j10;j++)
{
s[i][j].value=0;
s[i][j].state=0;
s[i][j].lock=0;
s[i][j].bomb=0;
}
}
srand((unsigned)time(0));
i=0;
while(in)
{
x=rand()%10;
y=rand()%10;
if(s[x][y].value!=-1)
{
s[x][y].value=-1;
i++;
}
}
for(i=0;i10;i++)
{
for(j=0;j10;j++)
{
if(s[i][j].value==-1) continue;
// n=0;
if(i-1=0)
{
if(s[i-1][j].value==-1) s[i][j].value++;
if(j-1=0)
{
if(s[i-1][j-1].value==-1) s[i][j].value++;
}
if(j+110)
{
if(s[i-1][j+1].value==-1) s[i][j].value++;
}
}
if(i+110)
{
if(s[i+1][j].value==-1) s[i][j].value++;
if(j-1=0)
{
if(s[i+1][j-1].value==-1) s[i][j].value++;
}
if(j+110)
{
if(s[i+1][j+1].value==-1) s[i][j].value++;
}
}
if(j-1=0)
{
if(s[i][j-1].value==-1) s[i][j].value++;
}
if(j+110)
{
if(s[i][j+1].value==-1) s[i][j].value++;
}
}
}
if(prt()==1)
{
restart=1;
continue;
}
while(1)
{
memset(in,’\0′,20);
fflush(stdin);
// scanf(“%[^\n]”,in);
input();
if(process_char(in,i,j)==1)
{
if(prt()==1)
{
restart=1;
break;
}
continue;
}
for(x=0;x10;x++)
{
for(y=0;y10;y++)
{
s[x][y].lock=0;
}
}
if(s[i][j].value==-1)
{
printf(“\nBomb”);
fflush(stdin);
getchar();
restart=1;
}
else if(s[i][j].value==0)
{
s[i][j].state=1;
space_process(i,j);
}
else if(s[i][j].state==1)
{
int re=plus(i,j);
{
switch(re)
{
case -1:
break;
case 0:
printf(“\nBomb”);
fflush(stdin);
getchar();
restart=1;
break;
case 1:break;
}
}
}
else
{
s[i][j].state=1;
}
if(prt()==1 || restart==1)
{
restart=0;
break;
}
}
}
return 0;
}
C語言掃雷源代碼 不用鼠標 操作 急求!!!
#include stdio.h
#include stdlib.h
#include time.h
#include string.h
#include conio.h
#include windows.h
#define N 3
struct mine_box {
char type; // ‘*’代表地雷,n代表周圍有地雷的地雷數(n=0-8)
char bMarked; // 是否被標記
char bOpened; // 是否被打開
} mine_array[N][N];
int CurrentRow, CurrentCol; // 記錄當前光標的位置
int openedBlank = 0; // 記錄被掀開的格子數
/*將光標定位到屏幕上的某個指定位置的坐標上*/
void gotoxy(int x,int y)
{ CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
HANDLE hConsoleOut;
hConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleScreenBufferInfo(hConsoleOut,csbiInfo);
csbiInfo.dwCursorPosition.X = x;
csbiInfo.dwCursorPosition.Y = y;
SetConsoleCursorPosition(hConsoleOut,csbiInfo.dwCursorPosition);
}
// 顯示一個格子的內容
void printBox(struct mine_box mb)
{
// 格子沒被掀開也沒做標記
if(mb.bOpened == 0 mb.bMarked == 0)
printf(“□”);
// 格子被標記一次
else if(mb.bMarked == 1)
printf(“√”);
// 格子被標記兩次
else if(mb.bMarked == 2)
printf(“?”);
// 格子被掀開,顯示格子中的內容
else
switch(mb.type) {
// 格子中有地雷
case ‘*’:
printf(“⊕”);
break;
// 格子沒有地雷並且四周也沒有地雷
case 0:
printf(“ ”);
break;
case 1:
printf(“1”);
break;
case 2:
printf(“2”);
break;
case 3:
printf(“3”);
break;
case 4:
printf(“4”);
break;
case 5:
printf(“5”);
break;
case 6:
printf(“6”);
break;
case 7:
printf(“7”);
break;
case 8:
printf(“8”);
break;
}
}
// 將光標移動到第row行第col列的格子上
void MoveTo(int row, int col)
{
CurrentRow = row;
CurrentCol = col;
gotoxy(CurrentCol*4+2,CurrentRow*2+1);
}
// 刷新屏幕
void refreshScreen(int state)
{
int i, j;
gotoxy(0, 0);
printf(“┏━”);
for(i = 1; i N; i++)
printf(“┳━”);
printf(“┓\n”);
for(i = 0; i N; i++) {
printf(“┃”);
for(j = 0; j N; j++) {
if(state == -1 mine_array[i][j].bMarked == 1 mine_array[i][j].type != ‘*’) {
printf(“¤”); // 標記錯了地雷
continue;
}
if(state != 0) { // 遊戲結束,將所有的盒子掀開顯示其中內容
mine_array[i][j].bOpened = 1;
mine_array[i][j].bMarked = 0;
}
printBox(mine_array[i][j]);
printf(“┃”);
}
if(i N-1) {
printf(“\n┣”);
for(j = 1; j N; j++) {
printf(“━╋”);
}
printf(“━┫\n”);
}
else {
printf(“\n┗”);
for(j = 1; j N; j++) {
printf(“━┻”);
}
printf(“━┛\n”);
}
}
printf(“按鍵指南:A左移,D右移,W上移,S下移,X翻開,C標記,Q退出\n”);
}
void MoveUp()
{
if(CurrentRow 0) {
CurrentRow –;
MoveTo(CurrentRow, CurrentCol);
}
}
void MoveDown()
{
if(CurrentRow N-1) {
CurrentRow ++;
MoveTo(CurrentRow, CurrentCol);;
}
}
void MoveLeft()
{
if(CurrentCol 0) {
CurrentCol –;
MoveTo(CurrentRow, CurrentCol);
}
}
void MoveRight()
{
if(CurrentCol N-1) {
CurrentCol ++;
MoveTo(CurrentRow, CurrentCol);
}
}
int openMine()
{
int saveRow = CurrentRow, saveCol = CurrentCol;
if(mine_array[CurrentRow][CurrentCol].bOpened)
return 0;
mine_array[CurrentRow][CurrentCol].bOpened = 1;
mine_array[CurrentRow][CurrentCol].bMarked = 0;
if(mine_array[CurrentRow][CurrentCol].type == ‘*’) {
refreshScreen(-1);
MoveTo(N+1, 0);
printf(“失敗!遊戲結束)\n”);
exit(2);
}
printBox(mine_array[CurrentRow][CurrentCol]);
MoveTo(CurrentRow, CurrentCol);
// 進一步要做的是當掀開一個type=0的空格子時,將其周圍沒有地雷的空格子自動掀開
return 1;
}
void markMine()
{
if(mine_array[CurrentRow][CurrentCol].bOpened == 1)
return;
if(mine_array[CurrentRow][CurrentCol].bMarked == 0)
mine_array[CurrentRow][CurrentCol].bMarked = 1;
else if(mine_array[CurrentRow][CurrentCol].bMarked == 1)
mine_array[CurrentRow][CurrentCol].bMarked = 2;
else if(mine_array[CurrentRow][CurrentCol].bMarked ==2)
mine_array[CurrentRow][CurrentCol].bMarked = 0;
printBox(mine_array[CurrentRow][CurrentCol]);
MoveTo(CurrentRow, CurrentCol);
}
main()
{
int num, i, j, row, col, count;
printf(“輸入地雷數: “);
scanf(“%u”, num);
if(num N*N) {
printf(“地雷數超限\n”);
return -1;
}
memset((void*)mine_array, 0, N*N*sizeof(struct mine_box));
//隨機設置num個地雷的位置
srand((unsigned)time(NULL));
for(i=0; inum; i++) {
row = rand()%N;
col = rand()%N;
if(mine_array[row][col].type == 0)
mine_array[row][col].type = ‘*’;
else // 已經有雷了,重新取下一個格子
i–;
}
// 計算每個非雷格子周圍的地雷數
for(row=0; rowN; row++)
{
for(col = 0; col N; col++) {
if(mine_array[row][col].type == ‘*’) {
for(i = row-1; i = row+1; i++) {
for(j = col-1; j = col+1; j++) {
if(i = 0 j = 0 i N j N mine_array[i][j].type != ‘*’)
mine_array[i][j].type ++;
}
}
}
}
}
refreshScreen(0);
MoveTo(N/2, N/2); // 將光標移到中央的位置
do {
switch(getch()) {
case ‘a’:
case ‘A’:
MoveLeft();
break;
case ‘s’:
case ‘S’:
MoveDown();
break;
case ‘d’:
case ‘D’:
MoveRight();
break;
case ‘w’:
case ‘W’:
MoveUp();
break;
case ‘x’:
case ‘X’:
if(openMine() == 1) {
if(++openedBlank == N*N-num) { //所有的空格都被掀開
refreshScreen(1);
MoveTo(N+1, 0);
printf(“成功!遊戲結束。\n”);
exit(0);
}
}
break;
case ‘c’:
case ‘C’:
markMine();
break;
case ‘q’:
case ‘Q’:
MoveTo(N+1, 0);
printf(“是否退出?(y/n)”);
if(getch() == ‘y’)
return 0;
}
} while(1);
}
C語言編簡單的掃雷
給你一個完整的掃雷源碼
#include conio.h
#include graphics.h
#include stdio.h
#include stdlib.h
#include time.h
#include ctype.h
#include “mouse.c”
#define YES 1
#define NO 0
#define XPX 15 /* X pixels by square */
#define YPX 15 /* Y pixels by square */
#define DEFCX 30 /* Default number of squares */
#define DEFCY 28
#define MINE 255-‘0’ /* So that when it prints, it prints char 0xff */
#define STSQUARE struct stsquare
STSQUARE {
unsigned char value; /* Number of mines in the surround squares */
unsigned char sqopen; /* Square is open */
unsigned char sqpress; /* Square is pressed */
unsigned char sqmark; /* Square is marked */
} *psquare;
#define value(x,y) (psquare+(x)*ncy+(y))-value
#define sqopen(x,y) (psquare+(x)*ncy+(y))-sqopen
#define sqpress(x,y) (psquare+(x)*ncy+(y))-sqpress
#define sqmark(x,y) (psquare+(x)*ncy+(y))-sqmark
int XST, /* Offset of first pixel X */
YST,
ncx, /* Number of squares in X */
ncy,
cmines, /* Mines discovered */
initmines, /* Number of initial mines */
sqclosed, /* Squares still closed */
maxy; /* Max. number of y pixels of the screen */
void Graph_init(void);
void Read_param(int argc, char *argv[]);
void Set_mines(int nminas);
void Set_square(int x, int y, int status);
void Mouse_set(void);
void Draw_squares(void);
int Do_all(void);
void Blow_up(void);
void Open_square(int x, int y);
int Open_near_squares(int x, int y);
/************************************************************************/
void main(int argc, char *argv[])
{
if (!mouse_reset()) {
cputs(” ERROR: I can’t find a mouse driver\r\n”);
exit(2);
}
Graph_init();
Read_param(argc, argv);
Mouse_set();
do {
randomize();
cleardevice();
Set_mines(cmines=initmines);
mouse_enable();
Draw_squares();
}
while (Do_all() != ‘\x1b’);
closegraph();
}
/*************************************************************************
* *
* F U N C T I O N S *
* *
*************************************************************************/
/*———————————————————————-*/
void Graph_init(void)
{
int graphdriver=DETECT, graphmode, errorcode;
if(errorcode 0) {
cprintf(“\n\rGraphics System Error: %s\n”,grapherrormsg(errorcode));
exit(98);
}
initgraph(graphdriver, graphmode, “”);
errorcode=graphresult();
if(errorcode!=grOk) {
printf(” Graphics System Error: %s\n”,grapherrormsg(errorcode));
exit(98);
}
maxy=getmaxy();
} /* Graph_init */
/*———————————————————————-*/
void Read_param(int argc, char *argv[])
{
int x, y, m;
x=y=m=0;
if (argc!=1) {
if (!isdigit(*argv[1])) {
closegraph();
cprintf(“Usage is: %s [x] [y] [m]\r\n\n”
“Where x is the horizontal size\r\n”
” y is the vertical size\r\n”
” m is the number of mines\r\n\n”
” Left mouse button: Open the square\r\n”
“Right mouse button: Mark the square\r\n”
” -The first time puts a ‘mine’ mark\r\n”
” -The second time puts a ‘possible ”
“mine’ mark\r\n”
” -The third time unmarks the square\r\n”
“Left+Right buttons: Open the surrounded squares only if ”
“the count of mines\r\n”
” is equal to the number in the square”,argv[0]);
exit (1);
}
switch (argc) {
case 4: m=atoi(argv[3]);
case 3: y=atoi(argv[2]);
case 2: x=atoi(argv[1]);
}
}
XST=100;
ncx=DEFCX;
if (maxy==479) {
YST=30;
ncy=DEFCY;
}
else {
YST=25;
ncy=20;
}
if (x0 xncx)
ncx=x;
if (y0 yncy) {
YST+=((ncy-y)*YPX)1;
ncy=y;
}
initmines= m ? m : ncx*ncy*4/25; /* There are about 16% of mines */
if (((void near*)psquare=calloc(ncx*ncy, sizeof(STSQUARE)))==NULL) {
closegraph();
cputs(“ERROR: Not enought memory”);
exit(3);
}
} /* Read_param */
/*———————————————————————-*/
void Set_mines(int nminas)
{
原創文章,作者:XDGW,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/148581.html