对于我的项目,我必须用c ++制作一个游戏。我们的老师选了一个叫做Squadro的棋盘游戏。为了快速解释,我们有一个有 49 个盒子和 10 个棋子的棋盘,5 个红色和 5 个黄色。在每个回合,玩家必须移动他们的棋子等。
一开始游戏看起来像这样:
中队
如果您想了解有关此游戏的更多信息,请点击此链接:https://www.youtube.com/watch?v=pzOK7b_sq2I(它是法语,但我认为您会理解(。但问题不在这里。我已经用SFML等制作了一个GUI。我们必须实现另一个功能。事实上,我们必须让用户保存他们的游戏。我设法通过在文本文件中写入日期,玩家姓名和游戏的"矩阵"来做到这一点。这是我的问题:抨击游戏。我认为这可能并不难,但我尝试了很多想法。那么我需要什么来解决我的问题?我必须打开名为"saves.txt"的文本文件(已经完成(并获取有用的数据:获取游戏日期,玩家姓名并构建我的矩阵,最后我可以开始游戏。为了帮助我完成这项任务,我与您分享我已经完成的工作以及我的保存.txt的样子。
感谢您的帮助!
目前我的存档.txt看起来像:
保存.txt
我的游戏保存代码:
else if(event.key.code == sf::Keyboard::Escape) //if the user press escape it will close the SFML Window
{
window.close();
system("cls");
cout << "Wanna save the game? " << endl;
string choice;
cin >> choice;
if((choice == "yes") || (choice == "Yes") || (choice == "YES"))
{
//Get date and current time
time_t tt;
struct tm * ti;
time (&tt);
ti = localtime(&tt);
cout << asctime(ti) << endl;
//Opening the file
string const File("saves.txt");
ofstream Flux(File.c_str(), ios::app);
Flux << "----------------------------------------------------" << endl;
Flux << "date " << asctime(ti) << endl;
Flux << "Type of game : two players" << endl;
Flux << "currentPlayer : " << currentPlayer << endl;
Flux << "waitingPlayer : " << waitingPlayer << endl;
cout << endl;
if(Flux)
{
for(int u=0; u < 7; u++)
{
for(int v=0; v < 7; v++)
{
if(game[u][v] != ' ')
{
Flux << game[u][v] << " line : " << u << " | column :" << v << endl;
}
}
cout << endl;
}
Flux << "n----------------------------------------------------" << endl;
}
else
{
cerr << "ERROR : Impossible to save the game ! " << endl;
}
}
else
{
exit(0);
}
和我未完成的函数加载游戏((;
void loadGame()
{
vector<string> dateGame(5);
ifstream file;
file.open("saves.txt");
if(file.fail())
{
cerr << "Error at the opening of the file";
exit(1);
}
string search = "date";
bool isFound = 0;
while(!file.eof())
{
string temp = "";
getline(file,temp);
for(int i = 0; i < search.size(); i++)
{
if(temp[i]==search[i])
{
isFound = 1;
dateGame.push_back(search[i]); //it doesn't work
}
else
{
isFound =0;
break;
}
}
if(isFound)
{
cout << "Password is: ";
for(int i = search.size()+1;i<temp.size();i++)
cout << temp[i];
break;
}
}
if(file.eof()&&(!isFound))
{
cout << "String not found!n";
}
file.close();
}
在获得我的数据后,我将能够初始化(字符游戏[7][7],...,**参数(;
编辑:我的游戏是这样表示的:
char game[7][7] = {
{' ',' ',' ',' ',' ',' ',' '},
{'>',' ',' ',' ',' ',' ',' '},
{'>',' ',' ',' ',' ',' ',' '},
{'>',' ',' ',' ',' ',' ',' '},
{'>',' ',' ',' ',' ',' ',' '},
{'>',' ',' ',' ',' ',' ',' '},
{' ','A','A','A','A','A',' '}
};
假设您知道保存文件的格式并且此格式不会更改,您只需解析每一行并保存所需的项目。要解析一行,您可以使用类似strtok的东西,或者您可以像这样执行自己的解析函数(只是用空格分隔符分隔字符串项(:
static vector<string> getLineParts(string line)
{
vector<string> partsList;
int length = line.length();
string temp = "";
for (int i = 0; i < length; i++)
{
if (line[i] != ' ')
{
temp += line[i];
}
else
{
partsList.push_back(temp);
temp = "";
}
}
partsList.push_back(temp);
return partsList;
}
您可以调用 getline 五次来获取标头信息,然后调用循环来获取片段位置。游戏数组可以初始化为所有空(' '(,然后当你得到每个棋子的位置时,你可以把它们放在游戏数组中的相应位置。