C语言实现扫雷小游戏详细代码

 更新时间:2021年06月04日 08:40:57   作者:是崽崽a  
这篇文章主要为大家详细介绍了C语言实现扫雷小游戏的代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

前言

扫雷是一款很经典的电脑小游戏,扫雷就是要把所有非地雷的格子找出即为胜利,输入到地雷格子就算失败。游戏主区域由很多个方格组成,输入一个方格坐标,方格即被打开并显示出方格中的数字,方格中数字则表示其周围的8个方格隐藏了几颗雷,如果点开的格子为0,即代表其周围有0颗雷。

本篇文章将用VS2013带领大家用C语言编写此款小游戏。

一、所需函数

1.埋雷函数(SetMines)
2.ShowLine
3.ShowBoard
(2、3函数均为显示横线和竖线)
4.统计雷的个数函数(CountMines)
5.游戏函数(Game)
6.菜单函数(Menu)
7.主函数(main)

二、实现过程

1.算法分析

memset函数初始化棋盘,用SetMines函数进行埋雷,读取用户输入的坐标,当和mine_board的雷“1”坐标一致时,游戏结束,否则用CountMines函数输出当前坐标附近雷的个数,直至雷被排完。
我们用二维数组来打印棋盘,假如我们要打印6×6的棋盘,那我们设置的二维数组元素应为8×8,因为我们在设计算法时需要统计坐标周围8个方位雷的个数,假如要统计边界坐标周围雷的个数,就会有数组越界的问题,我们可以在6×6的边界多上一圈元素,也就要定义8×8的数组元素

利用C库函数memset初始化两个棋盘,一个用于埋雷,一个用于显示。

memset(show_board, STYLE, sizeof(show_board));     
memset(mine_board, '0', sizeof(mine_board)); 

补充一个memset函数:
void *memset(void *str, int c, size_t n)
参数str指向要填充的内存块。c为要被设置的值,该值以 int 形式传递,但是函数在填充内存块时是使用该值的无符号字符形式。n为要被设置为该值的字符数。该值返回一个指向存储区 str 的指针。

2.详细代码

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#define ROW 8
#define COL 8
#define STYLE '?'
#define NUM 10   //埋雷的个数
void SetMines(char board[][COL], int row, int col)          //埋雷
{
 int count = NUM;
 while (count){
  int x = rand() % (row - 2) + 1;
  int y = rand() % (col - 2) + 1;
  if (board[x][y] == '0'){
   board[x][y] = '1';
   count--;
  }
 }
}

void ShowLine(int col)        //格子的横线
{
 for (int i = 0; i <= (col - 2); i++){
  printf("----");
 }
 printf("\n");
}

void ShowBoard(char board[][COL], int row, int col)         //格子的竖线
{
 printf("     ");
 for (int i = 1; i <= (col - 2); i++){
  printf("%d   ", i);
 }
 printf("\n");
 ShowLine(col);
 for (int i = 1; i <= (row - 2); i++){
  printf("%-3d|", i);
  for (int j = 1; j <= (col - 2); j++){
   printf(" %c |", board[i][j]);
  }
  printf("\n");
  ShowLine(col);
 }
}

char CountMines(char board[][COL], int x, int y)            //计算雷的个数
{
 return board[x - 1][y - 1] + board[x - 1][y] + board[x - 1][y + 1] + \
  board[x][y + 1] + board[x + 1][y + 1] + board[x + 1][y] + \
  board[x + 1][y - 1] + board[x][y - 1] - 7 * '0';
}

