如何查找存储战舰游戏二维数组的文件中剩余的战舰?
如何实现战舰游戏中剩余战舰的查找操作?
嘿,我来帮你搞定这个剩余战舰查找的问题!其实核心思路特别简单:只要遍历整个棋盘的二维数组,检查是否还存在未被击中的战舰(也就是字符#)就行。下面给你具体的实现方案,完全适配你的C++代码场景:
核心实现思路
我们只需要写一个辅助函数,逐行逐列遍历棋盘的每个单元格:
- 一旦发现某个单元格是
#,说明还有未被摧毁的战舰,直接返回“存在剩余战舰”的结果 - 如果遍历完整张棋盘都没找到
#,就说明所有战舰都被摧毁了
具体代码实现
根据你使用的棋盘存储方式,这里提供两种常见的实现:
1. 使用C++标准库vector<vector<char>>存储棋盘
这是比较推荐的现代C++写法,安全又方便:
#include <vector> #include <iostream> using namespace std; // 检查是否有剩余战舰的函数 bool hasRemainingShips(const vector<vector<char>>& board) { // 遍历每一行 for (const auto& row : board) { // 遍历当前行的每个单元格 for (char cell : row) { if (cell == '#') { return true; // 找到未被击中的战舰,直接返回true } } } return false; // 遍历完没找到,返回false } // 调用示例 int main() { // 假设这里已经从文件读取并初始化了board vector<vector<char>> board = { {'~', '#', '~'}, {'H', '~', '#'}, {'~', '~', '~'} }; if (hasRemainingShips(board)) { cout << "还有战舰存活!继续战斗吧!" << endl; } else { cout << "所有战舰都被摧毁了!游戏结束!" << endl; } return 0; }
2. 使用C风格动态二维数组存储棋盘
如果你的代码里用的是char**这种动态分配的数组,函数可以改成这样:
#include <iostream> using namespace std; // 参数分别是棋盘指针、行数、列数 bool hasRemainingShips(char** board, int rows, int cols) { for (int i = 0; i < rows; ++i) { for (int j = 0; j < cols; ++j) { if (board[i][j] == '#') { return true; } } } return false; } // 调用示例 int main() { // 假设已经动态分配了3行3列的棋盘并初始化 int rows = 3, cols = 3; char** board = new char*[rows]; for (int i = 0; i < rows; ++i) { board[i] = new char[cols]; // 初始化数据 for (int j = 0; j < cols; ++j) { board[i][j] = '~'; } } board[0][1] = '#'; board[1][2] = '#'; if (hasRemainingShips(board, rows, cols)) { cout << "还有战舰存活!继续战斗吧!" << endl; } else { cout << "所有战舰都被摧毁了!游戏结束!" << endl; } // 记得释放动态分配的内存 for (int i = 0; i < rows; ++i) { delete[] board[i]; } delete[] board; return 0; }
使用场景
你可以在每次用户攻击并修改棋盘(把击中的#改成H)之后,调用这个函数来判断游戏是否结束。比如用户输入坐标击中战舰后,先修改棋盘,然后立刻检查是否还有剩余战舰,如果没有就触发游戏结束的逻辑。
内容的提问来源于stack exchange,提问作者throwthedays
相关产品推荐
相关产品推荐

