C语言实现扫雷游戏附注释

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

概述

扫雷是一款大众类的益智小游戏。游戏目标是根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输。

实现过程

1、创建一个用户交互菜单
2、布雷函数
3、显示扫雷矩阵
4、玩家自定义坐标
5、计算排雷数

多文件实现

头文件  clear_mine.h

#pragma once  //防止头文件被重复包含
 
#define _CRT_SECURE_NO_WARNINGS 1   //实现 scanf 编译通过
 
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
 
#define ROW 8              
#define COL 8           
 
#define STYLE '?'        //初始化
#define NUM 20           //埋雷数
 
extern void Game();

源文件main.c

向玩家展示菜单栏

#include "clear_mine.h"
 
static 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# ");
  scanf("%d", &select);
  switch (select)
  {
  case 1:
   Game();
   break;
  case 0:
   quit = 1;
   break;
  default:
   printf("Position Error, Try Again!\n");
   break;
  }
 }
 
 printf("byebye!\n");
 
 system("pause");
 return 0;
}

源文件clear_mine.c

#include "clear_mine.h"
 
static 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;   //随机数生成 矩阵长宽分别-2 的随机数
  if (board[x][y] == '0')     //非法判断 只能同一个位置生成一个随机数
  {
   board[x][y] = '1';
   count--;
  }
 }
}
 
static void ShowLine(int col)        
{
 for (int i = 0; i <= (col - 2); i++)
 {
  printf("----");
 }
 printf("\n");
}
static 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);
 }
}
 
static char CountMines(char board[][COL], int x, int y)      //计算某点周围8个位置雷总数
{
 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));  //生成用户显示矩阵   
 memset(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 Position <x,y># ");
  int x = 0;
  int y = 0;
  scanf("%d %d", &x, &y);
  if (x < 1 || x > 10 || y < 1 || y > 10)    //非法性判断
  {
   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--;
 }
 
}

初始化好的扫雷矩阵 

游戏体验结果

感兴趣的小朋友可以尝试下哦

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

相关文章

  • C语言const关键字的用法详解

    C语言const关键字的用法详解

    今天探讨const,首先来说是将变量常量化。为什么要将变量常量化,原因有诸多好处有诸多。比如可以使数据更加安全不会被修改
    2022-08-08
  • C++动态内存分配超详细讲解

    C++动态内存分配超详细讲解

    给数组分配多大的空间?你是否和初学C时的我一样,有过这样的疑问。这一期就来聊一聊动态内存的分配,读完这篇文章,你可能对内存的分配有一个更好的理解
    2022-08-08
  • C语言顺序表的基本操作(初始化,插入,删除,查询,扩容,打印,清空等)

    C语言顺序表的基本操作(初始化,插入,删除,查询,扩容,打印,清空等)

    这篇文章主要介绍了C语言顺序表的基本操作(初始化,插入,删除,查询,扩容,打印,清空等),具有很好的参考价值,希望对大家有所帮助。
    2023-02-02
  • C语言实现洗牌与发牌游戏

    C语言实现洗牌与发牌游戏

    这篇文章主要为大家详细介绍了C语言洗牌与发牌游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • 基于Linux系统调用--getrlimit()与setrlimit()函数的方法

    基于Linux系统调用--getrlimit()与setrlimit()函数的方法

    本篇文章是对在Linux系统中调用getrlimit()与setrlimit()函数的方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 浮点数在计算机中存储方式是怎样的

    浮点数在计算机中存储方式是怎样的

    这篇文章介绍了浮点数在计算机中是如何存储的,讲解的比较详细,有需要的朋友可以参考一下。
    2016-06-06
  • C++用boost.signal实现多播委托

    C++用boost.signal实现多播委托

    这篇文章介绍了C++用boost.signal实现多播委托的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • Qt6安装教程(使用国内源)

    Qt6安装教程(使用国内源)

    本文主要介绍了Qt6安装教程(使用国内源),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • C语言入门篇--变量[定义,初始化赋值,外部声明]

    C语言入门篇--变量[定义,初始化赋值,外部声明]

    本篇文章是c语言基础篇,本文对初识c语言的变量、变量的定义、初始化与赋值、变量的分类、含义、外部声明做了简要的描述,帮助大家快速入门c语言的世界,更好的理解c语言
    2021-08-08
  • c++ 随机数问题的相关研究

    c++ 随机数问题的相关研究

    这篇文章主要介绍了c++ 随机数问题的相关研究,帮助大家更好的理解和学习使用c++,感兴趣的朋友可以了解下
    2021-03-03

最新评论