扫雷游戏(第一次不被炸,展开)

引言

《扫雷》是一款大众类的益智小游戏,于1992年发行。游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输。

要求程序达到以下要求:
1.第一次下子,不炸死;
2.坐标周围没雷,可以实现展开。

下面我们以多文件的方式实现:

1.mine.h
2.main.c
3.mine.c

埋雷

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 = 1;
 for (; i <= 10; i++) {
  printf(" %d  ",i);
 }
 printf("\n----");
 for (i=1; i <= 10; i++) {
  printf("----");
 }
 printf("\n");
 for (i = 1; i <= 10; i++) {
  printf(" %2d |", i);
  int j = 1;
  for (j = 1; j <= 10; j++) {
   printf(" %c |", board[i][j]);
  }
  printf("\n----");
  int k = 1;
  for (k=1; k <= 10; 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 OpenMine(char mine[][COL], char board[][COL], int x, int y) {
 if (mine[x-1][y-1] == '0') {
  board[x-1][y-1] = GetMines(mine, x-1, y-1);
 }
 if (mine[x-1][y] == '0') {
  board[x-1][y] = GetMines(mine, x-1, y);
 }
 if (mine[x-1][y+1] == '0') {
  board[x-1][y+1] = GetMines(mine, x-1, y+1);
 }
 if (mine[x][y-1] == '0') {
  board[x][y-1] = GetMines(mine, x, y-1);
 }
 if (mine[x][y+1] == '0') {
  board[x][y+1] = GetMines(mine, x, y+1);
 }
 if (mine[x+1][y-1] == '0') {
  board[x+1][y-1] = GetMines(mine, x+1, y-1);
 }
 if (mine[x+1][y] == '0') {
  board[x+1][y] = GetMines(mine, x+1, y);
 }
 if (mine[x+1][y+1] == '0') {
  board[x+1][y+1] = GetMines(mine, x+1, y+1);
 }
}

以上为该游戏的主要实现,下面我们看一下完整代码:

mine.h

#ifndef _MINE_H_
#define _MINE_H_
#pragma warning (disable:4996)
#define ROW 12//10+2
#define COL 12
#define MINE_NUM 20
#define TOTAL 100
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
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 OpenMine(char mine[][COL], char board[][COL], int x, int y);
void Game();
#endif

main.c

#include "mine.h"
void Menu() 
{
 printf("##################################\n");
 printf("##      欢迎进入扫雷游戏!      ##\n");
 printf("##################################\n");
 printf("## 1.开始游戏        2.退出游戏 ##\n");
 printf("##################################\n");
 printf("请选择:");
}
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;
}

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 = 1;
 for (; i <= 10; i++) {
  printf(" %d  ",i);
 }
 printf("\n----");
 for (i=1; i <= 10; i++) {
  printf("----");
 }
 printf("\n");
 for (i = 1; i <= 10; i++) {
  printf(" %2d |", i);
  int j = 1;
  for (j = 1; j <= 10; j++) {
   printf(" %c |", board[i][j]);
  }
  printf("\n----");
  int k = 1;
  for (k=1; k <= 10; 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 OpenMine(char mine[][COL], char board[][COL], int x, int y) {
 if (mine[x-1][y-1] == '0') {
  board[x-1][y-1] = GetMines(mine, x-1, y-1);
 }
 if (mine[x-1][y] == '0') {
  board[x-1][y] = GetMines(mine, x-1, y);
 }
 if (mine[x-1][y+1] == '0') {
  board[x-1][y+1] = GetMines(mine, x-1, y+1);
 }
 if (mine[x][y-1] == '0') {
  board[x][y-1] = GetMines(mine, x, y-1);
 }
 if (mine[x][y+1] == '0') {
  board[x][y+1] = GetMines(mine, x, y+1);
 }
 if (mine[x+1][y-1] == '0') {
  board[x+1][y-1] = GetMines(mine, x+1, y-1);
 }
 if (mine[x+1][y] == '0') {
  board[x+1][y] = GetMines(mine, x+1, y);
 }
 if (mine[x+1][y+1] == '0') {
  board[x+1][y+1] = GetMines(mine, x+1, y+1);
 }
}
void Game()
{
 char mine[ROW][COL];
 char board[ROW][COL];
 memset(mine, '0', sizeof(mine));
 memset(board, ' ', sizeof(board));
 SetMine(mine, ROW, COL);
 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';
    char num = GetMines(mine, ROW, COL);
    board[x][y] = num;
    OpenMine(mine, board, x, y);
    int ret = 1;
    while (ret) {
     int x = GetRandIndex(1, 10);
     int y = GetRandIndex(1, 10);
     if (mine[x][y] == '0') {
      mine[x][y] = '1';
      ret--;
      break;
     }
    }break;
   }
   if (mine[x][y] == '0') {
    char num = GetMines(mine, x, y);
    board[x][y] = num;
    OpenMine(mine, board, x, y);
    count--;
    if (count <= 20) {
     printf("恭喜你,你赢了!\n");
     break;
    }
   }
   else {
    printf("很遗憾,你被炸死了!\n");
    ShowBoard(mine, ROW, COL);
    break;
   }
  }
  else {
   printf("输入的坐标有误,请重新输入!\n");
  }
  system("cls");
 }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值