【C++进阶实战】扫雷小游戏

扫雷游戏

题目描述: 开发一个简单的扫雷游戏,支持以下功能:

  1. 初始化游戏板,随机放置地雷。
  2. 用户选择一个格子进行挖掘。
  3. 如果用户挖到地雷,游戏结束。
  4. 如果用户挖到空格子,显示相邻的空格子。
  5. 用户可以选择标记地雷。
  6. 显示游戏板的状态。
  7. 用户可以选择重新开始游戏或退出游戏。

要求

  1. 使用二维数组来表示游戏板。
  2. 使用随机数生成函数来放置地雷。
  3. 提供友好的用户界面,使用菜单选择功能。

示例代码框架

#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <iomanip>
using namespace std;const int BOARD_SIZE = 10;
const int NUM_MINES = 15;enum CellState {HIDDEN,VISIBLE,FLAGGED
};struct Cell {bool isMine;int mineCount;CellState state;
};class Minesweeper {
private:vector<vector<Cell>> board;int minesLeft;public:Minesweeper() : board(BOARD_SIZE, vector<Cell>(BOARD_SIZE, {false, 0, HIDDEN})), minesLeft(NUM_MINES) {initializeBoard();}void initializeBoard() {srand(time(0));  // 初始化随机数生成器int placedMines = 0;while (placedMines < NUM_MINES) {int x = rand() % BOARD_SIZE;int y = rand() % BOARD_SIZE;if (!board[x][y].isMine) {board[x][y].isMine = true;placedMines++;}}calculateMineCounts();}void calculateMineCounts() {for (int i = 0; i < BOARD_SIZE; ++i) {for (int j = 0; j < BOARD_SIZE; ++j) {if (!board[i][j].isMine) {board[i][j].mineCount = countAdjacentMines(i, j);}}}}int countAdjacentMines(int x, int y) {int count = 0;for (int dx = -1; dx <= 1; ++dx) {for (int dy = -1; dy <= 1; ++dy) {if (dx == 0 && dy == 0) continue;int nx = x + dx;int ny = y + dy;if (nx >= 0 && nx < BOARD_SIZE && ny >= 0 && ny < BOARD_SIZE && board[nx][ny].isMine) {count++;}}}return count;}void displayBoard(bool reveal = false) {cout << "  ";for (int i = 0; i < BOARD_SIZE; ++i) {cout << setw(3) << i;}cout << endl;for (int i = 0; i < BOARD_SIZE; ++i) {cout << i << " ";for (int j = 0; j < BOARD_SIZE; ++j) {if (reveal || board[i][j].state == VISIBLE) {if (board[i][j].isMine) {cout << setw(3) << "*";} else if (board[i][j].mineCount > 0) {cout << setw(3) << board[i][j].mineCount;} else {cout << setw(3) << "-";}} else if (board[i][j].state == FLAGGED) {cout << setw(3) << "F";} else {cout << setw(3) << "#";}}cout << endl;}}bool makeMove(int x, int y) {if (board[x][y].state == VISIBLE) {cout << "该位置已经挖过。\n";return false;}if (board[x][y].isMine) {cout << "游戏结束!你挖到了地雷。\n";displayBoard(true);return true;}revealCells(x, y);return false;}void revealCells(int x, int y) {if (x < 0 || x >= BOARD_SIZE || y < 0 || y >= BOARD_SIZE || board[x][y].state == VISIBLE) {return;}board[x][y].state = VISIBLE;if (board[x][y].mineCount == 0) {for (int dx = -1; dx <= 1; ++dx) {for (int dy = -1; dy <= 1; ++dy) {if (dx == 0 && dy == 0) continue;revealCells(x + dx, y + dy);}}}}void flagCell(int x, int y) {if (board[x][y].state == VISIBLE) {cout << "该位置已经挖过,不能标记。\n";return;}if (board[x][y].state == FLAGGED) {board[x][y].state = HIDDEN;minesLeft++;} else {board[x][y].state = FLAGGED;minesLeft--;}}bool checkWin() {for (int i = 0; i < BOARD_SIZE; ++i) {for (int j = 0; j < BOARD_SIZE; ++j) {if (!board[i][j].isMine && board[i][j].state != VISIBLE) {return false;}}}return true;}
};void showMenu() {cout << "1. 挖掘格子\n";cout << "2. 标记地雷\n";cout << "3. 重新开始游戏\n";cout << "0. 退出游戏\n";
}int main() {Minesweeper game;int choice, x, y;do {game.displayBoard();showMenu();cout << "请选择操作: ";cin >> choice;switch (choice) {case 1:cout << "请输入要挖掘的格子坐标 (x y): ";cin >> x >> y;if (game.makeMove(x, y)) {cout << "游戏结束!\n";choice = 0;} else if (game.checkWin()) {cout << "恭喜你,你赢了!\n";choice = 0;}break;case 2:cout << "请输入要标记的格子坐标 (x y): ";cin >> x >> y;game.flagCell(x, y);break;case 3:game = Minesweeper();cout << "游戏重新开始。\n";break;case 0:cout << "退出游戏。\n";break;default:cout << "无效的选择,请重新输入。\n";}} while (choice != 0);return 0;
}

项目说明

  1. 初始化游戏板

    • initializeBoard 方法随机放置地雷。
    • calculateMineCounts 方法计算每个格子周围地雷的数量。
  2. 显示游戏板

    • displayBoard 方法显示当前游戏板的状态,可以选择是否显示所有地雷。
  3. 用户操作

    • makeMove 方法处理用户的挖掘操作。
    • flagCell 方法处理用户的标记操作。
    • revealCells 方法递归地显示相邻的空格子。
  4. 游戏逻辑

    • checkWin 方法检查用户是否赢得了游戏。
    • 主循环根据用户选择调用相应的功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/60763.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

unity单例模式的不同声明(待完善

总结&#xff1a; 这段代码实现了一个泛型单例模式&#xff08;Singleton Pattern&#xff09;&#xff0c;用于确保某个类&#xff08;由泛型参数 T 指定&#xff09;在整个应用程序中只有一个实例&#xff0c;并且在第一次访问时才创建该实例。该模式保证了该实例的全局唯一…

SpringBoot后端解决跨域问题

1.全局方式 新建一个conifg配置类&#xff0c;内容如下&#xff1a; Configuration public class CorsConfig implements WebMvcConfigurer {Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**")//是否发送Cookie.allowCrede…

群控系统服务端开发模式-应用开发-前端登录接口开发

一、修改验证方法 1、修改验证器 loginRules: {username: [{required: true, trigger: blur, validator: validateUsername}],password: [{required: true, trigger: blur, validator: validatePassword}],captcha_code: [{required: true, trigger: blur, validator: validat…

stream学习

Stream流 定义 Steam流&#xff0c;用于操作集合或者数组中的数据&#xff0c;大量结合了Lamda表达式的语法风格&#xff0c;代码简洁。 重点&#xff1a; 流只能收集一次 ​ 获取Stream流 Stream流要与数据源建立连接。 1.list ​ 直接调用steam()即可 // list List<Stri…

计算机三级 数据库技术

第一章 数据库应用系统开发方法 1.1 数据库应用系统生命周期 软件工程:软件工程的思想&#xff0c;即用工程的概念、原理、技术和方法对软件生产、开发的全过程进行跟踪和管理 软件开发方法:瀑布模型、快速原型模型、螺旋模型 DBAS生命周期模型 1.2 规划与分析 系统规划与定…

YOLOv11实战垃圾分类

本文采用YOLOv11作为核心算法框架&#xff0c;结合PyQt5构建用户界面&#xff0c;使用Python3进行开发。YOLOv11以其高效的特征提取能力&#xff0c;在多个图像分类任务中展现出卓越性能。本研究针对4种垃圾数据集进行训练和优化&#xff0c;该数据集包含丰富的垃圾图像样本&am…

【初阶二】认识C语言—上

【初阶二】认识C语言—上 1.数据类型2.变量3.常量4.字符串5.转义字符6.注释7.选择语句 认识C语言讲的是C语言的基础知识&#xff0c;目的是让大家认识这些知识&#xff0c;后续文章会把这些知识深入讲解&#xff0c;知识点很多&#xff0c;篇幅原因分为上下两篇 1.数据类型 每…

线性DP 区间DP C++

线性DP 题一 数字三角形 解题思路 三角形内的某个点&#xff0c;可以从这个点的左上方或右上方来到这个点&#xff0c;因此有状态转移方程&#xff1a; f[i, j] max(f[i - 1, j - 1] a[i][j], f[i - 1][j] a[i][j]) 代码实现 #include<iostream> #include<algor…

D68【python 接口自动化学习】- python基础之数据库

day68 Python执行SQL语句 学习日期&#xff1a;20241114 学习目标&#xff1a;MySQL数据库-- 137 Python执行SQL语句插入到数据库 学习笔记&#xff1a; commit提交 自动commit 总结 commit提交&#xff1a;pymysql库在执行对数据库有修改操作的行为时&#xff0c;是需要通…

【项目组件】第三方库——websocketpp

目录 第三方协议&#xff1a;websocket websocket简介 websocket特点 websocket协议切换 websocket协议格式段 websocketpp库介绍 endpoint server connection websocketpp库搭建服务器流程 基本框架实现 业务处理回调函数的实现 http_callback open_callback …

超越传统:探索ONLYOFFICE的革命性办公新纪元

目录 &#x1f341;引言 &#x1f341;一、ONLYOFFICE产品简介 &#xff08;一&#xff09;、介绍 &#xff08;二&#xff09;、基本功能简介 &#x1f341;二、核心功能具体介绍 1、编辑操作 2、文本与段落&#xff1a; 3、样式与图形&#xff1a; 4、表格与图表&…

python解析网页上的json数据落地到EXCEL

安装必要的库 import requests import pandas as pd import os import sys import io import urllib3 import json测试数据 网页上的数据结构如下 {"success": true,"code": "CIFM_0000","encode": null,"message": &quo…

115页PDF | 埃森哲_XX集团信息化能力成熟度评估及能力提升方案(限免下载)

一、前言 这份报告是埃森哲_XX集团信息化能力成熟度评估及能力提升方案&#xff0c;报告首先分析了集团的战略规划&#xff0c;包括调整优化期、转型升级期和跨越发展期的目标&#xff0c;然后识别了集团面临的内部挑战和外部压力&#xff0c;如管控体系不完善、业务板块多样化…

PostgreSQL中表的数据量很大且索引过大时怎么办

在PostgreSQL中&#xff0c;当表的数据量很大且索引过大时&#xff0c;可能会导致性能问题。以下是一些优化索引和表数据的方法&#xff1a; 1. 评估和删除不必要的索引 识别未使用的索引&#xff1a;使用pg_stat_user_indexes和pg_index系统视图来查找未被使用的索引&#x…

智谱AI清影升级:引领AI视频进入音效新时代

前几天智谱推出了新清影,该版本支持4k、60帧超高清画质、任意尺寸&#xff0c;并且自带音效的10秒视频,让ai生视频告别了"哑巴时代"。 智谱AI视频腾空出世&#xff0c;可灵遭遇强劲挑战&#xff01;究竟谁是行业翘楚&#xff1f;(附测评案例)之前智谱出世那时体验了一…

7. djang5 官网 polls app (关于管理员站点)

本教程从 第 6 个教程 结束的地方开始。我们将继续开发 web-poll 应用程序&#xff0c;并专注于自定义 Django 自动生成的管理网站&#xff0c;这一点我们在 第 2 个教程 中首次进行了探索。 自定义管理表单 在 polls/admin.py 中修改&#xff1a; from django.contrib impo…

Elasticsearch基本概念及使用

Elasticsearch 是一个开源的、分布式的全文搜索和分析引擎&#xff0c;基于 Apache Lucene 构建。它提供了快速的搜索能力&#xff0c;支持大规模的数据分析&#xff0c;广泛应用于日志分析、全文搜索、监控系统和商业智能等领域。ES操作指令是基于restAPI构建&#xff0c;也就…

无插件H5播放器EasyPlayer.js网页web无插件播放器vue和react详细介绍

EasyPlayer.js H5播放器&#xff0c;是一款能够同时支持HTTP、HTTP-FLV、HLS&#xff08;m3u8&#xff09;、WS、WEBRTC、FMP4视频直播与视频点播等多种协议&#xff0c;支持H.264、H.265、AAC、G711A、Mp3等多种音视频编码格式&#xff0c;支持MSE、WASM、WebCodec等多种解码方…

Ubuntu 的 ROS 操作系统安装与测试

引言 机器人操作系统&#xff08;ROS, Robot Operating System&#xff09;是一个用于开发机器人应用的开源框架&#xff0c;它提供了一系列功能丰富的库和工具&#xff0c;能够帮助开发者构建和控制机器人。 当前&#xff0c;ROS1的最新版本为Noetic Ninjemys&#xff0c;专为…

入门网络安全工程师要学习哪些内容(详细教程)

&#x1f91f; 基于入门网络安全/黑客打造的&#xff1a;&#x1f449;黑客&网络安全入门&进阶学习资源包 大家都知道网络安全行业很火&#xff0c;这个行业因为国家政策趋势正在大力发展&#xff0c;大有可为!但很多人对网络安全工程师还是不了解&#xff0c;不知道网…