怎么只用语言实现扫雷?

简介: 怎么只用语言实现扫雷?

游戏设计的思路



如图9*9的扫雷棋盘

e933c39c9c4541a18cd5813c9c798b06.png


首先我们可以用二维数组来实现对数据的存储,并通过雷与非雷存储的数据的不同加以区分(这里我用的是字符’1‘和’0‘


为了方便我们用两个二维数组,一个用来布置雷,另一个来给玩家展示

这里我们选择用char类型的二维数组

e933c39c9c4541a18cd5813c9c798b06.png


为了防止在统计周围雷的个数时超出数组的范围,如在统计坐标(1,1)的位置时,上面和左边就越界了,所以我们可以用11*11的二维数组,然后给玩家显示9*9的棋盘。


代码的实现:



(前面是部分代码的实现,最后有完整的代码)


1.游戏进入是菜单的打印:


代码

void menu()
{
  printf("-------------------\n");
  printf("*******************\n");
  printf("******1.play*******\n");
  printf("*******************\n");
  printf("******0.exit*******\n");
  printf("*******************\n");
  printf("-------------------\n");
}
int main()
{
  srand((unsigned int)time(NULL));
  int input = 0;
  do
  {
    menu();//打印菜单
    printf("请输入你的选择:> \n");
    scanf("%d", &input);
    switch (input)
    {
    case 1:
      game();
      break;
    case 0:
      printf("退出游戏\n");
      break;
    default:
      printf("输入错误,请重新选择\n");
      break;
    }
  } while (input);
  return 0;
}

a4e7b829a97c454eb929c7e98ac59c32.png


2.数组的创建与初始化:


代码:

//存放布置好的的雷
char Mine[ROWS][COLS];
//存放排查好的雷
char Show[ROWS][COLS];
//初始化棋盘
//Mine 最开始全部放'0'
//Show 最开始全部放'*'
InitBoard(Mine, ROWS, COLS,'0');
InitBoard(Show, ROWS, COLS,'*');
void InitBoard(char Board[ROWS][COLS], int rows, int cols, char set)
{
  int i = 0;
  for (i = 0; i < rows; i++)
  {
    int j = 0;
    for (j = 0; j < cols; j++)
    {
      Board[i][j] = set;
    }
  }
}


3.棋盘的打印


代码:

//打印棋盘
void DisplayBoard(char Board[ROWS][COLS], int row, int col)
{
  int i = 0;
  printf("------扫雷游戏-----\n");
  for (i = 0; i <= col; ++i)
  {
    printf("%d ", i);
  }
  printf("\n");
  for (i = 1; i <= row; i++)
  {
    printf("%d ",i);
    int j = 0;
    for (j = 1; j <= col; j++)
    {
      printf("%c ",Board[i][j]);
    }
    printf("\n");
  }
}

6a1cdfdbe96c4960904c95d3312fdba1.png


4.布置雷(这里简单点,用时间戳,电脑实随机布置10个,如下图运行结果中的字符  ’1‘ )


代码:

//布置雷
void SetMine(char Board[ROWS][COLS], int row, int col)
{
  int count = MineCount;
  while (count)
  {
    int x = rand() % row + 1;
    int y = rand() % col + 1;
    if (Board[x][y] == '0')
    {
      Board[x][y] = '1';
      count--;
    }
  }
}

004fede7fc3a46b796e7b311f827ba11.png


5.排雷的实现


代码:

//排雷
int CountMine(char Mine[ROWS][COLS],int x,int y)
{
  return (Mine[x-1][y-1]+ Mine[x-1][y]+ Mine[x-1][y+1]+ Mine[x][y-1]
    +Mine[x][y+1]+ Mine[x+1][y-1]+Mine[x+1][y]+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 = ROW*COL-MineCount;
  while (Win>0)
  {
    printf("请输入你要排查雷的坐标:>\n");
    scanf("%d %d",&x,&y);
    if (x >= 1 && x <= row && y >= 1 && y <= col)
    {
      if (Mine[x][y] == '1')
      {
        printf("你被炸死了,游戏结束\n");
        DisplayBoard(Mine, ROW, COL);
        break;
      }
      else
      {
        int count = CountMine(Mine, x, y);
        Show[x][y] = count + '0';
        DisplayBoard(Show, ROW, COL);
        Win--;
      }
    }
    else
    {
      printf("输入坐标已超出棋盘,请吃重新输入\n");
    }
  }
  if (Win == 0)
  {
    printf("恭喜你,赢了\n");
    DisplayBoard(Mine, ROW, COL);
  }
}


完整代码:



1.游戏函数的申明


Game.h文件

//Game.h文件
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 9
#define COL 9
#define MineCount 10
#define ROWS ROW+2
#define COLS COL+2
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);


2.游戏函数的实现


Game.c 文件

1. ///Game.c文件
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
//初始化棋盘
void InitBoard(char Board[ROWS][COLS], int rows, int cols, char set)
{
  int i = 0;
  for (i = 0; i < rows; i++)
  {
    int j = 0;
    for (j = 0; j < cols; j++)
    {
      Board[i][j] = set ;
    }
  }
}
//打印棋盘
void DisplayBoard(char Board[ROWS][COLS], int row, int col)
{
  int i = 0;
  printf("------扫雷游戏-----\n");
  for (i = 0; i <= col; ++i)
  {
    printf("%d ", i);
  }
  printf("\n");
  for (i = 1; i <= row; i++)
  {
    printf("%d ",i);
    int j = 0;
    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 = MineCount;
  while (count)
  {
    int x = rand() % row + 1;
    int y = rand() % col + 1;
    if (Board[x][y] == '0')
    {
      Board[x][y] = '1';
      count--;
    }
  }
}
//排雷
int CountMine(char Mine[ROWS][COLS],int x,int y)
{
  return (Mine[x-1][y-1]+ Mine[x-1][y]+ Mine[x-1][y+1]+ Mine[x][y-1]
    +Mine[x][y+1]+ Mine[x+1][y-1]+Mine[x+1][y]+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 = ROW*COL-MineCount;
  while (Win>0)
  {
    printf("请输入你要排查雷的坐标:>\n");
    scanf("%d %d", &x, &y);
    if (x >= 1 && x <= row && y >= 1 && y <= col)
    {
      if (Mine[x][y] == '1')
      {
        printf("你被炸死了,游戏结束\n");
        DisplayBoard(Mine, ROW, COL);
        break;
      }
      else
      {
        int count = CountMine(Mine, x, y);
        Show[x][y] = count + '0';
        DisplayBoard(Show, ROW, COL);
        Win--;
      }
    }
    else
    {
      printf("输入坐标已超出棋盘,请吃重新输入\n");
    }
  }
  if (Win == 0)
  {
    printf("恭喜你,赢了\n");
    DisplayBoard(Mine, ROW, COL);
  }


3.游戏代码实现


test.c文件

//test.c文件
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void menu()
{
  printf("-------------------\n");
  printf("*******************\n");
  printf("******1.play*******\n");
  printf("*******************\n");
  printf("******0.exit*******\n");
  printf("*******************\n");
  printf("-------------------\n");
}
void game()
{
  //存放布置好的的雷
  char Mine[ROWS][COLS];
  //存放排查好的雷
  char Show[ROWS][COLS];
  //初始化棋盘
  //Mine 最开始全部放'0'
  //Show 最开始全部放'*'
  InitBoard(Mine, ROWS, COLS, '0');
  InitBoard(Show, ROWS, COLS, '*');
  //打印棋盘
  DisplayBoard(Mine, ROW, COL);
  DisplayBoard(Show, ROW, COL);
  //布置雷,有雷放'1'
  SetMine(Mine,ROW,COL);
  DisplayBoard(Mine, ROW, COL);
  排雷
  //FindMine(Mine,Show,ROW,COL);
}
int main()
{
  srand((unsigned int)time(NULL));
  int input = 0;
  do
  {
    menu();//打印菜单
    printf("请输入你的选择:> \n");
    scanf("%d", &input);
    switch (input)
    {
    case 1:
      game();
      break;
    case 0:
      printf("退出游戏\n");
      break;
    default:
      printf("输入错误,请重新选择\n");
      break;
    }
  } while (input);
  return 0;
}
目录
相关文章
|
设计模式 编解码 C++
【ffmpeg 视频播放】深入探索:ffmpeg视频播放优化策略与设计模式的实践应用(一)
【ffmpeg 视频播放】深入探索:ffmpeg视频播放优化策略与设计模式的实践应用
358 0
|
存储 SQL 算法
Mysql进阶索引篇02——InnoDB存储引擎的数据存储结构(一)
前面我们已经剖析了mysql中InnoDB与MyISAM索引的数据结构,了解了B+树的设计思想、原理,并且介绍了B+树与Hash结构、平衡二叉树、AVL树、B树等的区别和实际应用场景。 页和页之间并不一定在物理上相连,只是在逻辑上使用双向链表关联。指针、记录究竟是如何存储的呢?其实这就需要联系我们之前提到的行格式了。数据查找在页目录中二分法快速定位到槽,上面的过程都与页的内部结构相关,本文将详细的阐述。
Mysql进阶索引篇02——InnoDB存储引擎的数据存储结构(一)
|
7月前
|
安全 Unix 虚拟化
Windows 7 & Windows Server 2008 R2 简体中文版下载 (2025 年 2 月更新)
Windows 7 & Windows Server 2008 R2 简体中文版下载 (2025 年 2 月更新)
244 11
Windows 7 & Windows Server 2008 R2 简体中文版下载 (2025 年 2 月更新)
|
JSON C++ 数据格式
【Python 基础教程 08】全面入门到精通:Python3 字符串操作实战教程与深度指南
【Python 基础教程 08】全面入门到精通:Python3 字符串操作实战教程与深度指南
277 0
|
11月前
|
存储 监控 API
史上最全最完整,最详细,软件保护技术-程序脱壳篇-逆向工程学习记录(二)
本文详细介绍了软件保护技术中的程序脱壳过程,包括IAT(导入地址表)的重建、OD(OllyDbg)跟踪输入表、HOOK-API技术以及FSG、UPX和WinUpacx等常见压缩壳的加脱壳方法。文章通过具体实例和详细步骤,帮助读者理解并掌握逆向工程的基本技巧。[原文链接](https://developer.aliyun.com/article/1618653)
291 0
|
前端开发 Linux 网络安全
在Linux中,如何配置防火墙?
在Linux中,如何配置防火墙?
|
Web App开发 JavaScript 前端开发
JavaScript——定时器为什么是不精确的
JavaScript——定时器为什么是不精确的
162 0
|
机器学习/深度学习 人工智能 自然语言处理
人工智能浪潮下的自然语言处理技术演进
本文从自然语言处理(NLP)技术的历史发展出发,深入剖析了在人工智能(AI)大潮中该领域的创新突破。我们将探讨深度学习如何推动语言模型的革新、多语言处理技术的发展,以及机器翻译和语音识别的最新进展。文章还将讨论这些技术进步如何影响社会,并展望未来NLP技术的潜力与挑战。
372 0
|
前端开发 JavaScript C++
深入探索WebAssembly在前端性能优化中的应用
随着Web应用的功能越来越复杂,传统的JavaScript解释执行模式已经逐渐成为性能瓶颈。本文将介绍WebAssembly(以下简称Wasm)的基本概念、优势以及如何在现代Web开发中利用Wasm提升前端性能。我们将通过实际案例分析Wasm在处理高性能计算任务时相比JavaScript的优势,并探讨如何将Wasm集成到现有的前端项目中,以实现无缝的性能优化。本文旨在为前端开发者提供一个全面的Wasm应用指南,帮助他们充分利用这一新技术,提升Web应用的响应速度和用户体验。
357 0
|
机器学习/深度学习 人工智能 算法
AI图生成技术:从随机噪声到逼真图像
在人工智能的快速发展中,图像生成是一个备受关注的研究领域。AI图生成技术通过训练深度神经网络来生成逼真的图像,为我们提供了许多有趣的应用场景,如风格转换、图像修复和虚拟现实等。本篇博客将介绍一种基于随机噪声的AI图生成技术,并探讨其背后的原理和应用。
721 1