首页 > 其他分享 >扫雷

扫雷

时间:2022-11-05 16:32:35浏览次数:46  
标签:show int mine COLS 扫雷 坐标 printf

这周经过我艰辛的奋斗,完成了个扫雷的小代码,创建了两个棋盘,一个是放置雷(0/1),另一个棋盘存储信息,存储我输入坐标进行游戏扫雷存放的信息,同时每扫一个坐标会将坐标周围的8个位置是否有雷反馈到坐标上。当周围没有雷时,使用了递归函数,将周围8个坐标的周围8个坐标进行计算,反馈给他们有没有雷。本程序屏蔽了8段代码,那8段代码代表右边四个方位不会进行自动计算排除反馈,因为加上去有错误,还未解决。


#include<stdio.h>

#include<stdlib.h>

#include<time.h>

#define ROW 9//棋盘行

#define COL 9//棋盘列

#define ROWS ROW+2

#define COLS COL+2

#define s_count 10//布置雷的个数

void meau()

{

printf("************************\n");

printf("****1.plaay  0.exit ****\n");

printf("************************\n");

}

void InitBoard(char board[ROWS][COLS],int rows,int cols,char set)

{

int i=0;

int j=0;

for(i=0;i<rows;i++)

{

 for(j=0;j<cols;j++)

 {

  board[i][j]=set;//初始化棋盘每个信息设置为'0'/'*'

 }

}

}

void playboard(char board[ROWS][COLS],int row,int col)

{

int i=0;

int j=0;

for(i=0;i<=col;i++)

{

 printf("%d ",i);//打印出第一行坐标位置信息

}

printf("\n");

for(i=1;i<=row;i++)

{

 printf("%d ",i);//打印出第一列坐标位置信息

 for(j=1;j<=col;j++)

 {

  printf("%c ",board[i][j]);//打印每列棋盘信息

 }

 printf("\n");

}

}

void setray(char board[ROWS][COLS],int row,int col)

{

int count=s_count;

while(count)

{

 int a=rand()%row+1;//生成随机数a

     int b=rand()%col+1;//生成随机数b

 if(board[a][b]=='0')

 {

  board[a][b]='1';//布置雷'1'

  count--;

 }

}

}

int showboard(char mine[ROWS][COLS],int x,int y)

{

//'0'的ASCII值为48,'1'为49.所以周围8个的值减去8*'0'得到周围坐标的整数值

//将得到的值返回给x,y坐标

 return mine[x-1][y]+

 mine[x-1][y-1]+

 mine[x][y-1]+

 mine[x+1][y-1]+

 mine[x+1][y]+

 mine[x+1][y+1]+

 mine[x][y+1]+

 mine[x-1][y+1]-8*'0';

}

void getboard(char mine[ROWS][COLS],char show[ROWS][COLS],int x,int y)

{

//如果x,y坐标的值为'0',将x,y周围8个坐标各自的周围8个坐标的值计算出来放在各自的坐标里

int count1=showboard(mine,x-1,y);

int count2=showboard(mine,x-1,y-1);

int count3=showboard(mine,x,y-1);

int count4=showboard(mine,x+1,y-1);

int count5=showboard(mine,x+1,y);

int count6=showboard(mine,x+1,y+1);

int count7=showboard(mine,x,y+1);

int count8=showboard(mine,x-1,y+1);

show[x-1][y]=count1+'0';

if(show[x-1][y]=='0' && x-1>0 )//如过周围八个坐标的各自的坐标有的值为0

 getboard(mine,show,x-1,y);//则继续调用此函数

show[x-1][y-1]=count2+'0';

if(show[x-1][y-1]=='0' && x-1>0 && y-1>0)

 getboard(mine,show,x-1,y-1);

show[x][y-1]=count3+'0';

if(show[x][y-1]=='0' && y-1>0)

 getboard(mine,show,x,y-1);

show[x+1][y-1]=count4+'0';

if(show[x+1][y-1]=='0' && x+1<ROW-1 && y-1>0)

 getboard(mine,show,x+1,y-1);

show[x+1][y]=count5+'0';

//if(show[x+1][y]=='0' && x+1<ROW)

 //getboard(mine,show,x+1,y);

show[x+1][y+1]=count6+'0';

//if(show[x+1][y+1]=='0' && x+1<ROW && y+1<COL)

 //getboard(mine,show,x+1,y+1);

show[x][y+1]=count7+'0';

   //if(show[x][y+1]=='0' && y<COL)

 //getboard(mine,show,x,y+1);

show[x-1][y+1]=count8+'0';

//if(show[x-1][y+1]=='0' && x-1>1 && y+1<COL)

 //getboard(mine,show,x-1,y+1);

}

