编程实现扫雷游戏
这次主要是用多文件方式编写程序
1、首先建立三个文件,头文件mine.h(主要包括函数的声明以及宏定义),
头文件的格式:
#ifndef _CHESS_H_ #define _CHESS_H_
......
#endif
2、两个.c文件:
(1)、mine.c(函数的定义),主要包含程序所需的所有函数定义和实现。
在埋雷时主要使用随机数埋雷,并且在结束时要显示界面,包括所有雷的位置。
(2)、main.c(主函数,代码的实现,函数调用,显示菜单,大体框架)
扫雷游戏主要注意的的是埋雷的二维数组和显示的二维数组不一样,所以要定义两个二维数组。
对于要求实现展开没有雷位置的周围无雷区域,在函数那块有点缺陷,并没有完整运行出来,所以优化后会再传一次
头文件mine.h
#ifndef _MINE_H_ #define _MINE_H_ #include <stdio.h> #include <string.h> #include <time.h> #include <windows.h> #define ROW 12 //10 + 2 #define COL 12 #define TOTAL 10*10//虽然是12*12,可最后用的只有10*10 #define MINE_NUM 20//埋雷数 #pragma warning(disable:4996) //一共有两个数组,一个埋雷的,一个是显示界面 void SetMine(char mine[][COL], int row, int col); void ShowBoard(char board[][COL], int row, int col); char GetMines(char mine[][COL], int row, int col); void Game(); #endif
mine.c
#include "mine.h" int GetRandIndex(int start, int end)//1-10 { return rand() % (end - start + 1) + start; } void SetMine(char mine[][COL], int row, int col)//埋雷 { srand((unsigned long)time(NULL));//埋雷是随机的,所以要种随机数种子 int count = 0; while (count < MINE_NUM){ int x = GetRandIndex(1, 10); int y = GetRandIndex(1, 10); if (mine[x][y] == '0'){ mine[x][y] = '1'; count++; } } } void ShowBoard(char board[][COL], int row, int col) { printf(" "); int i; for (i = 1; i <= 10; i++){ printf(" - ", i); }//打印表格最上方 printf("\n----"); for (i = 1; i <= 10; i++){ printf("----"); }//打印表格左边 printf("\n"); for (i = 1; i <= 10; i++){ printf(" - |", i); int j; for (j = 1; j <= 10; j++){ printf(" %c |", board[i][j]); } printf("\n"); int k = 1; for (k = 1; k <= 11; k++){ printf("----"); } printf("\n"); } } char GetMines(char mine[][COL], int row, int col) { return mine[row - 1][col - 1] + mine[row - 1][col] + mine[row - 1][col + 1] + mine[row][col - 1] + mine[row][col + 1] + \ mine[row + 1][col - 1] + mine[row + 1][col] + mine[row + 1][col + 1] - 7 * '0'; } void Game() { char mine[ROW][COL]; //埋雷并判断 char board[ROW][COL]; //显示 memset(mine, '0', sizeof(mine)); memset(board, '*', sizeof(board)); SetMine(mine, ROW, COL);//'0'表示没有雷,'1'表示有雷, int count = TOTAL; int x = 0; int y = 0; while (1){ ShowBoard(board, ROW, COL); printf("请选择坐标: "); scanf("%d %d", &x, &y); if (x >= 1 && x <= ROW - 2 && y >= 1 && y <= COL - 2){ if (mine[x][y] == '1'&&count==TOTAL){//保证第一次选的时候不会炸 mine[x][y] = '0'; int x = GetRandIndex(1, 10); int y = GetRandIndex(1, 10); if (mine[x][y] == '0'){ mine[x][y] = '1'; } } if (mine[x][y] == '0'){//当你选的地方没有雷时, char num = GetMines(mine, x, y); board[x][y] = num; count--;//从刚开始的未知数一直减,说明你之前都没有踩到雷 if (count <= 20){//当次数小于等于20时,说明你之前选的所有坐标都是没有雷的 printf("你赢了,厉害!\n"); break; } } else{ printf("不好意思,你被炸死了!\n"); ShowBoard(mine, ROW, COL); break; } } else{ printf("你输入的坐标有误,请重新输入!\n"); } } }
main.c
#include "mine.h" void Menu() { printf("## Welcome to MineSweeper ##\n"); printf("###################################\n"); printf("## 1. Play 2. Exit ##\n"); printf("###################################\n"); printf("Please Select: "); } int main() { int quit = 0; int select = 0; while (!quit){ Menu(); scanf("%d", &select); switch (select) { case 1: Game(); break; case 2: printf("拜拜!\n"); quit = 1; break; default: printf("选择错误,请重新选择!\n"); break; } } system("pause"); return 0; }