C++ 打印房间,但只能访问一次
我正在修补打印房间的方法。我使用了中的方框图字符来测试这一点,因此我认识到这限制了我的代码将在其上编译的范围 如果您不想在那里阅读,请快速解释问题: 房间定义为4位整数,以便C++ 打印房间,但只能访问一次,c++,string,extended-ascii,memory-access,C++,String,Extended Ascii,Memory Access,我正在修补打印房间的方法。我使用了中的方框图字符来测试这一点,因此我认识到这限制了我的代码将在其上编译的范围 如果您不想在那里阅读,请快速解释问题: 房间定义为4位整数,以便 最重要的位表示房间是否有西墙 下一个最重要的位是房间是否有北墙 下一个最低有效位是房间是否有东墙 最低有效位表示房间是否有南墙 例如,由0b1101表示的房间将具有西墙、北墙和南墙: ┌─ │ └─ 还有其他限制: 房间的外墙将始终有一面墙 内墙将始终在两个房间中表示(示例0b1101的墙朝南,因此它下面的房间必须设
- 最重要的位表示房间是否有西墙
- 下一个最重要的位是房间是否有北墙
- 下一个最低有效位是房间是否有东墙
- 最低有效位表示房间是否有南墙
┌─
│
└─
还有其他限制:
数值限制::max()
如果您想查看我的代码以供参考;它包括:
矢量
size\u t
给出行宽vector
(可设置为vector(size(testValues),-17)
只打印房间结构而不带标签字符串打印数组(常量向量和测试值、常量大小和宽度、常量向量和索引){
if(空(testValues)){
返回字符串();
}否则{
字符串结果;
auto prevLine=“\xC9\xCD”s;
前置预留(2U*(1U+宽度));
用于(自动i=0U;i+1<宽度;++i){
if((测试值[i]&0b10)!=0){
prevLine+=“\xD1\xCD”s;
}否则{
prevLine+=“\xCD\xCD”s;
}
}
prevLine+=“\xBB\n”s;
结果.保留(大小(前一行)*(1U+2U*大小(测试值)/宽度);
对于(自动i=0U;i<大小(测试值)-宽度;++i){
const auto x=i%宽度;
const auto isBottomSet=(testValues[i]&0b1)!=0;
如果(x==0){
结果+=(prevLine+'\xBA')+static_cast('0'+索引[i]);
prevLine=isBottomSet?”\xC7\xC4“s:“\xBA”s;
}
如果(x+1U==宽度){
结果+=“\xBA\n”s;
prevLine+=isBottomSet?\xB6\n“s:”\xBA\n“s;
}否则{
const auto isRightSet=(测试值[i]&0b10)!=0;
const size_t index=static_cast(isRightSet)>2 | static_cast(isBottomSet);
//MSB:isAboveIntersectionSet
//isRightOfIntersectionSet
//isBelowIntersectionSet
//LSB:isLeftOfIntersectionSet
constexpr const char*getcrossion[]={“”//0b0
“”,//0b1
“”,//0b10
“\xBF”,//0b11
“\xC4”,//0b100
“\xC4\xC4”,//0b101
“\xDA\xC4”,//0b110
“\xC2\xC4”,//0b111
“”,//0b1000:
“\xD9”,//0b1001
“\xB3”,//0b1010
“\xB4”,//0b1011
“\xC0\xC4”,//0b1100
“\xC1\xC4”,//0b1101
“\xC3\xC4”,//0b1110
“\xC5\xC4”};//0b1111
结果+={isRightSet?'\xB3':'',静态_cast('0'+索引[i+1]);
prevLine+=getcrossion[索引];
}
}
结果+=(prevLine+'\xBA')+静态_转换('0'+索引[大小(测试值)-宽度]);
prevLine=“\xC8\xCD”s;
对于(自动i=大小(测试值)-宽度;i+1<大小(测试值);+i){
if((测试值[i]&0b10)!=0){
结果+={'\xB3',静态_cast('0'+索引[i+1])};
prevLine+=“\xCF\xCD”s;
}否则{
结果+={',静态_cast('0'+索引[i+1])};
prevLine+=“\xCD\xCD”s;
}
}
返回结果+“\xBA\n”s+prevLine+'\xBC';
}
}
如果您对这方面的简单测试感兴趣,您可以:
const vector<char> rooms = { 0b1101, 0b110, 0b1101, 0b110, 0b1100, 0b101, 0b110,
0b1110, 0b1001, 0b110, 0b1011, 0b1010, 0b1111, 0b1010,
0b1000, 0b101, 0b11, 0b1110, 0b1011, 0b1110, 0b1010,
0b1011, 0b1101, 0b101, 0b1, 0b101, 0b11, 0b1011 };
const vector<int> indexes = { 1, 1, 2, 2, 3, 3, 3,
1, 1, 1, 2, 3, 5, 3,
1, 1, 1, 6, 3, 6, 3,
1, 6, 6, 6, 6, 6, 3 };
cout << printArray(rooms, width, indexes) << endl;
const vector rooms={0b1101、0b110、0b1101、0b110、0b1100、0b101、0b110、,
0b1110、0b1001、0b110、0b1011、0b1010、0b1111、0b1010、,
0b1000、0b101、0b11、0b1110、0b1011、0b1110、0b1010、,
0b1011、0b1101、0b101、0b1、0b101、0b11、0b1011};
常量向量索引={1,1,2,2,3,3,3,
1, 1, 1, 2, 3, 5, 3,
1, 1, 1, 6, 3, 6, 3,
1, 6, 6, 6, 6, 6, 3 };
你能解释一下你使用的是哪一组精确的字符吗(特别是在十字路口)?@Davidsherring是的,所以
const vector<char> rooms = { 0b1101, 0b110, 0b1101, 0b110, 0b1100, 0b101, 0b110,
0b1110, 0b1001, 0b110, 0b1011, 0b1010, 0b1111, 0b1010,
0b1000, 0b101, 0b11, 0b1110, 0b1011, 0b1110, 0b1010,
0b1011, 0b1101, 0b101, 0b1, 0b101, 0b11, 0b1011 };
const vector<int> indexes = { 1, 1, 2, 2, 3, 3, 3,
1, 1, 1, 2, 3, 5, 3,
1, 1, 1, 6, 3, 6, 3,
1, 6, 6, 6, 6, 6, 3 };
cout << printArray(rooms, width, indexes) << endl;