C语言_扫雷

来源:互联网 发布:淘宝店卖什么好呢 编辑:程序博客网 时间:2024/06/08 09:15

做一个扫雷的游戏,首先分析一下扫雷需要实现的功能:

     1.选择一个位置,如果该位置是雷则结束游戏,并显示所有雷的位置。如果不是雷则显示该位置周围雷的数量。

     2.如果周围没有雷,则该位置显示空,并且周围如果也为空则一并展开。

     3.第一次选择时必定不是雷

     4.当盘上剩余的位置只有雷了,则游戏也结束,并且玩家胜利。


然后可以用两个二维数组,一个数组保存雷的排布,一个数组显示游戏界面,假设是10*10的界面的话,数组大小应该为12*12,周围一圈全为0,以便雷布在边界时,周围的数字更好的计算。

头文件部分:

#ifndef _GAME_H_#define _GAME_H_#include <stdio.h>#include <time.h>#include <stdlib.h>#define ROW 11#define COL 11#define ROWS ROW+1#define COLS COL+1#define EASY 10int game();                                 //游戏实现void fill_mine(char arr[ROWS][COLS]);       //随机布雷void show_mine(char show[ROWS][COLS]);      //展示该数组void clean_show(char show[ROWS][COLS]);     //初始化该数组void IS_mine(char arr[ROWS][COLS], char show[ROWS][COLS], int x, int y);   //判断该位置周围雷的个数,没有雷则展开void copy(char arr[ROWS][COLS], char show[ROWS][COLS]);         //将雷的位置显示在显示数组里#endif //game.h


主菜单部分:

#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include "game.h"void meau(){printf("****************************************\n");printf("********1.开始扫雷    0.退出扫雷********\n");printf("****************************************\n");printf("请选择:");}int main(){int a=1;while (a){meau();scanf("%d", &a);if (a != 1 && a !=0){printf("输入错误,请重新输入\n");}else if (1 == a){game();}}printf("谢谢使用!\n");return 0;}




游戏功能实现部分:

int game(){char arr[ROWS][COLS];char show[ROWS][COLS];int x, y;int cout = 0;clean_show(arr);fill_mine(arr);clean_show(show);show_mine(show);for (;;){cout++;printf("请输入坐标:x,y>");scanf("%d%d", &x, &y);if (x<1 || x>10 || y<1 || y>10){printf("输入不合法!\n");}else if ('*' == arr[x][y]){if (1 == cout){clean_show(arr);fill_mine(arr);IS_mine(arr, show, x, y);show_mine(show);}else{printf("你被炸死了!\n");copy(arr, show);show_mine(show);break;}}else{IS_mine(arr,show, x, y);show_mine(show);if (win(show)){printf("你赢了\n");show_mine(arr);break;}}}return 0;}


各函数定义:

#define _CRT_SECURE_NO_WARNINGS#include "game.h"void fill_mine(char arr[ROWS][COLS])     //随机布雷{int i, j;int ret = 0;srand((unsigned int)time(NULL));do{i = rand() % 10;j = rand() % 10;if (arr[i+1][j+1] != '*')           //最外一圈不布雷{arr[i+1][j+1] = '*';ret++;}} while (ret <= EASY);}void show_mine(char show[ROWS][COLS]){int i, j;for (i = 0; i < ROW; i++){for (j = 0; j < COL; j++){if (0 == i){printf("%2d ", j);}else if (0 == j){printf("%2d ", i);}else{printf("%2c ", show[i][j]);}}printf("\n");}}void clean_show(char show[ROWS][COLS]){int i, j;for (i = 0; i < ROWS; i++){for (j = 0; j < COLS; j++){show[i][j] = '0';}}}void copy(char arr[ROWS][COLS], char show[ROWS][COLS]){int i, j;for (i = 1; i < ROW; i++){for (j = 1; j < COL; j++){if ('*' == arr[i][j]){show[i][j] = arr[i][j];}}}}void IS_mine(char arr[ROWS][COLS], char show[ROWS][COLS], int x, int y){int cout;cout = 0;if ((x >= 1 && x <= 10 && y >= 1 && y <= 10) && '0' == show[x][y]){cout = ('*' == arr[x - 1][y + 1]) + ('*' == arr[x][y + 1]) + ('*' == arr[x + 1][y + 1])+ ('*' == arr[x - 1][y]) + ('*' == arr[x + 1][y])+ ('*' == arr[x - 1][y - 1]) + ('*' == arr[x][y - 1]) + ('*' == arr[x + 1][y - 1]);if (cout != 0){show[x][y] = cout + '0';}else{show[x][y] = ' ';if (y > 0 && show[x][y - 1] == '0'){IS_mine(arr, show, x, y - 1);}if (x > 0 && show[x - 1][y] == '0'){IS_mine(arr, show, x - 1, y);}if (y < COL && show[x][y + 1] == '0'){IS_mine(arr, show, x, y + 1);}if (x < ROW && show[x + 1][y] == '0'){IS_mine(arr, show, x + 1, y);}}}}int win(char show[ROWS][COLS]){int i, j;int cout = 0;for (i = 1; i < ROW; i++){for (j = 1; j < COL; j++){if ('0' == show[i][j]){cout++;}}}if (10 == cout){return 1;}else return 0;}

运行结果:




原创粉丝点击