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

C++俄罗斯方块Piece Constructor类:如何返回指定方块数组

解决俄罗斯方块Piece Constructor返回指定方块数组的问题

首先,咱们先拆解下你代码里的两个核心问题:

  1. 返回类型不匹配:你的colocarFicha函数声明返回int,但你试图返回的是一个5×5的二维数组,这在C++里直接编译失败。
  2. 局部数组生命周期问题:你定义的Pieces是函数内的局部变量,函数执行结束后这块内存会被系统回收,直接返回它的地址会导致悬空指针,后续访问会出现未定义行为。

下面给你两种可行的解决方案,从偏C风格到现代C++风格都有:

方案一:静态数组 + 数组指针返回(偏C风格)

这种写法适合习惯C语言语法的场景,通过static延长数组生命周期,同时修改函数返回类型匹配二维数组:

#include "PieceCreator.h"
#include <ctime> // 别忘了引入time头文件,不然srand会报错

// 修改返回类型为「指向包含5个int元素的数组的指针」
int (*PCreator::colocarFicha())[5] {
    // 加static让数组存储在静态内存区,函数结束后不会被销毁
    static int Pieces[6][5][5] = {
        { {0,0,0,0,0}, {0,0,0,0,0}, {1,1,1,1,1}, {0,0,0,0,0}, {0,0,0,0,0} },
        { {0,0,0,0,0}, {1,0,0,0,0}, {1,1,1,1,1}, {0,0,0,0,0}, {0,0,0,0,0} },
        { {0,0,0,0,0}, {0,0,0,0,0}, {1,1,1,1,1}, {0,0,0,0,0}, {0,0,0,0,0} },
        { {0,0,0,0,0}, {0,1,1,0,0}, {0,1,1,0,0}, {0,0,0,0,0}, {0,0,0,0,0} },
        { {0,0,0,0,0}, {0,1,1,0,0}, {1,1,0,0,0}, {0,0,0,0,0}, {0,0,0,0,0} },
        { {0,0,0,0,0}, {1,1,0,0,0}, {0,1,1,0,0}, {0,0,0,0,0}, {0,0,0,0,0} }
    };

    srand((int)time(0));
    int randNum = rand() % 6; // 你定义了6个方块,要取0-5的索引,所以是%6不是%5
    return Pieces[randNum]; // 返回随机选中的方块数组,指定索引的话直接写Pieces[2]即可
}

关键说明:

  • static关键字让Pieces的生命周期贯穿整个程序,避免函数结束后内存被回收。
  • 返回类型int (*)[5]是C语言里用来表示二维数组指针的写法,完美匹配你要返回的5×5数组类型。

方案二:使用std::array(现代C++推荐)

如果你的项目基于C++11及以上版本,更推荐用std::array来管理数组,它支持值语义,直接返回即可,完全不用操心指针和生命周期的问题:

#include "PieceCreator.h"
#include <ctime>
#include <array> // 引入std::array的头文件

// 返回类型直接写成二维std::array
std::array<std::array<int,5>,5> PCreator::colocarFicha() {
    static std::array<std::array<std::array<int,5>,5>,6> Pieces = {{
        {{0,0,0,0,0}, {0,0,0,0,0}, {1,1,1,1,1}, {0,0,0,0,0}, {0,0,0,0,0}},
        {{0,0,0,0,0}, {1,0,0,0,0}, {1,1,1,1,1}, {0,0,0,0,0}, {0,0,0,0,0}},
        {{0,0,0,0,0}, {0,0,0,0,0}, {1,1,1,1,1}, {0,0,0,0,0}, {0,0,0,0,0}},
        {{0,0,0,0,0}, {0,1,1,0,0}, {0,1,1,0,0}, {0,0,0,0,0}, {0,0,0,0,0}},
        {{0,0,0,0,0}, {0,1,1,0,0}, {1,1,0,0,0}, {0,0,0,0,0}, {0,0,0,0,0}},
        {{0,0,0,0,0}, {1,1,0,0,0}, {0,1,1,0,0}, {0,0,0,0,0}, {0,0,0,0,0}}
    }};

    srand((int)time(0));
    int randNum = rand() % 6;
    return Pieces[randNum]; // 要返回指定索引的话,换成Pieces[2]就行
}

关键说明:

  • std::array是C++标准库提供的容器,和原生数组一样高效,但支持拷贝、赋值等操作,返回时会自动完成数组拷贝(因为Pieces是static,拷贝开销极小)。
  • 类型声明更直观,不容易出现指针相关的错误,代码可读性更高。

内容的提问来源于stack exchange,提问作者Davey - X

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:33:23