当前位置: 首页 > news >正文

C语言扫雷小游戏

以下是一个简单的C语言扫雷小游戏的示例代码:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #define BOARD_SIZE 10
  5. #define NUM_MINES 10
  6. int main() {
  7.     int board[BOARD_SIZE][BOARD_SIZE];
  8.     int num_flags, num_clicks;
  9.     int row, col;
  10.     int reveal[BOARD_SIZE][BOARD_SIZE];
  11.     int mines_left;
  12.     int won;
  13.     char action;
  14.     srand(time(NULL)); // 初始化随机数生成器
  15.     // 初始化雷区,标记雷区中的雷数和未标记的雷数
  16.     for (int i = 0; i < BOARD_SIZE; i++) {
  17.         for (int j = 0; j < BOARD_SIZE; j++) {
  18.             board[i][j] = 0; // 初始化为空格
  19.             reveal[i][j] = 0; // 初始化为未揭示状态
  20.         }
  21.     }
  22.     num_flags = 0; // 初始化为未标记的雷数为0
  23.     mines_left = NUM_MINES; // 初始化为还有NUM_MINES个雷未被标记
  24.     won = 0; // 初始化为游戏未获胜状态
  25.     // 在随机位置放置雷区中的雷
  26.     while (mines_left > 0) {
  27.         row = rand() % BOARD_SIZE; // 随机选择行号
  28.         col = rand() % BOARD_SIZE; // 随机选择列号
  29.         if (board[row][col] != -1) { // 如果该位置不是已经被标记为雷的位置,则将该位置标记为雷,并更新mines_left和board数组
  30.             board[row][col] = -1;
  31.             mines_left--;
  32.         } else { // 如果该位置已经被标记为雷,则重新选择位置
  33.             continue;
  34.         }
  35.         num_flags++; // 更新已标记的雷数
  36.     }
  37.     // 游戏主循环,直到游戏获胜或玩家选择退出游戏为止
  38.     while (1) {
  39.         printf("\n\n"); // 输出一个空行,使输出更清晰
  40.         printf("Minefield:\n"); // 输出雷区名称和当前已标记的雷数和剩余的雷数
  41.         printf("F-revealed, flags: %d/%d\n", num_flags, BOARD_SIZE * BOARD_SIZE); // 输出已揭示的方块数和总方块数
  42.         printf("C-click, Q-quit, X-flag\n"); // 输出操作提示信息,C表示点击方块,Q表示退出游戏,X表示标记方块为雷
  43.         printf("\n"); // 输出一个空行,使输出更清晰
  44.         for (int i = 0; i < BOARD_SIZE; i++) { // 输出雷区表格,0表示空格,-1表示雷,'#'表示已揭示的雷,'.'表示未揭示的空格,'F'表示已标记的雷
  45.             for (int j = 0; j < BOARD_SIZE; j++) {
  46.                 if (board[i][j] == -1) { // 如果该位置是雷,则输出'#'并更新reveal数组中对应位置的状态为1(已揭示)和更新num_flags和num_clicks的值(点击了已揭示的雷)
  47.                     printf("#");
  48.                     reveal[i][j] = 1; // 将该位置揭示为雷区中的雷

示),否则输出board[i][j]的值(0或-1)

        }

    }

    printf("\n"); // 输出一个空行,使输出更清晰

    scanf(" %c", &action); // 获取玩家操作

    if (action == 'c') { // 如果玩家选择点击方块

        printf("Click: ");

        scanf("%d %d", &row, &col); // 获取玩家点击的方块位置

        if (board[row][col] == 0) { // 如果该位置是空格,则将该位置揭示为雷或空格,并输出相应信息

            board[row][col] = 1;

            reveal[row][col] = 1;

            if (num_clicks == BOARD_SIZE * BOARD_SIZE - mines_left) { // 如果玩家已经点击了所有非雷的方块,则游戏获胜,跳出循环

                won = 1;

                break;

            }

        } else if (board[row][col] == -1) { // 如果该位置是雷,则游戏失败,跳出循环

            won = -1;

            break;

        } else { // 如果该位置已经被揭示为雷或空格,则不进行任何操作,继续等待玩家输入下一个操作

            continue;

        }

        num_clicks++; // 更新已点击的方块数

    } else if (action == 'q') { // 如果玩家选择退出游戏,则跳出循环

        won = 0;

        break;

    } else if (action == 'x') { // 如果玩家选择标记方块为雷

        printf("Flag: ");

        scanf("%d %d", &row, &col); // 获取玩家标记的方块位置

        if (board[row][col] != -1 && reveal[row][col] == 0) { // 如果该位置是空格且未被揭示,则将该位置标记为雷,并输出相应信息

            board[row][col] = -1;

            reveal[row][col] = 1;

            num_flags++; // 更新已标记的雷数

        } else { // 如果该位置是雷或已经被揭示,则不进行任何操作,继续等待玩家输入下一个操作

            continue;

        }

    } else { // 如果玩家输入的操作不是合法的,则提示玩家重新输入,并等待一段时间后自动回到游戏主循环开始下一轮操作

        printf("Invalid action. Please try again.\n");

        usleep(1000000); // 等待一段时间,使程序运行更流畅,避免频繁输入导致程序卡顿

        continue;

    }

    if (won != 0) { // 如果游戏获胜或失败,输出相应信息,并等待一段时间后自动退出程序

        printf("Game over! You %s!\n", won == 1 ? "won" : "lost");

        usleep(1000000); // 等待一段时间,使程序运行更流畅,避免频繁输入导致程序卡顿

        break;

    }

}

这段代码实现了基本的扫雷游戏逻辑,玩家可以通过输入“C”来点击方块,输入“Q”来退出游戏,输入“X”来标记方块为雷。点击空格会揭示该位置为雷或空格,点击雷会导致游戏失败。当玩家已经点击了所有非雷的方块时,游戏获胜。游戏过程中,会随机生成雷区中的雷,并提示玩家当前已标记的雷数和剩余的雷数。当游戏结束后,会输出游戏结果。

注意,该代码仅供参考,可以根据需要进行修改和优化。同时,还需要考虑一些边界情况和错误处理,以确保程序的正确性和健壮性。

确实,这个简单的扫雷实现还没有包含一些高级功能,比如:无法标记已经被标记为雷的方块,没有提供撤销操作,游戏结束后无法重新开始等。同时,这个程序也没有处理输入错误的情况,比如:玩家输入了无效的操作。

下面是对这段代码的一些改进建议:

  1. 增加错误处理:当玩家输入了无效的操作时,程序应该能够捕获这个错误,并提示玩家重新输入。可以使用switch语句来处理不同的操作。
  2. 添加撤销操作:玩家应该有机会撤销他们最近的点击或标记操作。这可以通过在boardreveal数组中相应地更新来实现。
  3. 防止重复标记:玩家不应该能够标记已经被标记为雷的方块。可以在标记操作中增加一个检查,以确保玩家没有标记已经被标记的方块。
  4. 增加游戏结束后的选项:游戏结束后,玩家可以选择退出或者重新开始游戏。可以通过添加一个全局变量来跟踪游戏的状态,并在游戏结束后询问玩家的意愿。
  5. 优化布局和输出:当前的输出布局可能会有些混乱,特别是当游戏的规模变得很大的时候。可以考虑使用表格或者其他格式来更清晰地显示游戏状态。
  6. 增加难度等级:可以根据玩家的表现来调整游戏的难度,比如:随机生成更多的雷,或者增加每轮的操作次数等。
  7. 增加音效和图形界面:为了使游戏更加吸引人,可以添加音效和图形界面。这可能需要使用额外的库,比如:SDL或者Allegro。

这些只是一些基本的改进建议,你可以根据自己的需求和喜好来调整这个程序。

相关文章:

C语言扫雷小游戏

以下是一个简单的C语言扫雷小游戏的示例代码&#xff1a; #include <stdio.h>#include <stdlib.h>#include <time.h>#define BOARD_SIZE 10#define NUM_MINES 10int main() { int board[BOARD_SIZE][BOARD_SIZE]; int num_flags, num_clicks; int …...

用取样思想一探AIX上进程性能瓶颈

本篇文章也是我在解决客户问题时的一些思路&#xff0c;希望对读者有用。 本文与GDB也与DBX&#xff08;AIX上的调试工具&#xff09;无关&#xff0c;只是用到了前文《GDB技巧》中的思想&#xff1a;取样思想 客户问题&#xff1a; 原始问题是磁盘被占满了&#xff0c;通过…...

分布式搜索引擎elasticsearch(二)

1.DSL查询文档 elasticsearch的查询依然是基于JSON风格的DSL来实现的。 1.1.DSL查询分类 Elasticsearch提供了基于JSON的DSL(Domain Specific Language)来定义查询。常见的查询类型包括: 查询所有:查询出所有数据,一般测试用。例如:match_all 全文检索(full text)查…...

Tecplot绘制涡结构(Q准则)

文章目录 目的步骤1步骤2步骤3步骤4步骤5步骤6结果 目的 Tecplot绘制涡结构(Q准则判别)并用温度进行染色 Q准则计算公式 步骤1 步骤2 步骤3 步骤4 步骤5 步骤6 结果...

Whisper

文章目录 使后感Paper Review个人觉得有趣的Log Mel spectrogram & STFT Trainingcross-attention输入cross-attention输出positional encoding数据 Decoding为什么可以有时间戳的信息 Test code 使后感 因为运用里需要考虑到时效和准确性&#xff0c;类似于YOLO&#xff…...

Android系统分析

Android工程师进阶第八课 AMS、WMS和PMS 一、Binder通信 【Android Framework系列】第2章 Binder机制大全_android binder-CSDN博客 Android Binder机制浅谈以及使用Binder进行跨进程通信的俩种方式&#xff08;AIDL以及直接利用Binder的transact方法实现&#xff09;_bind…...

五、关闭三台虚拟机的防火墙和Selinux

目录 1、关闭每台虚拟机的防火墙 2、关闭每台虚拟机的Selinux 2.1 什么是SELinux...

【从零开始学习Redis | 第六篇】爆改Setnx实现分布式锁

前言&#xff1a; 在Java后端业务中&#xff0c; 如果我们开启了均衡负载模式&#xff0c;也就是多台服务器处理前端的请求&#xff0c;就会产生一个问题&#xff1a;多台服务器就会有多个JVM&#xff0c;多个JVM就会导致服务器集群下的并发问题。我们在这里提出的解决思路是把…...

Kubernetes学习笔记-Part.05 基础环境准备

目录 Part.01 Kubernets与docker Part.02 Docker版本 Part.03 Kubernetes原理 Part.04 资源规划 Part.05 基础环境准备 Part.06 Docker安装 Part.07 Harbor搭建 Part.08 K8s环境安装 Part.09 K8s集群构建 Part.10 容器回退 第五章 基础环境准备 5.1.SSH免密登录 在master01、…...

语义分割 DeepLab V1网络学习笔记 (附代码)

论文地址&#xff1a;https://arxiv.org/abs/1412.7062 代码地址&#xff1a;GitHub - TheLegendAli/DeepLab-Context 1.是什么&#xff1f; DeepLab V1是一种基于VGG模型的语义分割模型&#xff0c;它使用了空洞卷积和全连接条件随机&#xff08;CRF&#xff09;来提高分割…...

java设计模式学习之【建造者模式】

文章目录 引言建造者模式简介定义与用途实现方式&#xff1a; 使用场景优势与劣势建造者模式在spring中的应用CD&#xff08;光盘&#xff09;的模拟示例UML 订单系统的模拟示例UML 代码地址 引言 建造者模式在创建复杂对象时展现出其强大的能力&#xff0c;特别是当这些对象需…...

Spring Boot中的RabbitMQ死信队列魔法:从异常到延迟,一网打尽【RabbitMQ实战 一】

Spring Boot中的RabbitMQ死信队列魔法&#xff1a;从异常到延迟&#xff0c;一网打尽 前言第一&#xff1a;基础整合实现第二&#xff1a;处理消息消费异常第三&#xff1a;实现延迟消息处理第四&#xff1a;优雅的消息重试机制第五&#xff1a;异步处理超时消息第六&#xff1…...

nrm : 镜像源工具npm镜像切换

nrm命令 安装nrm&#xff1a;npm i -g nrm 查看镜像源&#xff1a;nrm ls&#xff0c;带*号的为当前使用的源 添加新镜像&#xff1a;nrm add [镜像源名称] <源的URL路径> 切换镜像源&#xff1a;nrm use [镜像源名称] 删除一个镜像源&#xff1a;nrm del [镜像源名称] …...

Star 10.4k!推荐一款国产跨平台、轻量级的文本编辑器,内置代码对比功能

notepad 相信大家从学习这一行就开始用了&#xff0c;它是开发者/互联网行业的上班族使用率最高的一款轻量级文本编辑器。但是它只能在Windows上进行使用&#xff0c;而且正常来说是收费的&#xff08;虽然用的是pj的&#xff09;。 对于想在MacOS、Linux上想使用&#xff0c;…...

iOS 17.2:可以修改消息提示音了

时隔2周之后&#xff0c;苹果今日为开发者预览版用户推送了iOS 17.2 Beta4测试版的更新&#xff0c;已经注册Apple Beta版软件计划的用户只需打开设置--通用--软件更新即可在线OTA升级至最新的iOS 17.2测试版。 本次更新包大小为590M左右&#xff0c;内部版本号为&#xff08;…...

PTA 一维数组7-3出生年(本题请你根据要求,自动填充“我出生于y年,直到x岁才遇到n个数字都不相同的年份”这句话)

以上是新浪微博中一奇葩贴&#xff1a;“我出生于1988年&#xff0c;直到25岁才遇到4个数字都不相同的年份。”也就是说&#xff0c;直到2013年才达到“4个数字都不相同”的要求。本题请你根据要求&#xff0c;自动填充“我出生于y年&#xff0c;直到x岁才遇到n个数字都不相同的…...

【3】基于多设计模式下的同步异步日志系统-设计模式

详细介绍设计模式 单例模式 ⼀个类只能创建⼀个对象&#xff0c;即单例模式&#xff0c;该设计模式可以保证系统中该类只有⼀个实例&#xff0c;并提供⼀个访问它的全局访问点&#xff0c;该实例被所有程序模块共享。⽐如在某个服务器程序中&#xff0c;该服务器的配置信息存放…...

Metasploit的使用和配置

预计更新 第一章 Metasploit的使用和配置 1.1 安装和配置Metasploit 1.2 Metasploit的基础命令和选项 1.3 高级选项和配置 第二章 渗透测试的漏洞利用和攻击方法 1.1 渗透测试中常见的漏洞类型和利用方法 1.2 Metasploit的漏洞利用模块和选项 1.3 模块编写和自定义 第三章 Me…...

测试用例的设计思路

接到提测单后要做的事情&#xff1a; 测试准备阶段 确认提测单内包含的文件、URL地址可以访问确认需求 (迭代目标、用户故事、用户愿望、问题反馈等)确认回归测试范围、更新测试范围、新增测试范围编写测试点思维导图&#xff0c;过程中有问题及时进行沟通与迭代相关人员约一个…...

HCIP——交换综合实验

一、实验拓扑图 二、实验需求 1、PC1和PC3所在接口为access&#xff0c;属于vlan2&#xff1b;PC2/4/5/6处于同一网段&#xff0c;其中PC2可以访问PC4/5/6&#xff1b;但PC4可以访问PC5&#xff0c;不能访问PC6 2、PC5不能访问PC6 3、PC1/3与PC2/4/5/6/不在同一网段 4、所有PC通…...

大学生如何搭建自己的网站

这篇是我在大一的时候&#xff0c;写过的一篇文章。 前言 作为一名大学生&#xff0c;我觉得搭建个人网站很有意义。 这篇博客讲述的是这个寒假&#xff0c;我是如何从零到搭建好个人网站的过程。我提供的主要是具体的思路&#xff0c;也附带了一些零零散散的细节。时间跨度…...

linux 路由表的优先级

[rootlocalhost cc]# ip rule list 0: from all lookup local 32765: from 10.0.19.24 lookup 4096 32766: from all lookup main 32767: from all lookup default 现在有 4 条路由规则&#xff0c;优先级是怎样的&#xff0c;0 代表最低优先级还是最高优先级 在 Linux 的 IP …...

毕业项目分享

大家好&#xff0c;今天给大家分享112个有趣的Python实战项目&#xff0c;可以直接拿来实战练习&#xff0c;涵盖机器学习、爬虫、数据分析、数据可视化、大数据等内容&#xff0c;建议关注、收藏。 项目名称 主要技术 2023招聘数据分析可视化系统爬虫 7种薪资预测模型 Flas…...

Android启动系列之进程杀手--lmkd

本文概要 这是Android系统启动的第三篇文章&#xff0c;本文以自述的方式来讲解lmkd进程&#xff0c;通过本文您将了解到lmkd进程在安卓系统中存在的意义&#xff0c;以及它是如何杀进程的。&#xff08;文中的代码是基于android13&#xff09; 我是谁 init&#xff1a;“大…...

tex中的边框

文章目录 利用tcolorbox宏包给公式加框 利用tcolorbox宏包 tcolorbox可以创建一个盒子的环境&#xff0c;例如&#xff1a; \documentclass{article} \usepackage{tcolorbox} \begin{document}\begin{tcolorbox}[left1cm, right1cm, top0.5cm, bottom0.5cm,colbackblue!10!wh…...

面试题库之JAVA基础篇(三)

final 被final修饰的类不可以被继承。被final修改的方法不可以被重写。被final修改的方法&#xff0c;jvm会尝试内联&#xff0c;以提高运行效率。被final修改的变量不可变&#xff0c;如果修改的是引用&#xff0c;那么引用不可变&#xff0c;引用指向的对象内容可变。被fin…...

CTF-虚拟机-QEMU-前置知识-操作流程与源码阅读

文章目录 总览内存PCI设备PCI配置空间前64个字节对应源码Memorry空间的BARIO空间的BAR MMIOPMIOIspci访问PCI设备配置空间中的Memory空间和IO空间MMIOPMIO QQM&#xff08;qemu object model&#xff09;简洁概要将 TypeInfo 注册 TypeImpl&#xff1a;ObjectClass的初始化&…...

java成神秘籍第一卷

前言 适合还没有入行小白学习&#xff0c;有些朋友会跑来问我这行的一些问题&#xff0c;下面算是详细系统的整理了一下啦。 全当是学习 复盘 整理 记录了 java成神秘籍第一卷 前言一 前提1 要不要考公&#xff0c;考编&#xff0c;考研2 语言选择3 就业岗位4 目标5 考不考虑…...

golang实现文件上传(高并发+分块+断点续传+加密)

运行视频 // todo 根据前端传递文件加密 func (s *FileProcess) FileProcessEncryptionByFront(file multipart.File, h *multipart.FileHeader) interface{} { //根据字节直接处理文件 这个是前端传递的二进制流s.FileProcessInit() //文件初始化 设置原来文件…...

用HeidiSQL在MySQL中新建用户

用HeidiSQL登录到MySQL数据库&#xff0c;注意登录的时候要使用有权限的用户&#xff1a; 选择工具-》用户管理&#xff1a; 点击左上角的“添加”&#xff1a; 输入用户名、密码&#xff0c;并且分配权限&#xff1a; 点击右边的“添加对象”&#xff1a; 可以根据自己…...

互联网网站 权限/上海最专业的seo公司

百度 紫光 大疆 爱奇艺 科大讯飞 cvte 蔚来 大华 乐鑫 联发科 20道选择&#xff0c;3道编程 注&#xff1a;以下为个人认为笔试中较难的题目和涉及的知识点 (1)KMP算法&#xff0c;哈夫曼编码&#xff1f; (2)sed指令 (3)二叉排序树 (4)双亲表示法 (5)平均有效内存访问时间…...

做个商城网站要多少钱/杭州推广系统

问题截图&#xff1a; 添加#include<sys/mman.h>头文件可解决’PROT_WRITE’、‘MAP_SHARED’、未定义的问题。 现在还剩O_RDRW未定义的问题。 我再想想吧 先(~ ~) 这问题出现的原因是对应库文件的缺失&#xff0c;添加相应的库文件即可&#xff0c;但是我查了查资料后…...

大淘客网站推广位怎么做/制作网站的平台

1、普通索引(加快对数据的访问速度) –直接创建索引(length表示使用名称前1ength个字符)create index index_name on table_name(字段名(length))–修改表结构的方式添加索引alter table table_name add index index_name on (字段名(length))–删除索引 drop index index_name…...

凡科网做网站怎么样/英文外链平台

VB.NET中对于表格数据的显示经常使用到DataGridView控件&#xff0c;其以丰富多样的数据表呈现形式被程序猿喜爱。本人在做一个小系统中运用DataGridView控件的部分属性&#xff0c;这些功能的使用在使用之初比較不易去理清&#xff0c;随着系统接近尾声&#xff0c;如今对一些…...

苏州网站开发的企业/百度竞价价格查询

原作AlunE, 链接&#xff1a;https://blog.51cto.com/alun51cto/2423000在django项目中, 一个工程中存在多个APP应用很常见&#xff1b;有时候希望不同的APP连接不同的数据库&#xff0c;这个时候需要建立多个数据库连接。默认数据库设置在Django的setting中使用DATABASES设置定…...

南京网站建设推广/网站关键词排名外包

背景 服务端程序出了问题&#xff0c;大概知道问题出现的位置&#xff0c;但是如用单元测试用例&#xff0c;则整个服务流程太长&#xff0c;并且本地不一定会出现服务端的错误&#xff0c;为方便调试&#xff0c;需要在本地调试时使用服务端一样的参数 方法 方法1&#xff1a;…...