void Game()
{
 srand((unsigned long)time(NULL));
 char show_board[ROW][COL];
 char mine_board[ROW][COL];
 memset(show_board, STYLE, sizeof(show_board));      //复制字符STYLE到参数所指向的字符串的前sizeof(show_board)个字符
 memset(mine_board, '0', sizeof(mine_board));        //复制字符0到参数所指向的字符串的前sizeof(mine_board)个字符
 SetMines(mine_board, ROW, COL);
 int count = (ROW - 2)*(COL - 2) - NUM;
 while (count){
  system("cls");
  ShowBoard(show_board, ROW, COL);
  printf("Please Enter Your Postion<x,y>:");
  int x = 0;
  int y = 0;
  scanf("%d %d", &x, &y);
  if (x < 1 || x > ROW-2 || y < 1 || y > COL-2){             //判断输入坐标是否合法
   printf("Postion Error!\n");
   continue;
  }
  if (show_board[x][y] != STYLE){                            //判断输入坐标是否已被占用
   printf("Postion Is not *\n");
   continue;
  }
  if (mine_board[x][y] == '1'){                              //判断用户输入坐标是否为雷坐标
   printf("game over!\n");
   ShowBoard(mine_board, ROW, COL);
   break;
  }
  show_board[x][y] = CountMines(mine_board, x, y);
  count--;
 }

}
void Menu()
{
 printf("########################\n");
 printf("# 1. Play       0.Exit #\n");
 printf("########################\n");
}

int main()
{
 int quit = 0;
 int select = 0;
 while (!quit){
  Menu();
  printf("Please Enter 1 or 0 :");
  scanf("%d", &select);
  switch (select){
  case 1:
   Game();
   break;
  case 0:
   quit = 1;
   break;
  default:
   printf("Postion Error, Try Again!\n");
   break;
  }
 }
 printf("You are welcomed to come back next time to play!\n");
 system("pause");
 return 0;
}

三、总结

这就是我的本篇文章了,此代码思路较为直接,欢迎大家和我继续讨论。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 从零学习构造系统之bazel示例详解

    从零学习构造系统之bazel示例详解

    这篇文章主要为大家介绍了从零学习构造系统之bazel示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • C语言程序中结构体的内存对齐详解

    C语言程序中结构体的内存对齐详解

    这篇文章主要为大家详细介绍了C语言程序中结构体的内存对齐的相关资料,文中的示例代码讲解详细,具有一定的参考价值,感兴趣的小伙伴可以了解一下
    2022-11-11
  • C++中不能被重载的运算符介绍

    C++中不能被重载的运算符介绍

    其实在C/C++ 里大多数运算符都可以在C++中被重载的。C 的运算符中只有 . 和 ?:(以及 sizeof,技术上可以看作一个运算符)不可以被重载
    2013-10-10
  • C++ 中const和复合类型

    C++ 中const和复合类型

    本文给大家讲述的是C++ 中比较难理解的const和复合类型,结合自己的一些经验,分享给大家,希望大家能够喜欢。
    2016-02-02
  • VScode搭建C/C++开发环境的详细过程

    VScode搭建C/C++开发环境的详细过程

    最近迷上了vscode,小巧美观,最主要的是全平台,但是vscode并不是ide,必须得自己配置环境,下面这篇文章主要给大家介绍了关于VScode搭建C/C++开发环境的详细过程,需要的朋友可以参考下
    2023-06-06
  • c语言实现找最大值最小值位置查找

    c语言实现找最大值最小值位置查找

    这篇文章主要介绍了c语言实现找最大值最小值位置查找,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • C++实现堆排序示例

    C++实现堆排序示例

    这篇文章主要介绍了C++实现堆排序示例,全文运用大量代码完成堆排序,需要了解的朋友可以参考一下这篇文章
    2021-08-08
  • C++实现恶搞电脑关机小程序的示例代码

    C++实现恶搞电脑关机小程序的示例代码

    这篇文章主要为大家详细介绍了如何利用C++实现一个简单的恶搞电脑关机小程序,文中的示例代码讲解详细,感兴趣的小伙伴可以尝试一下
    2022-11-11
  • Qt中JSON操作的具体使用

    Qt中JSON操作的具体使用

    本文主要介绍了Qt中JSON操作的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • C++连接mysql数据库并读取数据的具体步骤

    C++连接mysql数据库并读取数据的具体步骤

    在实际开发中我们经常需要对数据库进行访问,针对不同类型的数据库(如MySQL、sqLite、Access、Excel等),如果采用不同的方法进行连接,会把我们搞崩溃,下面这篇文章主要给大家介绍了关于C++连接mysql数据库并读取数据的具体步骤,需要的朋友可以参考下
    2023-04-04

最新评论