Minesweeper.c
#include <stdio.h> #include "Game.h" #include <time.h> #include <stdlib.h> void Game (void); void PrintMenu (void); //打印菜单 int main (void) { setbuf(stdout, NULL); int Input = 1; while (Input) { PrintMenu(); printf("请选择:"); scanf("%d", &Input); switch (Input) { case 1: //printf("进入游戏。\n"); Game(); break; case 0: printf("游戏已退出。\n"); break; default: printf("输入错误,请重新输入!\n"); break; } } return 0; } void PrintMenu (void) { printf("-----------------\n"); printf("----1.开始游戏----\n"); printf("----0.退出游戏----\n"); printf("-----------------\n"); } void Game (void) { srand((unsigned) time(NULL)); //种子 //通过x和y两个变量的值来控制下棋子的位置 int x = 0; int y = 0; unsigned char Flag = 0; Init_Game(); PrintCheckerboard(); printf("请输入扫雷的坐标>"); scanf("%d %d", &x, &y); RefreshMines(x, y); Flag = Decide(&x, &y); PrintCheckerboard(); while(Flag == 1) { printf("请输入扫雷的坐标>"); scanf("%d %d", &x, &y); Flag = Decide(&x, &y); PrintCheckerboard(); } //Print(); //查看生成雷的情况 }
Game.h
// // Created by CIWU on 2024/3/28. // #ifndef MINESWEEPER__GAME_H_ #define MINESWEEPER__GAME_H_ #define ROW 14 //雷盘行 #define COL 14 //雷盘列 #define MinesNumber 10 void Init_Game (void); //初始化 void PrintCheckerboard (void); //打印棋盘 void RefreshMines (int x, int y); //在第一次扫雷后生成雷 unsigned char Decide (const int* x, const int* y); //在每次操作后进行判定 void Lose (void); //失败结算 void Unfold (const int* x, const int* y); //在该坐标位置进行展开 unsigned char CountMines (const int* x, const int* y); //统计坐标周围雷的个数 unsigned char Victory(void); //胜利判定 void Print (void); //用于查看生成雷的情况 #endif //MINESWEEPER__GAME_H_
game.c
// // Created by CIWU on 2024/3/28. // #include <stdlib.h> #include "stdio.h" #include "Game.h" unsigned char Array_Checkerboard[ROW - 2][COL - 2] = { 0 }; //棋盘,相比雷盘少了两行两列 unsigned char Array_Mines[ROW][COL] = { 0 }; void Init_Game (void) { unsigned char i = 0; unsigned char j = 0; for (i = 0; i <= (ROW - 3); ++i) { for (j = 0; j <= (COL - 3); ++j) { Array_Checkerboard[i][j] = '*'; //字符'*'代表未扫描区域 } } for (i = 0; i <= (ROW - 1); ++i) { for (j = 0; j <= (COL - 1); ++j) { Array_Mines[i][j] = '0'; //字符'0'代表非雷 } } } void PrintCheckerboard (void) { int i = 0, j = 0; //打印棋盘列标 printf(" "); //打印四个空格 for (j = 1; j <= (COL - 2); ++j) { printf(" %2d ", j); } printf("\n"); for (i = 1; i <= (ROW - 2); ++i) { //打印边界 printf(" "); //打印四个空格 for (j = 1; j <= (COL - 2); ++j) { printf("+-----"); } printf("+\n"); printf(" %2d ", i); //打印棋盘行标 for (j = 1; j <= (COL - 2); ++j) { printf("| %c ", Array_Checkerboard[i - 1][j - 1]); //打印棋盘边界和内容 } printf("|\n"); //打印棋盘边界 } //打印棋盘边界 printf(" "); //打印三个空格 for (j = 1; j <= (COL - 2); ++j) { printf("+-----"); } printf("+\n"); } void RefreshMines (int x, int y) { int Count = 0; int i = 0, j = 0; while (Count <= (MinesNumber - 1)) { //生成随机数 i = rand() % (ROW - 2) + 1; j = rand() % (COL - 2) + 1; if (((i != x) || (j != y)) && (Array_Mines[i][j] != '1')) //埋雷的地方不能是输入的坐标也不能是雷 { Array_Mines[i][j] = '1'; //埋雷 ++Count; //每埋一次雷,计数加1 } } } unsigned char Decide (const int* x, const int* y) { if (Array_Mines[*x][*y] == '1') //踩到雷了 { Lose(); PrintCheckerboard(); printf("\n---你寄了!---\n"); return 2; } else if (Array_Mines[*x][*y] == '0') //没有踩到雷 { Unfold(x, y); return Victory(); } } void Lose (void) { unsigned char i = 0; unsigned char j = 0; //在棋盘上显现雷的位置 for (i = 0; i <= (ROW - 3); ++i) { for (j = 0; j <= (COL - 3); ++j) { if (Array_Mines[i + 1][j + 1] == '1') { Array_Checkerboard[i][j] = Array_Mines[i + 1][j + 1]; } } } } void Unfold (const int* x, const int* y) { //对该坐标周围的雷进行统计 unsigned char Count = CountMines(x, y); if (Count != 0) //如果有雷,在该坐标处标明共有多少颗雷 { Array_Checkerboard[(*x) - 1][(*y) - 1] = Count + 48; //返回的数值加48才是0~9的字符 } else //如果没有雷,继续展开 { Array_Checkerboard[(*x) - 1][(*y) - 1] = ' '; int i = 0; int j = 0; for (i = ((*x) - 1); i <= ((*x) + 1); ++i) { for (j = ((*y) - 1); j <= ((*y) + 1); ++j) { if ((i >= 1) && (i <= (ROW - 2)) && (j >= 1) && (j <= (COL - 2)) && (Array_Checkerboard[i - 1][j - 1] == '*')) //越界判断且该坐标的情况尚未探明 { Unfold(&i, &j); } } } } } unsigned char CountMines (const int* x, const int* y) { unsigned char i = 0; unsigned char j = 0; unsigned char Count = 0; for (i = ((*x) - 1); i <= ((*x) + 1); ++i) { for (j = ((*y) - 1); j <= ((*y) + 1); ++j) { if (Array_Mines[i][j] == '1') { ++Count; } } } return Count; } unsigned char Victory (void) { unsigned char Flag = 0; unsigned char i = 0; unsigned char j = 0; for (i = 0; i <= (ROW - 3); ++i) { for (j = 0; j <= (COL - 3); ++j) { if ((Array_Checkerboard[i][j] == '*') && (Array_Mines[i + 1][j + 1] == '0')) { Flag = 1; //1代表尚未胜利 } } } if (Flag == 0) //胜利 { printf("---你胜利了!---\n"); } return Flag; } void Print (void) { unsigned char i = 0; unsigned char j = 0; for (i = 0; i < (ROW - 1); ++i) { for (j = 0; j < (COL - 1); ++j) { printf("%c ", Array_Mines[i][j]); } printf("\n"); } }