扫雷增强版

来源:互联网 发布:形势与政策论文 网络 编辑:程序博客网 时间:2024/04/30 03:52

 之前写过一个普通版的扫雷,最近编写了一个增强版主要又包括了以下两个新功能:

1. 为了保证游戏体验第一次扫雷不被炸死,如果踩到雷上,那颗雷更换位置

2. 扫雷的时候如果选中位置周围没有雷将选中位置进行扩展


#ifndef _GAME_H_#define _GAME_H_#include<stdio.h>#include<stdlib.h>#include<string.h>#include<time.h>#define ROW 9#define COL 9#define ROWS ROW+2#define COLS COL+2#define COUNT 10void Setmine(char arr[ROWS][COLS], int  row, int col);void Inintmeun(char arr[ROWS][COLS], int row, int col, char set);void Output(char arr[ROWS][COLS], int row, int col);int  Clean(char arr[ROWS][COLS], char arr1[ROWS][COLS], int row, int col);int num(char arr[ROWS][COLS], int x, int y);void  Extend(char arr[ROWS][COLS], char arr1[ROWS][COLS], int x, int y);#endif 
#define _CRT_SECURE_NO_WARNINGS 1#include"game.h"void menu(){printf("*****************************\n");printf("**1.play game      0.exit  **\n");printf("*****************************\n");printf("**    请通过键盘进行选择   **\n");}int main(){int n = 0;menu();scanf("%d", &n);int i = 0;char menu[ROWS][COLS];char  game[ROWS][COLS];char set1 = '*';char set2 = '0';printf("   ");for (i = 1; i <= ROW; i++){printf(" %d ", i);}printf("\n");while (n){Inintmeun(menu, ROWS, COLS,set1);Inintmeun(game, ROWS, COLS, set2);Output(menu, ROW, COL);Output(game,ROW, COL);Setmine(game, ROW, COL);Output(game, ROW, COL);Clean(game,menu, ROWS, COLS);Output(menu, ROW, COL);n = 0;}system("pause");}

