c语言扫雷程序

用c语言实现一个扫雷程序,有挑战性的主要有两部分内容:游戏的逻辑,空白区域的炸开算法
 1.游戏核心逻辑
观察Windwos的扫雷游戏,可以知道,一个格子有两种类型的状态需要描述,一种类型是这个格子是否有雷,另外一种状态是格子的绘制状态,这个类型就多了,格子上可能显示未知,数字,空白,旗帜,疑问,雷,一共是6种类型。
2.空白区域炸开算法
关于空白区域的炸开,至于炸到什么程度为止,通过观察Windows的扫雷游戏,我们也可以知道,要炸到这个格子显示数字为止,对此可以使用递归算法求解问题。

3.代码实现
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
#include <memory.h>

enum gridState {UNKNOWN,NUMBER,BLANK,FLAG,DOUBT,MINE};
enum mineState {NOMINE, HASMINE };

typedef struct Table_{
    int rows;
    int columns;
    int digNum;
    int mineNum;
    double	timePassed;
    int**	mines;
    int**	state;
}GameTable;

char scanf_char();
int  choisirNombreAleatoire(int Max);
int** AllouerMatrice(int n, int p);
int  LibererMatrice(int **tab, int n);
int  InitialiserMatrice(int **tab, int n, int p, int valeur);
void initGame(GameTable* tab);
int  runGame(GameTable* tab);
void printGame(GameTable* tab);
void deleteGame(GameTable* tab);
void initMines(int** tab, int n, int p, int mineNum);
int  getMines(GameTable* tab , int r, int c);
void blank(GameTable* tab, int r, int c);
int  changeState(GameTable* tab, int r, int c, int flag);
void printMine(GameTable* tab);

int main() {
  //init the rows, columns, mines
    srand(time(NULL));
    GameTable tabs;
    initGame(&tabs);

  //run game
  int flag = 1;
  while (flag) {
    flag = runGame(&tabs);
  }
  if (tabs.digNum == tabs.mineNum)
    printf("you win the game\n");
  else
    printf("you lost the game\n");
  //free memory
  deleteGame(&tabs);

  return 0;
}

//==========================================================================================
void initGame(GameTable* tab)
{
    printf("pl
  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,下面是一个非常简单的C语言扫雷程序,其中只实现了最基本的功能,适合初学者参考: ```c #include <stdio.h> #include <stdlib.h> #include <time.h> #define ROWS 10 #define COLS 10 #define MINES 10 int main() { int board[ROWS][COLS]; // 游戏棋盘 int mines[MINES][2]; // 地雷位置 int i, j, k, x, y, count; char input[10]; // 初始化棋盘 for (i = 0; i < ROWS; i++) { for (j = 0; j < COLS; j++) { board[i][j] = 0; } } // 初始化地雷 srand(time(NULL)); for (k = 0; k < MINES; k++) { do { x = rand() % ROWS; y = rand() % COLS; } while (board[x][y] == -1); board[x][y] = -1; mines[k][0] = x; mines[k][1] = y; } // 主循环 while (1) { // 显示棋盘 printf(" "); for (j = 0; j < COLS; j++) { printf("%2d ", j); } printf("\n"); for (i = 0; i < ROWS; i++) { printf("%2d ", i); for (j = 0; j < COLS; j++) { if (board[i][j] >= 0) { printf(" - "); } else { printf(" * "); } } printf("\n"); } // 读取玩家输入 printf("\nEnter row and column (e.g. 3 4), or q to quit: "); fgets(input, 10, stdin); if (input[0] == 'q') { break; } sscanf(input, "%d %d", &x, &y); // 检查输入是否合法 if (x < 0 || x >= ROWS || y < 0 || y >= COLS) { printf("Invalid input!\n"); continue; } if (board[x][y] >= 0) { printf("Already opened!\n"); continue; } // 判断是否踩到地雷 if (board[x][y] == -1) { printf("Oops, you stepped on a mine!\n"); break; } // 计算周围地雷数量 count = 0; for (i = x-1; i <= x+1; i++) { for (j = y-1; j <= y+1; j++) { if (i >= 0 && i < ROWS && j >= 0 && j < COLS && board[i][j] == -1) { count++; } } } // 更新棋盘状态 board[x][y] = count; } // 显示地雷位置 for (k = 0; k < MINES; k++) { printf("Mine %d at (%d, %d)\n", k+1, mines[k][0], mines[k][1]); } return 0; } ``` 这个程序采用了二维数组来表示游戏棋盘,-1代表有地雷,0代表未翻开,1-8代表周围地雷数量。程序随机生成若干个地雷并在棋盘上标记出来,然后进入主循环,每次循环中读取玩家输入(选择翻开哪个方格),判断是否踩中地雷,如果没有踩中,则更新棋盘状态。玩家可以输入q来结束游戏。当游戏结束后,程序会显示地雷位置。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值