找回密码
 立即注册

QQ登录

只需一步,快速开始

帖子
查看: 9572|回复: 2
收起左侧

扫雷游戏雷阵及提示生成方法(加个界面就能做扫雷游戏了)

[复制链接]
ID:72008 发表于 2015-1-11 20:04 | 显示全部楼层 |阅读模式






#include <stdio.h>
#include <stdlib.h>
#include<time.h>/*用到了time函数,所以要有这个头文件*/ #define LEI 10           //地雷标记
#define LEI_X 15        //雷区列数
#define LEI_Y 15          //雷区行数
int LEI_buju[LEI_Y][LEI_X];   //雷区地图用二维数组表示
int LEI_buju_init(void); //雷区地图初始化函数
int LEI_buju_print(void); //雷区状态输出到屏幕(调试用,做扫雷游戏时用自己的UI线程代替)
int LEI_buju_bulei(void); //布雷函数(随机的把LEI_X*LEI_Y/10个雷步到雷区中)
int LEI_buju_tishi(void);  //计算地雷提示

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

////////////////////////////////////////////////////////////////////////////////
int LEI_buju_init(void)
{
    //初始化雷区数组
    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)
{
    //向屏幕输出雷区状态
    int x,y;
    printf("%dx%d雷区布雷情况如下(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去掉安全区域后的雷区布局如下:\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)
{
    //向雷区中随机布雷
    int x,y,L,l;
    L=LEI_Y*LEI_X/10; //雷区中地雷总数
    srand((unsigned)time(NULL));//调用该方法产生随机数的种子
    for(l=0;l<L;)
    {
    y=rand()%LEI_Y; //随机产生地雷所在的行系数
    x=rand()%LEI_X; //随机产生地雷所在的列系数
    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)
{
    //计算地雷位置提示,数据保存在雷区布局数组中
    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;                 
     }
    }
    //计算四个角
     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;
   //计算第一行
   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;
             }                     
    }
    //计算第一列
    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;  
              }            
    }
    //计算最后一行
   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;
              }                           
   }
   //计算最后一列
    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;
             }
     }
    //计算其余的部分
     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("计算后的雷区提示如下:\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;
}
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   

回复

举报

ID:113095 发表于 2016-4-9 12:35 | 显示全部楼层
可以可以,给了我一个不错的思路!谢谢分享了!!!
回复

举报

ID:115845 发表于 2016-4-22 07:44 | 显示全部楼层
牛牛牛牛牛
回复

举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表