#define _CRT_SECURE_NO_WARNINGS 1#include"game.h"void Inintmeun(char arr[ROWS][COLS], int row, int col, char set){memset(arr, set, row*col*sizeof(set));}void Output(char arr[ROWS][COLS], int row, int col){int x = 1;int y = 1;printf("   ");int n = 1;for (n = 1; n <=9; n++){printf(" %d ", n);}printf("\n");for (x = 1; x <= row; x++){printf(" %d ", x);for (y = 1; y <= col; y++){printf(" %c ", arr[x][y]);}printf(" %d", x);printf("\n");}printf("\n");}void Setmine(char arr[ROWS][COLS], int row, int col){int x = 0;int y = 0;int count = 0;srand((unsigned)time(NULL));while (count < COUNT){x = rand() % row + 1;y = rand() % col+ 1;if (arr[x][y] =='0'){arr[x][y] = '1';count++;}}}int num(char arr[ROWS][COLS],  int x ,int y){int count = 0;if (arr[x + 1][y] == '1')count++;if (arr[x -1][y] =='1')count++;if (arr[x + 1][y+1] == '1')count++;if (arr[x + 1][y-1] == '1')count++;if (arr[x -1][y+1] == '1')count++;if (arr[x - 1][y-1] == '1')count++;if (arr[x][y-1] == '1')count++;if (arr[x][y+1] == '1')count++;return count;}int  Clean(char arr[ROWS][COLS],char arr1[ROWS][COLS], int row, int col){int x = 0;int y = 0;int count = 0;int sum = 0;printf("请输入想要清除的坐标");scanf("%d", &x);scanf("%d", &y);while(((x >= 1) &&( x <= 9)) && ((y >= 1) && (y <= 9))){if (arr[x][y] == '1'){if (sum == 0){arr[x][y] = '0';int m = 0;int n = 0;int count1 = 0;srand((unsigned)time(NULL));while (count <1){m = rand() % row + 1;n = rand() % col + 1;if (arr[m][n] == '0'){arr[m][n] = '1';count++;}}sum++;count = num(arr, x, y);arr1[x][y] = count + '0';Extend(arr, arr1, x, y);Output(arr1, ROW, COL);}else{arr1[x][y] = '1';Output(arr1, ROW, COL);printf("被炸死了\n");return 0;}}else{sum++;count = num(arr, x, y);arr1[x][y] = ' ';Extend(arr, arr1, x, y);Output(arr1, ROW, COL);if (sum == ROW*COL - COUNT){printf("扫雷成功\n");return 0;}printf("请输入想要清除的坐标");scanf("%d", &x);scanf("%d", &y);}}printf("坐标不合法\n");return 0;}void  Extend(char arr[ROWS][COLS], char arr1[ROWS][COLS], int x, int y){int i = -1;int j = -1;for (i = -1; i < 2; i++) //边界{for (j = -1; j < 2; j++){if (i != 0 || j != 0) // 避免排到自己注意此处的逻辑关系{if (x + i >= 1 && x + i <= ROW && y + j >= 1 && y + j <= COL) //x y坐标是否合法{if (arr1[x + i][y + j] == '*'&&arr[x + i][y + j] != '1'){int count = num(arr, x + i, y + j);if (count != 0){arr1[x + i][y + j] = count + '0';}else{arr1[x + i][y + j] = ' ';Extend(arr,arr1, x + i, y + j);}}}}}}}//void  Extend(char arr[ROWS][COLS], char arr1[ROWS][COLS], int x, int y)//{//int n = 0;//if ((x<1) || (y<1) || (x>9) || (y>9))//return;//n = num(arr, x , y);//if (n == 0)//{////if (arr[x - 1][y] == '0')//{//if (arr1[x - 1][y] != ' ')//{////arr1[x - 1][y] = ' ';////}//////Extend(arr, arr1, x - 1, y);//}//if (arr[x + 1][y] == '0')//{//if (arr1[x + 1][y] != ' ')//{////arr1[x + 1][y] = ' ';////}//////Extend(arr, arr1, x + 1, y);//}//if (arr[x][y + 1] == '0')//{//if (arr1[x][y + 1] != ' ')//{////arr1[x][y + 1] = ' ';////}////Extend(arr, arr1, x, y + 1);//}//if (arr[x - 1][y + 1] == '0')//{//if (arr1[x - 1][y + 1] != ' ')//{////arr1[x - 1][y + 1] = ' ';////}////Extend(arr, arr1, x - 1, y + 1);//}//if (arr[x + 1][y + 1] == '0')//{//if (arr1[x + 1][y + 1] != ' ')//{////arr1[x + 1][y + 1] = ' ';////}////Extend(arr, arr1, x + 1, y + 1);//}//if (arr[x][y - 1] == '0')//{//if (arr1[x][y - 1] != ' ')//{////arr1[x][y - 1] = ' ';////}////Extend(arr, arr1, x, y - 1);//}//if (arr[x + 1][y - 1] == '0')//{//if (arr1[x + 1][y - 1] != ' ')//{////arr1[x + 1][y - 1] = ' ';////}////Extend(arr, arr1, x + 1, y - 1);//}//if (arr[x - 1][y - 1] == '0')//{//if (arr1[x - 1][y + 1] != ' ')//{////arr1[x - 1][y + 1] = ' ';////}////Extend(arr, arr1, x - 1, y - 1);//}//}//else//arr1[x][y] = n + '0';//}//void  Extend(char arr[ROWS][COLS], char arr1[ROWS][COLS], int x, int y)//{//int a = 0;//int b = 0;//int n = 0;//a = x-1;//b = y;//while (!((a<1) || (b<1) || (a>9) || (b>9)))//{//////n = num(arr, a , b);//if (n == 0)//{////if (arr1[a ][b] != ' ')//{//arr1[a][b] = ' ';//}//else//break;//}//else//{////arr1[a ][b] = n + '0';//Extend(arr, arr1, a, b);//break;//}//a = a - 1;//}//a = x+1;//b = y;//while (!((a<1) || (b<1) || (a>9) || (b>9)))//{//n = num(arr, a, b);//if (n == 0)//{////if (arr1[a][b] != ' ')//{//arr1[a][b] = ' ';//}//else//break;//}//else//{////arr1[a][b] = n + '0';//Extend(arr, arr1, a, b);//break;//}//a = a + 1;//}//a = x;//b = y+1;//while (!((a<1) || (b<1) || (a>9) || (b>9)))//{//n = num(arr, a, b);//if (n == 0)//{////if (arr1[a][b] != ' ')//{//arr1[a][b] = ' ';//}//else//break;//}//else//{////arr1[a][b] = n + '0';//Extend(arr, arr1, a, b);//break;//}//b = b + 1;//}//a = x-1;//b = y+1;//while (!((a<1) || (b<1) || (a>9) || (b>9)))//{//n = num(arr, a, b);//if (n == 0)//{////if (arr1[a][b] != ' ')//{//arr1[a][b] = ' ';//}//else//break;//}//else//{////arr1[a][b] = n + '0';//Extend(arr, arr1, a, b);//break;//}//a = a - 1;//b = b + 1;//}//a = x+1;//b = y+1;//while (!((a<1) || (b<1) || (a>9) || (b>9)))//{//n = num(arr, a, b);//if (n == 0)//{////if (arr1[a][b] != ' ')//{//arr1[a][b] = ' ';//}//else//break;//}//else//{////arr1[a][b] = n + '0';//Extend(arr, arr1, a, b);//break;//}//a = a + 1;//b = b + 1;//}//a = x;//b = y-1;//while (!((a<1) || (b<1) || (a>9) || (b>9)))//{//n = num(arr, a, b);//if (n == 0)//{////if (arr1[a][b] != ' ')//{//arr1[a][b] = ' ';//}//else//break;//}//else//{////arr1[a][b] = n + '0';//Extend(arr, arr1, a, b);//break;//}//b = b - 1;//}//a = x-1;//b = y-1;//while (!((a<1) || (b<1) || (a>9) || (b>9)))//{//n = num(arr, a, b);//if (n == 0)//{////if (arr1[a][b] != ' ')//{//arr1[a][b] = ' ';//}//else//break;//}//else//{////arr1[a][b] = n + '0';//Extend(arr, arr1, a, b);//break;//}//a = a - 1;//b = b - 1;//}//a = x+1;//b = y-1;//while (!((a<1) || (b<1) || (a>9) || (b>9)))//{//n = num(arr, a, b);//if (n == 0)//{////if (arr1[a][b] != ' ')//{//arr1[a][b] = ' ';//}//else//break;//}//else//{////arr1[a][b] = n + '0';//Extend(arr, arr1, a, b);//break;//}//a = a +1;//b = b - 1;//}////}

这里最后几个是我最初使用的函数,一直提示Stack Overflow,我在这里依然留下来,让大家看一下两者的区别,如果以后遇到问题的时候更改函数能有一个方向

 

最后附上一张程序运行图