"sweep.h" //头文件
#ifndef __SWEEP_H__ #define __SWEEP_H__ #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<time.h> #define ROWS 16 #define COLS 16 #define MINES 20 void menu();//打印菜单 void display_mine(char mine[][COLS+2], int rows, int cols);//打印雷阵 void display_show(char show[ ][COLS+2], int rows, int cols);//打印雷的个数 void set_mines( char mine[][COLS+2]);//布雷 void sweep(char mine[ ][COLS+2],char show[ ][COLS+2]);//扫雷 #endif
"sweep.c" //函数部分
#include"sweep.h" void menu() { printf("*****************************************************************\n"); printf("*********************** 扫雷 ****************************\n"); printf("*********************** 1.play ****************************\n"); printf("*********************** 0.exit ****************************\n"); printf("*****************************************************************\n"); } void display_mine(char mine[ ][COLS+2], int rows, int cols)//打印雷阵 { int i = 0; int j = 0; printf(" "); for(i=1;i<=rows;i++) { printf(" %2d",i); } printf("\n"); for (i = 1; i <=rows; i++)//输出行的标号 { printf("%2d",i); for(j=1;j<=cols;j++) { printf(" %c ",mine[i][j]); } printf("\n"); } } void display_show(char show[ ][COLS+2], int rows, int cols) { int i = 0; int j = 0; printf(" "); for (i =1; i <=rows; i++) { printf("%2d ",i); } printf("\n "); for (i =1; i <=rows; i++) { printf("%2d ",i); for (j =1; j <=cols; j++) { printf(" %c ",show[i][j]); } printf("\n "); } } void set_mines( char mine[][COLS+2] )//布雷 { int count = MINES;//定义雷的个数 srand((unsigned int)time(NULL));//为了每次产生不同的随机数 flag: while (count)//当雷没有布完时,执行循环 { int x = rand()%(ROWS)+1;//产生随机的下标 int y = rand()%(COLS)+1; if(mine[x][y] =='#')//如果这个位置已经布过雷,则重新生成下标 { goto flag; } else { mine[x][y] = '#'; count--;//布一个雷之后雷的个数应该减一 } } } void sweep(char mine[ ][COLS+2],char show[ ][COLS+2])//扫雷 { int i = 0; int j = 0; int x = 0; int y = 0; int x1=0; int y1=0; printf("请输入要第一次排雷的位置>"); scanf("%d %d",&x1, &y1); if (mine[x1][y1] == '#')//如果第一次点击的就是雷的位置,则应该把这个雷移走 { for (i=0; i<x1; i++) { for (j = 0; j<y1-1; j++) { if (mine[i][j] != '#') { mine[i][j] = mine[x1][y1] ; mine[x1][y1]=' '; } } } } else { //如果点击的位置不是雷,则应该统计雷的个数 show[x1][y1] = ((mine[x-1][y-1] == '#') + (mine[x1-1][y1] == '#') + (mine[x1-1][y1+1] == '#') + (mine[x1][y1-1] == '#') + (mine[x1][y1+1] == '#') + (mine[x1+1][y1-1] == '#') + (mine[x1+1][y] == '#') + (mine[x1+1][y1+1] == '#'))+ '0'; if(show[x1][y1]=='0') { for(x=x1-1;x<=x1+1;x++) for(y=y1-1;y<=y1+1;y++) { show[x][y]=((mine[x-1][y-1] == '#') + (mine[x-1][y] == '#') + (mine[x-1][y+1] == '#') + (mine[x][y-1] == '#') + (mine[x][y+1] == '#') + (mine[x+1][y-1] == '#') + (mine[x+1][y] == '#') + (mine[x+1][y+1] == '#'))+ '0';; } } } display_show(show, ROWS, COLS); //打印出雷阵 while(1) { printf("请输入要排的位置 :>"); scanf("%d%d",&x1,&y1); if(mine[x1][y1] == '#') { printf("炸死了\n"); break; } else //如果点击的位置不是雷,则应该统计雷的个数 { show[x1][y1] = ((mine[x1-1][y1-1] == '#') + (mine[x1-1][y1] == '#') + (mine[x1-1][y1+1] == '#') + (mine[x1][y1-1] == '#') + (mine[x1][y1+1] == '#') + (mine[x1+1][y1-1] == '#') + (mine[x1+1][y] == '#') + (mine[x1+1][y1+1] == '#'))+ '0'; if(show[x1][y1]=='0') { for(x=x1-1;x<=x1+1;x++) for(y=y1-1;y<=y1+1;y++) { show[x][y]=((mine[x-1][y-1] == '#') + (mine[x-1][y] == '#') + (mine[x-1][y+1] == '#') + (mine[x][y-1] == '#') + (mine[x][y+1] == '#') + (mine[x+1][y-1] == '#') + (mine[x+1][y] == '#') + (mine[x+1][y+1] == '#'))+ '0';; } } } display_show(show, ROWS, COLS);//打印显示雷的个数的数组 } }
"text.c" //测试部分
#include"sweep.h" void game() { int x = 0; int y = 0; char mine[ROWS + 2][ COLS +2]={0}; char show[ROWS + 2][COLS + 2]={0}; memset( mine,'0', sizeof(char)*(ROWS+2)*(COLS+2)); memset( show,'*', sizeof(char)*(ROWS+2)*(COLS+2)); set_mines(mine); //display_mine(mine, ROWS, COLS); display_show(show, ROWS, COLS); sweep(mine,show); } int main() { int input = 0; do { menu(); printf("请输入要选择的数字:"); scanf("%d",&input); switch (input) { case 0: exit(1); case 1: game(); } }while(input); system("pause"); return 0; }
扫雷2(可以同时排出多位没有雷的位置)
最新推荐文章于 2022-11-24 13:01:15 发布