void sweepboard(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col)

{

int x=0;

int y=0;

int z=0;

int i=0;

int j=0;

int c=0;

while(z<ROW*COL-s_count)//当z小于棋盘总数减去雷的数量

{

 printf("请开始输入坐标\n");

 scanf("%d%d",&x,&y);

 if(x>=1 && x<=row && y>=1 && y<=col)

 {

  if(mine[x][y]=='1')//当排雷排到'1'时,游戏失败

  {

   printf("恭喜你壮烈牺牲,你被雷炸死了,END\n");

   playboard(mine,ROW,COL);

   break;

  }

  else

  {

   int count=showboard(mine,x,y);//将x,y坐标附近的8个坐标里的字符相加的值放在x,y坐标里

   show[x][y]=count+'0';//将x,y坐标的数值加'0'等于'x,y坐标值'

   if(show[x][y]=='0')//如果x,y坐标的值为'0'

   {

    getboard(mine,show,x,y);

   }

   playboard(show,ROW,COL);

   for(i=1;i<=row;i++)

   {

            for(j=1;j<=col;j++)

      {

            if(show[i][j]!='*')

       c++;

      }

   }

   z=c;

   c=0;

   if(ROW*COL-s_count==z)

    printf("恭喜你,排雷成功");

  }

 }

 else

  printf("输入错误,请重新输入\n");

}

}

void game()

{

char mine[ROWS][COLS]={0};

char show[ROWS][COLS]={0};

InitBoard(mine,ROWS,COLS, '0');//初始化棋盘设置为'0'

InitBoard(show,ROWS,COLS, '*');//初始化棋盘设置为'*'

//playboard(mine,ROW,COL);//打印初始化棋盘

playboard(show,ROW,COL);//打印下载的棋盘

setray(mine,ROW,COL);//布置雷

playboard(mine,ROW,COL);//打印布置好雷的棋盘

sweepboard(mine,show,ROW,COL);//开始扫雷

}

int main()

{

int input=0;

srand((unsigned int)time(NULL));//根据时间随机生成一个随机数

meau();//游戏界面

do//开始游戏前先循环一次

{

 printf("开始游戏>:(1/0)");//游戏进入选择

 scanf("%d",&input);//输入选择

 switch(input)

 {

   case 1:

    game();

    break;

   case 0:

    printf("退出\n");

    break;

   default:

    printf("输入错误,请重试");

 }

}

while(input);

return 0;

}

标签:show,int,mine,COLS,扫雷,坐标,printf
From: https://blog.51cto.com/u_15801101/5826009

相关文章

  • PyGame做了一个扫雷
     1#这是一个示例Python脚本。23#按⌃R执行或将其替换为您的代码。4#按双击⇧在所有地方搜索类、文件、工具窗口、操作和设置。5importsy......
  • ABAP游戏:扫雷
    效果:代码*&---------------------------------------------------------------------**&ReportZLM_GAME2*&-----------------------------------------------------------......
  • 扫雷游戏---手把手教程(含源码)【C语言】
    ......
  • docker搭建扫雷小游戏
    下载HTML文件包链接:https://pan.baidu.com/s/1AFfkQMKBjAspgGNldRmHXQ提取码:9adg复制这段内容后打开百度网盘手机App,操作更方便哦下载httpd镜像[root@docker~]#......