C语言实现(简易)扫雷游戏

扫雷是曾经每台Windows系统电脑上都带有的小游戏,每个人或多或少对它有回忆,但随着时代的发展,曾经风靡的扫雷游戏已经被越开越多游戏所代替,今天我们就用C语言实现扫雷游戏,一起重温曾经的回忆。

扫雷游戏:在这里插入图片描述

功能描述:
本次实现的扫雷游戏,玩家进入游戏后需要选择输入对应格子的坐标,若此格子有雷,则游戏结束,若没有雷,则会提示玩家该格子为中心周围的8个格子中共有几颗雷,直到所有格子选择完毕,玩家即获胜。

具体功能实现:

  1. 在界面选择关卡
  2. 利用两个二维数组分别存放数据和打印棋盘
  3. 电脑将根据给出的随机值,在棋盘上置雷
  4. 玩家输入相应的坐标进行排雷
  5. 若输入的坐标正好有雷,则判为输,游戏结束
  6. 若将所有未有雷的格子全部选完,则判为赢,游戏结束
  7. 结束后返回菜单,提示玩家继续或退出游戏

各函数具体构建:

  1. 菜单函数:当玩家打开程序,首先弹出一个菜单,供玩家选择,直接使用printf打印即可。
void Menu() {
 printf("######欢迎来到扫雷游戏室#####\n");
 printf("#############################\n");
 printf("#######  1、开始游戏  #######\n");
 printf("#######  2、退出游戏  #######\n");
 printf("#############################\n");
 printf("请输入你的选择:");
}
  1. 初始化棋盘:进入游戏后,需要清空两个数组,将数据数组的元素全赋值为“0“,将棋盘数组的元素全部赋值为” ”(空格)。
void IntiBoard(char arr[][COL], int row, int col,char symbol) {
 int i, j;
 for(i=0;i<row;i++)
  for (j = 0; j < col; j++) {
   arr[i][j] = symbol;
  }
}
  1. 打印棋盘:当二维数组清空后,直接将二维数组个元素并配合“----------”“|”利用循环逐一打印,实现棋盘的打印
void ShowBoard(char arr[][COL], int row, int col) {
 int i;
 printf("---------------------------------------------\n");
 printf("|   | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |10 |\n");
 for (i = 1; i < row-2; i++) {
  printf("---------------------------------------------\n");
  printf("| %d | %c | %c | %c | %c | %c | %c | %c | %c | %c | %c |\n",i,arr[1][i], arr[2][i], arr[3][i], arr[4][i], arr[5][i], arr[6][i], arr[7][i], arr[8][i], arr[9][i], arr[10][i]);
 }  
 printf("---------------------------------------------\n");
 printf("|10 | %c | %c | %c | %c | %c | %c | %c | %c | %c | %c |\n",arr[1][10], arr[2][10], arr[3][10], arr[4][10], arr[5][10], arr[6][10], arr[7][10], arr[8][10], arr[9][10], arr[10][10]);
}
  1. 玩家选择排雷:判断若选择的坐标在棋盘上未被选过,则将其数据数组的对应元素赋值为“X"。
void PlayerMove(char arr[][COL], int row, int col) {
 char board[ROW][COL];
 char mine[ROW][COL];
 int x = 0, y = 0;
 printf("请选择坐标:\n");
next:
 scanf("%d%d", &x, &y);
 if (arr[x][y] == ' ')
  arr[x][y] = 'X';
 else {
  printf("此处已排过雷,请重选:");
  goto next;
 }
}
  1. 电脑置雷:根据棋盘范围内的随机数,将有限个数据数组的元素赋值为”1”。
void SetMine(char arr[][COL], int row, int col) {
 int ray=RAY;
 while(ray){
  int x = rand() % 10 + 1;
  int y = rand() % 10 + 1;
  if (arr[x][y] == '0') {
   arr[x][y] = '1';
   ray--;
  }
  else
   continue;
 }
}
  1. 判断周围雷个数:若判断所选位置没雷,则判断其周围雷的个数,并打印到棋盘数组对应的元素上
void JudgeNum(char board[][COL],char mine[][COL], int x, int y) {
 int ray = 0;
 char c;
  if (board[x - 1][y - 1] == '1')
   ray++;
  if (board[x - 1][y] == '1')
   ray++;
  if (board[x - 1][y + 1] == '1')
   ray++;
  if (board[x][y - 1] == '1')
   ray++;
  if (board[x][y + 1] == '1')
   ray++;
  if (board[x + 1][y - 1] == '1')
   ray++;
  if (board[x + 1][y] == '1')
   ray++;
  if (board[x + 1][y + 1] == '1')
   ray++;
 c = ray + '0';
 mine[x][y] = c ;
}

7.Game函数,各函数编写完毕后再用Game函数联系起来

void Game() {
 int sum = BLANK;
 char board[ROW][COL];
 char mine[ROW][COL];
 IntiBoard(board,ROW,COL,'0');
 IntiBoard(mine,ROW,COL,' ');
 srand((unsigned long)time(NULL));
 SetMine(board, ROW, COL);
 while (sum!=0) {
  ShowBoard(mine, ROW, COL);
  ShowBoard(board, ROW, COL);
  int x = 0, y = 0;
  printf("请选择坐标:\n");
 next:
  scanf("%d%d", &x, &y);
  if(x>0&&x<11&&y>0&&y<11){
   if (board[x][y] == '1') {
    printf("对不起你的选的坐标有雷,游戏结束!\n");
    break;
   }
   if (mine[x][y] == ' ') {
    board[x][y] = 'X';
    sum--;
   }
   else {
    printf("此处已排过雷,请重选:");
    goto next;
   }
   JudgeNum(board, mine, x, y);
  }
  else {
   printf("你输入的坐标有误,请重新输入!\n");
   goto next;
  }
 }
 if (sum == 0) {
  printf("恭喜你,赢了!\n");
 }
}

