太復雜,我分成幾部分試著做一下
專注于為中小企業提供成都網站設計、做網站服務,電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業合陽免費做網站提供優質的服務。我們立足成都,凝聚了一批互聯網行業人才,有力地推動了近千家企業的穩健成長,幫助中小企業通過網站建設實現規模擴充和轉變。
首先是畫棋盤,定義兩個二維數組來表示每個棋子的狀態和棋子周圍的雷數,用于顯示。
//畫棋盤 a表示棋子是否已被翻開,b表示附近的雷數
bool MakeMap(bool a[9][9],int b[9][9])
{
int i=0,j=0;
for(i=0;i9;i++)
{
for(j=0;j9;j++)
{
if(a[i][j]) printf("%d ",b[i][j]);
else printf("# ");
}
printf("\n");
}
return true;
}
能把代碼再多給點嗎?
那8個遞歸其實可以用兩個for來做的
void?ClickBlank(int?x,?int?y)?{
int?i,?j;
if?(isBlank(x,?y))?{
ShowAroundBlock(x,?y);
for?(i?=?-1;?i?=?1;?i++)?{
for?(j?=?-1;?j?=?1;?j++)?{
if?(i?==?0??j?==?0)?continue;
ClickBlank(x?+?i,?y?+?j);
}
}
}
}
而且你應該設訪問標記,已經ClickBlank的格子不應再調用ClickBlank
//俺學數據結構寫的..
#include iostream.h
#include stdlib.h
#include time.h
#include iomanip.h
#define m 12 //范圍為[m-2][n-2]
#define n 12
int a[m][n]={0},count=15;
int mark[m][n]={0};//標記矩陣
int flag=0;//游戲失敗時flag 標記為一
void init(){
int k1,k2,count1=0,sum,i,j;
srand(time(0));
while(count1count){// 安放count個炸藥
k1=rand()%(m-2)+1;
k2=rand()%(m-2)+1;
if(a[k1][k2]==0){
a[k1][k2]=-15;
count1++;
}
}
for(i=1;im-1;i++){//尋找每個點周圍的雷數
for(j=1;jn-1;j++){
sum=0;
if(a[i][j]==0){
for(int i1=-1;i12;i1++)
for(int j1=-1;j12;j1++){
if(a[i+i1][j+j1]==-15)//周圍八個格子如果有雷就 加
sum++;
}
a[i][j]=sum;
}
}
}
for(i=0;im;i++)//初始化外圍
a[0][i]=-i;
for(i=0;in;i++)
a[i][0]=-i;
}
void show(int row,int col){//顯示矩陣
int i,j;
if(flag==0){
for(i=0;icol-1;i++)
coutsetw(4)i;
coutendl;
for(i=1;irow-1;i++){
coutsetw(4)a[0][i];
for(j=1;jcol-1;j++){
if(mark[i][j]==0)
coutsetw(4)'X';
else
coutsetw(4)a[i][j];
}
coutendl;
}
}
if(flag==1){
for(i=0;irow-1;i++){
for(j=0;jcol-1;j++){
if(a[i][j]==-15)
coutsetw(4)'';
else
coutsetw(4)a[i][j];
}
coutendl;
}
}
}
void search(int row,int col){//利用遞歸求0的位置
if(row0col0rowm-1coln-1){
if(a[row][col]==0mark[row][col]==0){
mark[row][col]=1;
for(int i=-1;i2;i++)
for(int j=-1;j2;j++)
search(row+i,col+j);
}
else
if(a[row][col]0mark[row][col]==0)
mark[row][col]=1;
else
if(a[row][col]==-15)
return;
}
}
int win(){
for(int i=1;im-1;i++)
for(int j=1;jm-1;j++){
if(a[i][j]!=-15mark[i][j]==0)
return 0;
}
return 1;
}
void playsweep(){
init();
cout"ok1"endl;
show(m,n);
int row,col;
cout"請輸入橫,縱坐標"endl;
cinrowcol;
while(1){
if(a[row][col]==-15){
system("cls");
flag=1;
show(m,n);
cout"game over"endl;
break;
}
search(row,col);
system("cls");
show(m,n);
if(flag==1){
cout"zhongdan"endl;
break;
}
if(win()){
cout"youwin"endl;
break;
}
cout"請輸入橫,縱坐標"endl;
while(1){
cinrowcol;
if(mark[row][col]==0)
break;
cout"坐標錯誤,請從新輸入"endl;
}
if(a[row][col]==-15){
system("cls");
flag=1;
show(m,n);
cout"game over"endl;
break;
}
}
}
void main(){
playsweep();
}
網站標題:c語言掃雷遞歸展開函數 掃雷數組c語言最簡單代碼
文章源于:http://vcdvsql.cn/article14/ddoicde.html
成都網站建設公司_創新互聯,為您提供、網站營銷、靜態網站、做網站、企業網站制作、標簽優化
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