找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 9478|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

掃雷游戲雷陣及提示生成方法(加個(gè)界面就能做掃雷游戲了)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:72008 發(fā)表于 2015-1-11 20:04 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式






#include <stdio.h>
#include <stdlib.h>
#include<time.h>/*用到了time函數(shù),所以要有這個(gè)頭文件*/ #define LEI 10           //地雷標(biāo)記
#define LEI_X 15        //雷區(qū)列數(shù)
#define LEI_Y 15          //雷區(qū)行數(shù)
int LEI_buju[LEI_Y][LEI_X];   //雷區(qū)地圖用二維數(shù)組表示
int LEI_buju_init(void); //雷區(qū)地圖初始化函數(shù)
int LEI_buju_print(void); //雷區(qū)狀態(tài)輸出到屏幕(調(diào)試用,做掃雷游戲時(shí)用自己的UI線程代替)
int LEI_buju_bulei(void); //布雷函數(shù)(隨機(jī)的把LEI_X*LEI_Y/10個(gè)雷步到雷區(qū)中)
int LEI_buju_tishi(void);  //計(jì)算地雷提示

main()
{
      LEI_buju_init();
      LEI_buju_bulei();
      LEI_buju_print();
      LEI_buju_tishi();
      system("pause");
}

////////////////////////////////////////////////////////////////////////////////
int LEI_buju_init(void)
{
    //初始化雷區(qū)數(shù)組
    int x,y;
    for(y=0;y<LEI_Y;y++)
     for(x=0;x<LEI_X;x++)
     {
      LEI_buju[y][x]=0;               
     }
    return 1;
}
////////////////////////////////////////////////////////////////////////////////
int LEI_buju_print(void)
{
    //向屏幕輸出雷區(qū)狀態(tài)
    int x,y;
    printf("%dx%d雷區(qū)布雷情況如下(1表示是地雷0表示無雷):\n\n",LEI_Y,LEI_X);
    for(y=0;y<LEI_Y;y++)
    {
        for(x=0;x<LEI_X;x++)
        {
         if(LEI_buju[y][x]==0) printf("%d ",LEI_buju[y][x]);
          else {printf("%d ",(LEI_buju[y][x]-9)); }
        }
      printf("\n");
     }
    ///////////////////////////////////////////////
    printf("\n去掉安全區(qū)域后的雷區(qū)布局如下:\n");
    for(y=0;y<LEI_Y;y++)
    {
        for(x=0;x<LEI_X;x++)
        {
         if(LEI_buju[y][x]==0) {printf("  ");}
         else {printf("Q "); }   
        }
      printf("\n");
     }
     printf("\n");
    return 1;
}
////////////////////////////////////////////////////////////////////////////////
int LEI_buju_bulei(void)
{
    //向雷區(qū)中隨機(jī)布雷
    int x,y,L,l;
    L=LEI_Y*LEI_X/10; //雷區(qū)中地雷總數(shù)
    srand((unsigned)time(NULL));//調(diào)用該方法產(chǎn)生隨機(jī)數(shù)的種子
    for(l=0;l<L;)
    {
    y=rand()%LEI_Y; //隨機(jī)產(chǎn)生地雷所在的行系數(shù)
    x=rand()%LEI_X; //隨機(jī)產(chǎn)生地雷所在的列系數(shù)
    if(LEI_buju[y][x]==LEI) {continue;}
     else if(LEI_buju[y][x]==0)
     {
        LEI_buju[y][x]=LEI;
        l++;
     }  
    }   
    return 1;
}
////////////////////////////////////////////////////////////////////////////////
int LEI_buju_tishi(void)
{
    //計(jì)算地雷位置提示,數(shù)據(jù)保存在雷區(qū)布局?jǐn)?shù)組中
    int BJ[LEI_Y][LEI_X];
    int x,y;
    for(y=0;y<LEI_Y;y++)
    {
     for(x=0;x<LEI_X;x++)
     {
       BJ[y][x]=0;                 
     }
    }
    //計(jì)算四個(gè)角
     if(LEI_buju[0][0]==LEI)
            {
              BJ[y][x]=LEI;
             }else BJ[0][0]=(LEI_buju[0][1]+LEI_buju[1][0]+LEI_buju[1][1])/10;
            
     if(LEI_buju[y-1][0]==LEI)
            {
              BJ[y][x]=LEI;
             }else BJ[LEI_Y-1][0]=(LEI_buju[LEI_Y-2][0]+LEI_buju[LEI_Y-2][1]+LEI_buju[LEI_Y-1][1])/10;
   
     if(LEI_buju[0][LEI_X-1]==LEI)
            {
              BJ[y][x]=LEI;
             }else BJ[0][LEI_X-1]=(LEI_buju[0][LEI_X-2]+LEI_buju[0][LEI_X-1]+LEI_buju[1][LEI_X-2])/10;
   
     if(LEI_buju[LEI_Y-1][LEI_X-1]==LEI)
            {
              BJ[y][x]=LEI;
             }else BJ[LEI_Y-1][LEI_X-1]=(LEI_buju[LEI_Y-2][LEI_X-2]+LEI_buju[LEI_Y-2][LEI_X-1]+LEI_buju[LEI_Y-1][LEI_X-2])/10;
   //計(jì)算第一行
   for(y=0,x=1;x<LEI_X-1;x++)
   {
       if(LEI_buju[y][x]==LEI)
            {
              BJ[y][x]=LEI;
             }else
             {                       
             BJ[y][x]=(LEI_buju[y][x-1]+LEI_buju[y][x+1]+
             LEI_buju[y+1][x-1]+ LEI_buju[y+1][x]+LEI_buju[y+1][x+1])/10;
             }                     
    }
    //計(jì)算第一列
    for(y=1,x=0;y<LEI_Y-1;y++)
    {
      if(LEI_buju[y][x]==LEI)
            {
              BJ[y][x]=LEI;
             }else
             {                        
              BJ[y][x]=(LEI_buju[y-1][x]+LEI_buju[y-1][x+1]+
              LEI_buju[y][x+1]+
              LEI_buju[y+1][x]+LEI_buju[y+1][x+1])/10;  
              }            
    }
    //計(jì)算最后一行
   for(y=LEI_Y-1,x=1;x<LEI_X-1;x++)
   {
      if(LEI_buju[y][x]==LEI)
            {
              BJ[y][x]=LEI;
             }else
             {                              
               BJ[y][x]=(LEI_buju[y][x-1]+LEI_buju[y][x+1]+
              LEI_buju[y-1][x-1]+LEI_buju[y-1][x]+LEI_buju[y-1][x+1])/10;
              }                           
   }
   //計(jì)算最后一列
    for(y=1,x=LEI_X-1;y<LEI_Y-1;y++)
    {
        if(LEI_buju[y][x]==LEI)
            {
              BJ[y][x]=LEI;
             }else  
             {                           
               BJ[y][x]=(LEI_buju[y-1][x-1]+LEI_buju[y-1][x]+
               LEI_buju[y][x-1]+
               LEI_buju[y+1][x-1]+LEI_buju[y+1][x])/10;
             }
     }
    //計(jì)算其余的部分
     for(y=0;y<LEI_Y;y++)
    {
     for(x=0;x<LEI_X;x++)
     {
        if(x>=1&&x<LEI_X-1&&y>=1&&y<LEI_Y-1)  
        {
           if(LEI_buju[y][x]==LEI)
            {
              BJ[y][x]=LEI;
             }else {
                     BJ[y][x]=(LEI_buju[y-1][x-1]+LEI_buju[y-1][x]+LEI_buju[y-1][x+1]+
                     LEI_buju[y][x-1]+LEI_buju[y][x+1]+
                     LEI_buju[y+1][x-1]+LEI_buju[y+1][x]+LEI_buju[y+1][x+1])/10;
                   }                                 
        }              
     }
    }
   
    printf("計(jì)算后的雷區(qū)提示如下:\n");
      for(y=0;y<LEI_Y;y++)
    {
     for(x=0;x<LEI_X;x++)
     {
       if(BJ[y][x]==LEI) printf("Q ");
       if(BJ[y][x]==0) printf("  ");  
       if(BJ[y][x]!=0&&BJ[y][x]!=LEI) printf("%d ",BJ[y][x]);                 
     }
     printf("\n");
    }
    printf("\n\n\n");                     
         
    return 1;
}
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:113095 發(fā)表于 2016-4-9 12:35 | 只看該作者
可以可以,給了我一個(gè)不錯(cuò)的思路!謝謝分享了。!
回復(fù)

使用道具 舉報(bào)

板凳
ID:115845 發(fā)表于 2016-4-22 07:44 | 只看該作者
牛牛牛牛牛
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表