我正在制作一个控制台游戏,我正在制作地图。地图是一组矢量。向量包含我要打印到控制台的字符。我的代码:
" window.h中"
#include <string>
#include <vector>
class Row {
public:
std::vector<char> row;
int id;
Row();
void printRow();
void resetRow();
void insertStringIntoRow(std::string toInsert, int startIndex);
std::vector<char> getRow() {
return row;
}
};
class Window {
public:
void showMap();
void writeToMap(std::string stringToInsert, int rowNum, int startIndex);
void writeInRectangle(std::string stringToWrite, int rowNum, int startIndex);
void setCursorToPosition(int x, int y);
void resetMap();
Row getRowAt(int index);
};
void initColors();
void setWindow(Window windowToSet);
Window getGameWindow();
&#34; Window.cpp&#34;
#include "Window.h"
#include <iostream>
#include <Windows.h>
#include <WinBase.h>
#include <stdlib.h>
#include "color.h"
using namespace eku;
Row map[25];
//Class Window
void Window::showMap() {
setCursorToPosition(0, 0);
for (int i = 0; i < 25; i++) {
getRowAt(i).printRow();
}
}
void Window::writeToMap(std::string stringToInsert, int rowNum, int startIndex) {
Row r = getRowAt(rowNum);
r.insertStringIntoRow(stringToInsert, startIndex);
}
void Window::writeInRectangle(std::string stringToWrite, int rowNum, int startIndex) {
if (startIndex != 0) {
std::string topbar = "~";
for (int i = 0; i < stringToWrite.length() + 2; i++) {
topbar += ' ';
}
topbar += '^';
getRowAt(rowNum - 1).insertStringIntoRow(topbar, startIndex - 1);
}
std::string toInsert = "~ ^" + stringToWrite + "~ ^";
getRowAt(rowNum).insertStringIntoRow(toInsert, startIndex - 1);
if (startIndex != 25) {
std::string bottombar = "~";
for (int i = 0; i < stringToWrite.length() + 2; i++) {
bottombar += ' ';
}
bottombar += '^';
getRowAt(rowNum + 1).insertStringIntoRow(bottombar, startIndex - 1);
}
}
void Window::setCursorToPosition(int x, int y) {
HANDLE hOut;
COORD Position;
hOut = GetStdHandle(STD_OUTPUT_HANDLE);
Position.X = x;
Position.Y = y;
SetConsoleCursorPosition(hOut, Position);
}
void Window::resetMap() {
for (Row row : map) {
row.resetRow();
}
}
Row Window::getRowAt(int index)
{
return map[index];
}
//Class Row
const char WHITEBACKCOL = '~';
const char DEFCOL = '^';
int i = 0;
Row::Row() {
row.resize(80, ' ');
id = i;
i++;
}
void Row::printRow() {
for (int i = 0; i < row.size(); i++) {
switch (row[i]) {
case WHITEBACKCOL:
setcolor(black, white);
case DEFCOL:
setcolor(white, black);
default:
std::cout << row[i];
}
}
}
void Row::resetRow() {
row.resize(80);
for (int i = 0; i < 80; i++) {
row[i] = ' ';
}
}
void Row::insertStringIntoRow(std::string toInsert, int startIndex) {
int endIndex = (startIndex + toInsert.length());
int stringPos = 0;
for (int i = startIndex; i < endIndex; i++) {
if (i < row.size() - 1) {
row.at(i) = toInsert[stringPos];
}
else {
row.push_back(toInsert[stringPos]);
}
stringPos++;
}
}
Window defWindow;
void initColors() {
concolinit();
setcolor(white, black);
}
void setWindow(Window windowToSet) {
defWindow = windowToSet;
}
Window getGameWindow() {
return defWindow;
}
&#34; Main.cpp的&#34;
#include <iostream>
#include "GameEngine.h"
#include "Window.h"
int main() {
setWindow(Window());
initColors();
getGameWindow().writeInRectangle("Hia", 1, 10);
getGameWindow().showMap();
}
每当我拨打showMap()
时,我得到的只是一个空白的控制台。它似乎只打印默认的空格映射而不是我输入的文本。我还尝试使用printRow()
来打印我编辑的单行,但它们也只显示了空格。
我能够在insertStringIntoRow()
方法中查看向量行的更改,但是即使更改应该在那里,他们也没有在其他地方显示。几乎看起来我每次访问它时都会创建Row
个对象。我是C ++的新手,所以感谢任何帮助。提前谢谢!
答案 0 :(得分:2)
此功能使用不正确。警告标志是它是非const的,但用作访问器。它返回向量的副本,而不是引用。
std::vector<char> getRow() {
return row;
}
您调用它的方式,您希望它可以就地修改该行,但您实际所做的只是修改该行的副本,然后立即将其丢弃。例如:
getRowAt(rowNum).insertStringIntoRow(toInsert, startIndex - 1);
此行为的简单修复是从getRow()
返回引用:
std::vector<char> & getRow() {
return row;
}
要解决的另一件事是将其分配给临时变量而不是内联使用它。在这种情况下,您可以将临时参考:
Row & r = getRowAt(rowNum);
r.insertStringIntoRow(stringToInsert, startIndex);
正确实现此方法的方法是还提供一个const-version,这样它仍然可以在调用者不想修改的const对象上调用它
const std::vector<char> & getRow() const {
return row;
}
我只是把这一点放在这里,因为这是一个好习惯,但你不应该在这个程序中这样做。它会使你的代码混乱,这已经充满了更糟糕的做法=)
答案 1 :(得分:0)
发送对writeToMap()的引用而不是变量。 这将更改原始地图对象而不是复制变量。