我的代码遇到问题。我试图创建一个程序,在for循环之前初始化一系列变量,但是当在循环中更改变量时,我希望它保持它已被更改为的值。我正在尝试创建一个tic tac toe游戏,其中初始化字符串变量以表示当用户选择该单元格号时将放置的位置,以及X或O.但是,而不是记住"在前一个回合中,它只是重置网格,只显示当前循环的X或O的单元格选择。我全局声明我的变量可以传递它们。
tl; dr:变量被重置为原始的赋值,这与我在循环之外声明并初始化它们的事实相反。
这是我的代码:
#include <string>
#include <fstream>
using namespace std;
string getCell();
string getSymbol();
void displayBoard(string c00,string c01,string c02,string c10,string c11,string c12,string c20,string c21,string c22);
string cell;
string xoro;
string line;
int menuchoice;
fstream file;
string c00,c01,c02,c10,c11,c12,c20,c21,c22;
int main(){
c00="-";
c01="-";
c02="-";
c10="-";
c11="-";
c12="-";
c20="-";
c21="-";
c22="-";
for (int i=1; i<=9; i++){
cout << "(1) Load previous grid" << endl << "(2) New Game" << endl;
cout << "Please enter one of the menu choices: ";
cin >> menuchoice;
switch (menuchoice){
case 1:
file.open("savedgame.txt");
if (!file){
cout << "Error opening file";}
while (file >> line){
cout << line << endl;}
file.close();
break;
case 2:
getCell();
getSymbol();
displayBoard(c00, c01, c02, c10, c11, c12, c20, c21, c22);
break;
default:
cout << "Please enter a valid Menu Choice.";
}
}
}
string getCell(){
do{
cout << "Enter Valid Cell Name: ";
cin >> cell;}
while ((cell!="00")&&(cell!="01")&&(cell!="02")&&(cell!="10")&&(cell!="11")&&(cell!="12")&&(cell!="20")&&(cell!="21")&&(cell!="22"));
return cell;}
string getSymbol(){
do{
cout << "Enter X or O: ";
cin >> xoro;}
while ((xoro != "O" && xoro != "o") && (xoro != "X" && xoro != "x"));
return xoro;}
void displayBoard(string c00, string c01, string c02, string c10, string c11, string c12, string c20, string c21, string c22){
file.open("savedgame.txt");
if (cell == "00")
c00 = xoro;
else if (cell == "01")
c01 = xoro;
else if (cell == "02")
c02 = xoro;
else if (cell == "10")
c10 = xoro;
else if (cell == "11")
c11 = xoro;
else if (cell == "12")
c12 = xoro;
else if (cell == "20")
c20 = xoro;
else if (cell == "21")
c21 = xoro;
else if (cell == "22")
c22 = xoro;
cout <<"--"<<c00<<"--|--"<<c01<<"--|--"<<c02<<"--"<<endl<<"--"<<c10<<"--|--"<<c11<<"--|--"<<c12<<"--"<<endl<<"--"<<c20<<"--|--"<<c21<<"--|--"<<c22<<"--"<<endl;
file <<"--"<<c00<<"--|--"<<c01<<"--|--"<<c02<<"--"<<endl<<"--"<<c10<<"--|--"<<c11<<"--|--"<<c12<<"--"<<endl<<"--"<<c20<<"--|--"<<c21<<"--|--"<<c22<<"--"<<endl;
file.close();
}
答案 0 :(得分:0)
您的代码存在各种问题。从最明显的一个开始:这里显示的程序不会编译,至少它不适合我。您正在使用运算符cout和cin而不使用标头。另外正如你所指出的,你可能想要使用数组,而不是基本上做同样的x个不同的变量。我也看不到你将用户输入保存到文件的行,只需在displayboard()中打开它;可能是你的变量没有存储在任何地方的原因。
我建议你进一步研究数组以及如何操作数组中的元素。它将使您和其他人更容易阅读和维护您的代码。您也可以使用字符,因为您的单元格不会超过一个字符。因此,您可以这样做:
char cell[10];
for(int i = 0; i < 10; i++){
cell[i] = '-';
}
这给你一个3 * 3大小的板。要操纵单元格,您只需向用户询问单元格以及他想要放入哪种类型的字符。通过这样做,您可以使用以前有两个函数:
int cellname;
cout << "Enter a valid cell name";
cin >> cellname;
cout << "Enter X or O: ";
cin >> xoro;
cell[cellname] = xoro;
我刚刚在您的代码中注意到的另一个问题,在您的第一个for循环中,您要求用户从菜单中进行选择,您只需重复9次。如果有人输入默认菜单选项的9倍,程序将终止。你想要的是一个while语句,用于检查用户输入是否大于0或小于3.