用C语言实现扫雷

完成了扫雷代码之后,我才发现原来一个那么小的游戏实现起来也是十分的不容易,加上一些优化,和等等之类的,都不知道要多少行代码了,对于刚学C语言不久的我来说,这个代码的实现花费掉我不少的时间,为了理解和完成它,我大概花了两个半小时左右。完成这个代码用到了一个.h和两个.c文件,一直以来我都是只用一个文件写代码,现在第一次上手多文件实现觉得并不算难,还挺好上手的,多文件确实有很多便利之处。以下是我的扫雷代码:

扫雷代码乍一看上去有点复杂,但是拆分成一个个模块去实现就相对变得简单很多了。

大体分为四个部分:

1.初始化数组

2.打印棋盘

3.布置雷

4.排查雷

根据每个部分的具体要求进行具体的实现。

当然我们要先设置玩一个游戏最基本的东西。那我们就用test()来实现吧,游戏要用目录吧,设立一个menu函数来实现它,分为1.开始游戏和0.结束游戏两个部分,然后就用switch()函数来对你选择的选择地选项进行对应的输出,如果你选择了1,那么就开始游戏,用game()来实现游戏。

对于扫雷来说,判段有雷还是没有雷,我们可以用字符'1'或者'0'来进行判断,'1'则表示有雷,'0'则表示没有雷,如果排查到没有雷,那么就判断周围一圈有多少个雷,有多少个雷就输出多少个数字,已知我们是要用用数组来给空间存放,一个数组同时进行三个条件的实现未免有些繁杂,实现起来也会相对困难,那我们就用两个数组分别实现各个功能,mine数组用来存放雷的信息,而show数组就用来存放排查出雷的信息,但是两个数组都必须是字符数组,mine是字符型而show是整型的话,两个数组的关联就会变得很复杂,为了统一,省去不必要的麻烦,那么就设立两个字符数组吧。

第一部分:
(InitBoard)初始化两个数组,mine就用'0'来初始化,表示全部都没有雷,show就用'*'来初始化,相当于整个棋盘都可能是雷,赋予它危险的神秘感。对于数组的行和列,我们就分别用ROWS和COLS来表示,在game.h用difine来定义两个个常量,到时候如果你想加深游戏难度,那你可以随时修改,我就用9*9来实现。但是对于判断周围一圈有多少个雷的时候,只有只定义9*9的空间的话,就会越界,我们不妨给我们的数组扩大一圈,这样问题就解决了那么ROWS和COLS就设为11,再定义ROW和COL为ROW+2和COL+2,之后我们就可以随时调用数据了。初始化的函数实现很简单,因为两个个数组的行和列都是一样的,所以就设立一个字符变量来存放初始化的值。

第二部分:

(DisplayBoard)打印棋盘的函数实现当然也很简单,用双重for循环来解决就行了,但是这样打印出来的棋盘,我们不清楚它的行和列,我们可以完善一下,这样调用坐标就很方便了,列的话在双重for循环的第一层每次循环打印一个i就行了,而打印列的话因为前面多了一列,那么就从0开始,用单层for循环实现。但是这样还不完美,这时连个数组是贴在一起的,就就在后面打印一个==============来隔开,哪里不美观就在哪里进行优化就行了。

第三部分:

