扫雷(初级)游戏程序编写(C语言版)

简介:  前言:●通过对扫雷游戏(初级)程序编写,实现对数组等知识点的应用与理解。●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教!

前言:

●通过对扫雷游戏(初级)程序编写,实现对数组等知识点的应用与理解。

●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教!

正文:

说明:本代码编译环境为Visual Studio2019,其中出现特定为该编译器设定的代码语句:#define_CRT_SECURE_NO_WARNINGS

 

此代码语句的功能:为了解决Visual Studio编译环境的一些库函数等报错或警告问题

注:此代码语句只在Visual Studio编译环境使用,其他编译器需屏蔽此代码语句

————————————————

 

1.创建头文件:game.h  

代码如下:

#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define EASY_COUNT 10
#include <stdio.h>
#include<stdlib.h>
#include<time.h>
void InitBoard(char board[ROWS][COLS], int rows, int cols,char set);
void DisplayBoard(char board[ROWS][COLS], int row, int col);
void SetMine(char board[ROWS][COLS], int row, int col);
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

image.gif

2.创建源文件:  game.c

代码如下:

#define  _CRT_SECURE_NO_WARNINGS
#include"game.h"
void InitBoard(char board[ROWS][COLS], int rows, int cols,char set)
{
  int i = 0;
  int j = 0;
  for (i = 0; i < rows; i++)
  {
    for (j = 0; j < cols; j++)
    {
      board[i][j] = set;  //'*'
    }
  }
}
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
  int i = 0;
  int j = 0;
      //打印列号
  for (i = 0; i <= col; i++)
  {
    printf("%d", i);
  }
  printf("\n");
  for (i = 1; i <= row; i++)
  {
    printf("%d", i);
    for (j = 1; j <= col; j++)
    {
      printf("%c", board[i][j]);
    }
    printf("\n");
  }
}
void SetMine(char board[ROWS][COLS], int row, int col)
{
  int count = EASY_COUNT;
  while (count)
  {
    int x = rand() % row + 1; //1-9
    int y = rand() % col + 1; //1-9
    if (board[x][y] == '0')
    {
      board[x][y] = '1';
      count--;
    }
  }
}
//'0'-'0'=0
//'1'-'0'=1
//'3'-'0'=3
int get_mine_count(char mine[ROWS][COLS], int x, int y)
{
    return  mine[x - 1][y] +
        mine[x - 1][y - 1] +
        mine[x][y - 1] +
        mine[x + 1][y - 1] +
        mine[x + 1][y] +
        mine[x + 1][y + 1] +
        mine[x][y + 1] +
        mine[x - 1][y + 1] - 8 * '0';
}
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{ 
  int x = 0;
  int y = 0;
  int win = 0;
  //如果9*9-10=71
  while(win<row*col-EASY_COUNT)
        //while (1)此语句被上个while语句替代
  {
    printf("请输入排查雷的坐标:>");
    scanf("%d%d", &x, &y);
    if (x >= 1 && x <= row && y <= col)
    {
      //坐标合法
      //1.踩雷
      if (mine[x][y] == '1')
      {
        printf("很遗憾,你被炸死了!\n");
        DisplayBoard(mine, row, col);
        break;
      }
      else //不是雷
      {
        //计算x,y坐标周围有几个雷
        int count = get_mine_count(mine, x, y);
        show[x][y] = count + '0';
        DisplayBoard(show, row, col);
        win++;
      }
    }
    else
    {
      printf("输入坐标非法,请重新输入!\n");
    }
  }
  if (win == row * col - EASY_COUNT)
  {
    printf("恭喜你,排雷成功!\n");
    DisplayBoard(mine, row, col);
  }
}
//解展开功能要用到递归
//1.坐标不是雷
//2.坐标周围也不是雷

image.gif

3.创建源文件: test.c

代码如下:

#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include"game.h"
void menu()
{
  printf("*********************\n");
  printf("******* 1.Play  *****\n");
  printf("******* 0.Exit  *****\n");
  printf("*********************\n");
}
void game()
{
            //雷的信息存储
            //1.布置好的雷的信息
  char mine[ROWS][COLS] = { 0 };    //11*11
             //2.排查出雷的信息
  char show[ROWS][COLS] = { 0 };
             //初始化
  InitBoard(mine, ROWS, COLS,'0');
  InitBoard(show, ROWS, COLS,'*');
             //打印棋盘
  DisplayBoard(mine, ROW, COL);
  DisplayBoard(show, ROW, COL);
                                    //printf("扫雷\n");
              //布置雷
  SetMine(mine, ROW, COL);
  DisplayBoard(mine, ROW, COL);  //真正进行排雷会屏蔽此语句,此语句可查看雷的位置坐标
              //扫雷
  FindMine(mine, show, ROW, COL);
}
void test()
{ 
  int input = 0;
  srand((unsigned int)time(NULL));
  do
  {
    menu();
    printf("请选择游戏开始或结束:>\n");
    printf("#输入数字1代表游戏开始,输入数字0代表游戏结束#\n");
    printf("#坐标输入方式:数字-空格键-数字#\n");
    scanf("%d",&input);
    switch (input)
    {
    case 1:
      game();
      break;
    case 0:
      printf("退出游戏\n");
      break;
    defult:
      printf("选择错误,重新选择!\n");
      break;
    }
  } while (input);
}
int main()
{
  test();
  return 0;
}

image.gif

4.按照提示运行程序即可

运行结果示例:

image.gif编辑image.gif编辑

使用说明:

(1)红框标记语句可控制“雷”的位置坐标的显示与隐藏:

image.gif编辑