头文件声明:
为防止跨文件计算机无法找到函数和变量,在头文件中将函数统一声明

#ifndef _WINMINE_H_
#define _WINMINE_H_

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 12
#define COL 12
#define RAY 20
#define BLANK 100-RAY

void Menu();
void Game();
void IntiBoard(char arr[][COL], int row, int col,char symbol);
void ShowBoard(char arr[][COL], int row, int col);
void JudgeNum(char board[][COL], char mine[][COL], int x, int y);
void SetMine(char arr[][COL], int row, int col);


#endif 

函数定义:

#include"winmine.h"

void Menu() {
 printf("######欢迎来到扫雷游戏室#####\n");
 printf("#############################\n");
 printf("#######  1、开始游戏  #######\n");
 printf("#######  2、退出游戏  #######\n");
 printf("#############################\n");
 printf("请输入你的选择:");
}

void IntiBoard(char arr[][COL], int row, int col,char symbol) {
 int i, j;
 for(i=0;i<row;i++)
  for (j = 0; j < col; j++) {
   arr[i][j] = symbol;
  }
}

void ShowBoard(char arr[][COL], int row, int col) {
 int i;
 printf("---------------------------------------------\n");
 printf("|   | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |10 |\n");
 for (i = 1; i < row-2; i++) {
  printf("---------------------------------------------\n");
  printf("| %d | %c | %c | %c | %c | %c | %c | %c | %c | %c | %c |\n",i,arr[1][i], arr[2][i], arr[3][i], arr[4][i], arr[5][i], arr[6][i], arr[7][i], arr[8][i], arr[9][i], arr[10][i]);
 }  
 printf("---------------------------------------------\n");
 printf("|10 | %c | %c | %c | %c | %c | %c | %c | %c | %c | %c |\n",arr[1][10], arr[2][10], arr[3][10], arr[4][10], arr[5][10], arr[6][10], arr[7][10], arr[8][10], arr[9][10], arr[10][10]);
}

void PlayerMove(char arr[][COL], int row, int col) {
 char board[ROW][COL];
 char mine[ROW][COL];
 int x = 0, y = 0;
 printf("请选择坐标:\n");
next:
 scanf("%d%d", &x, &y);
 if (arr[x][y] == ' ')
  arr[x][y] = 'X';
 else {
  printf("此处已排过雷,请重选:");
  goto next;
 }
}

void SetMine(char arr[][COL], int row, int col) {
 int ray=RAY;
 while(ray){
  int x = rand() % 10 + 1;
  int y = rand() % 10 + 1;
  if (arr[x][y] == '0') {
   arr[x][y] = '1';
   ray--;
  }
  else
   continue;
 }
}

void JudgeNum(char board[][COL],char mine[][COL], int x, int y) {
 int ray = 0;
 char c;
  if (board[x - 1][y - 1] == '1')
   ray++;
  if (board[x - 1][y] == '1')
   ray++;
  if (board[x - 1][y + 1] == '1')
   ray++;
  if (board[x][y - 1] == '1')
   ray++;
  if (board[x][y + 1] == '1')
   ray++;
  if (board[x + 1][y - 1] == '1')
   ray++;
  if (board[x + 1][y] == '1')
   ray++;
  if (board[x + 1][y + 1] == '1')
   ray++;
 c = ray + '0';
 mine[x][y] = c ;
}

void Game() {
 int sum = BLANK;
 char board[ROW][COL];
 char mine[ROW][COL];
 IntiBoard(board,ROW,COL,'0');
 IntiBoard(mine,ROW,COL,' ');
 srand((unsigned long)time(NULL));
 SetMine(board, ROW, COL);
 while (sum!=0) {
  ShowBoard(mine, ROW, COL);
  ShowBoard(board, ROW, COL);
  int x = 0, y = 0;
  printf("请选择坐标:\n");
 next:
  scanf("%d%d", &x, &y);
  if(x>0&&x<11&&y>0&&y<11){
   if (board[x][y] == '1') {
    printf("对不起你的选的坐标有雷,游戏结束!\n");
    break;
   }
   if (mine[x][y] == ' ') {
    board[x][y] = 'X';
    sum--;
   }
   else {
    printf("此处已排过雷,请重选:");
    goto next;
   }
   JudgeNum(board, mine, x, y);
  }
  else {
   printf("你输入的坐标有误,请重新输入!\n");
   goto next;
  }
 }
 if (sum == 0) {
  printf("恭喜你,赢了!\n");
 }
}

main函数:

#include"winmine.h"

int main() {
 int choice;
 int quit=0;
 Menu();
again:
  scanf("%d", &choice);
  switch (choice) {
  case(1):
   Game();
   printf("还要再来一局吗?1.继续2.退出\n");
   goto again;
  case(2):
   break;
  default:
   printf("你的输入有误,请重新输入!\n");
   goto again;
  }
}

如上就是扫雷的全部代码
如若此篇博客对你有所帮助,不胜荣幸,若有建议,敬请斧正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值