You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查找存储战舰游戏二维数组的文件中剩余的战舰?

如何实现战舰游戏中剩余战舰的查找操作?

嘿,我来帮你搞定这个剩余战舰查找的问题!其实核心思路特别简单:只要遍历整个棋盘的二维数组,检查是否还存在未被击中的战舰(也就是字符#)就行。下面给你具体的实现方案,完全适配你的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:01:07