(SetMine)设置雷的话要随机值,那我们就要用到rand()函数了,运用这个之前还需在test()上加上srand((unsigned int)time(NULL)。不妨设置两个变量x和y分别作行坐标和列坐标因为是11*11中的9*9,所以x和y的开始都是1~9,那就要限定它的范围,rand()%row是0~8,那么rand()%row+1就是1~9了,之后便用count来接受要放入雷的个数,用 define NUM来定义一个值,就设为10吧。用while循环,count作参数,因为不能重复放,所以当不等于'1'的时候就就存放一个雷,放一个就count--,知道count为0时为假,退出循环。

第四部分:

最后一个部分的思路可以分为四个小部分~

1.输入一个坐标

2.判断是否超出范围

3.如果是雷则炸死,退出程序

如果不是,排查周围雷的个数

4.排查完全部,游戏结束

这次的函数要实现两个数组的联立,所以参数也要写上两个数组,行坐标和列坐标要在限定的范围才能生效,范围为1~9,在这个成立的基础上,就要判断是否是雷了,是雷就凉凉,不是雷就排查周围雷的个数,这时设立GetMineCount()函数来实现这个操作,假设这个坐标是x,y,那么它左边的就是x,y-1,右边的就是x,y+1,一次类推,就可以得出周围的坐标了,然后把他们相加减去8个'0',就得出它的个数,'1'减去'0'=33-32等于1,加上后就可以直接return这个个数,还有一种方法,因为行坐标的范围在x-1到x+1,列坐标的范围在y-1到y+1,所以可以这样实现:

int GetMineCount(char mine[ROWS][COLS], int x, int y)
{
    int count = 0;
    for (int i = -1; i <= 1; i++)
    {
        for (int j = -1; j <= 1; j++)
        {
            count = mine[x + i][y + j] - '0';
        }
    }
}

因为数组空间格式是row*col,那么没有雷的个数就是row*col-NUM,用win来存放,当row*col-NUN!=1的时候那就游戏还没结束,当row*col-NUN==1的时候游戏就胜利了。

至此扫雷游戏就简单的实现了。

  • 20
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是一个简单的扫雷程序的C语言代码示例: ```c #include <stdio.h> #include <stdlib.h> #include <time.h> #define ROWS 10 #define COLS 10 #define MINES 10 void print_board(char board[ROWS][COLS], int reveal_all); void place_mines(char board[ROWS][COLS]); int count_adjacent_mines(char board[ROWS][COLS], int row, int col); void reveal_cell(char board[ROWS][COLS], int row, int col, int *remaining_cells); void play_game(char board[ROWS][COLS]); int main() { char board[ROWS][COLS]; srand(time(NULL)); place_mines(board); print_board(board, 0); play_game(board); return 0; } void print_board(char board[ROWS][COLS], int reveal_all) { int i, j; printf(" "); for (i = 0; i < COLS; i++) { printf("%d ", i + 1); } printf("\n"); for (i = 0; i < ROWS; i++) { printf("%c ", 'A' + i); for (j = 0; j < COLS; j++) { if (board[i][j] == '*' && !reveal_all) { printf(". "); } else { printf("%c ", board[i][j]); } } printf("\n"); } } void place_mines(char board[ROWS][COLS]) { int i, j, count = 0; for (i = 0; i < ROWS; i++) { for (j = 0; j < COLS; j++) { board[i][j] = '.'; } } while (count < MINES) { i = rand() % ROWS; j = rand() % COLS; if (board[i][j] == '.') { board[i][j] = '*'; count++; } } } int count_adjacent_mines(char board[ROWS][COLS], int row, int col) { int i, j, count = 0; for (i = row - 1; i <= row + 1; i++) { for (j = col - 1; j <= col + 1; j++) { if (i >= 0 && i < ROWS && j >= 0 && j < COLS && board[i][j] == '*') { count++; } } } return count; } void reveal_cell(char board[ROWS][COLS], int row, int col, int *remaining_cells) { int i, j; if (board[row][col] == '.') { (*remaining_cells)--; board[row][col] = '0' + count_adjacent_mines(board, row, col); if (board[row][col] == '0') { for (i = row - 1; i <= row + 1; i++) { for (j = col - 1; j <= col + 1; j++) { if (i >= 0 && i < ROWS && j >= 0 && j < COLS) { reveal_cell(board, i, j, remaining_cells); } } } } } } void play_game(char board[ROWS][COLS]) { int row, col, remaining_cells = ROWS * COLS - MINES; while (remaining_cells > 0) { printf("Enter row and column: "); scanf("%d %d", &row, &col); row--; col--; if (row >= 0 && row < ROWS && col >= 0 && col < COLS) { if (board[row][col] == '*') { printf("Game over!\n"); print_board(board, 1); return; } else { reveal_cell(board, row, col, &remaining_cells); print_board(board, 0); } } } printf("You won!\n"); } ``` 这个程序使用了一个二维字符数组来表示扫雷的棋盘,其中每个字符表示该位置的状态,'.'表示未揭开,'*'表示地雷,'0'-'8'表示相邻地雷的数量。在程序开始时,使用`place_mines`函数随机放置地雷。然后使用`print_board`函数打印当前的棋盘。在玩家选择一个位置后,使用`reveal_cell`函数揭开该位置,如果该位置是地雷则游戏结束,否则更新棋盘并继续游戏,直到所有非地雷位置都被揭开。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值