(2)红框标记语句可更改“雷”的数量 :

因本程序设置棋盘大小为9*9,故此处数量区间为[0,81],

image.gif编辑

(3)红框标记语句可进行棋盘大小更改 :

将数字9更改即可,数字9代表棋盘操作大小,ROW+2代表棋盘总大小,

即操作棋盘大小为9*9,总棋盘大小(加上外框)为11*11

image.gif编辑

总结:

●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教!

通过对扫雷(初级)游戏程序的编写学习,作为一名学习编程新手,作者目前水平有限,只会照葫芦画瓢,其中蕴含的知识极为深邃,而作者只领略一二!虽然仅是照葫芦画瓢的编入编译器,但调试环节确实让作者学会了许多知识!

囿于某些原因,本文有许多不详细,不足之处,其中许多知识仍需作者反复学习与理解,希望在以后的时光里,作者能够和读者一道共同成长!

此处,致敬第一个写出扫雷游戏代码的开发者。

同时也非常感谢人生道路上共同前行的人,无论谋面与否,都让这失落与孤独的心灵得到了治愈,尽管那很短暂!

今天是国庆假期第6天,也是国庆假期留校的第6天,作为假期“守舍人”,独处的日子百感交集,但很荣幸能够和大家一起学习,尽管我们的交流只是通过一根网线,但那早已超越了物理界限,在进行着跨时空,跨地域的问候:你好!来自现在以及未来的正在阅读这篇文章的朋友!祝福你们学有所成,脚踏实地,梦想成真!

祝福祖国成立72周年!

————————————————

                                                                                                             ——Since 新晓•故知

相关文章
|
3月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
99 1
|
3月前
|
C语言
C语言编程中,错误处理至关重要,能提升程序的健壮性和可靠性
C语言编程中,错误处理至关重要,能提升程序的健壮性和可靠性。本文探讨了C语言中的错误类型(如语法错误、运行时错误)、基本处理方法(如返回值、全局变量、自定义异常处理)、常见策略(如检查返回值、设置标志位、记录错误信息)及错误处理函数(如perror、strerror)。强调了不忽略错误、保持处理一致性及避免过度处理的重要性,并通过文件操作和网络编程实例展示了错误处理的应用。
101 4
|
3月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
99 5
|
3月前
|
网络协议 物联网 数据处理
C语言在网络通信程序实现中的应用,介绍了网络通信的基本概念、C语言的特点及其在网络通信中的优势
本文探讨了C语言在网络通信程序实现中的应用,介绍了网络通信的基本概念、C语言的特点及其在网络通信中的优势。文章详细讲解了使用C语言实现网络通信程序的基本步骤,包括TCP和UDP通信程序的实现,并讨论了关键技术、优化方法及未来发展趋势,旨在帮助读者掌握C语言在网络通信中的应用技巧。
81 2
|
3月前
|
存储 算法 C语言
用C语言开发游戏的实践过程,包括选择游戏类型、设计游戏框架、实现图形界面、游戏逻辑、调整游戏难度、添加音效音乐、性能优化、测试调试等内容
本文探讨了用C语言开发游戏的实践过程,包括选择游戏类型、设计游戏框架、实现图形界面、游戏逻辑、调整游戏难度、添加音效音乐、性能优化、测试调试等内容,旨在为开发者提供全面的指导和灵感。
92 2
|
3月前
|
程序员 C语言
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门。本文深入探讨了指针的基本概念、声明方式、动态内存分配、函数参数传递、指针运算及与数组和函数的关系,强调了正确使用指针的重要性,并鼓励读者通过实践掌握这一关键技能。
72 1
|
3月前
|
C语言
C语言之斗地主游戏
该代码实现了一个简单的斗地主游戏,包括头文件引入、宏定义、颜色枚举、卡牌类、卡牌类型类、卡牌组合类、玩家类、游戏主类以及辅助函数等,涵盖了从牌的生成、分配、玩家操作到游戏流程控制的完整逻辑。
113 8
【C语言】函数递归实现——扫雷小游戏(详细步骤)
【C语言】函数递归实现——扫雷小游戏(详细步骤)
【C语言】函数递归实现——扫雷小游戏(详细步骤)
|
1月前
|
存储 编译器 C语言
【C语言程序设计——函数】分数数列求和2(头歌实践教学平台习题)【合集】
函数首部:按照 C 语言语法,函数的定义首部表明这是一个自定义函数,函数名为fun,它接收一个整型参数n,用于指定要求阶乘的那个数,并且函数的返回值类型为float(在实际中如果阶乘结果数值较大,用float可能会有精度损失,也可以考虑使用double等更合适的数据类型,这里以float为例)。例如:// 函数体代码将放在这里函数体内部变量定义:在函数体中,首先需要定义一些变量来辅助完成阶乘的计算。比如需要定义一个变量(通常为float或double类型,这里假设用float。
36 3
|
1月前
|
存储 算法 安全
【C语言程序设计——函数】分数数列求和1(头歌实践教学平台习题)【合集】
if 语句是最基础的形式,当条件为真时执行其内部的语句块;switch 语句则适用于针对一个表达式的多个固定值进行判断,根据表达式的值与各个 case 后的常量值匹配情况,执行相应 case 分支下的语句,直到遇到 break 语句跳出 switch 结构,若没有匹配值则执行 default 分支(可选)。例如,在判断一个数是否大于 10 的场景中,条件表达式为 “num> 10”,这里的 “num” 是程序中的变量,通过比较其值与 10 的大小关系来确定条件的真假。常量的值必须是唯一的,且在同一个。
20 2

热门文章

最新文章