C++井字游戏程序优化
C++ Tic Tac Toe Program Optimization
我对C++很陌生。
我刚刚完成了我的第一个"真正的"程序。
这是一个井字游戏。
有没有人愿意阅读我的代码并告诉我在哪里可以优化某些东西?
#include <iostream>
using namespace std;
/**< Board variables */
string a1 = "_"; string a2 = "_"; string a3 = "_";
string b1 = "_"; string b2 = "_"; string b3 = "_";
string c1 = "_"; string c2 = "_"; string c3 = "_";
string showboard (){
cout << 't' << ""<< 't' << "1" << 't' << "2" << 't' << "3" << "n";
cout << 't' << "a"<< 't' << a1 << 't' << a2 << 't' << a3 << "n";
cout << 't' << "b"<< 't' << b1 << 't' << b2 << 't' << b3 << "n";
cout << 't' << "c"<< 't' << c1 << 't' << c2 << 't' << c3 << "nn";
return "";
};
/**< Turn */
int turn;
/**< useless variable */
int x =1;
/**< "tiles" for example "X" or "O" */
string boardvalue;
/**< Checks if Turn is valid/legal */
string turnvalidation (string boardvalue){
if(turn==1 && a1!="_"){
cout << "Invalid option. Choose again! nn";
x=1;
} else if(turn==2 && a2!="_"){
cout << "Invalid option. Choose again! nn";
x=1;
} else if(turn==3 && a3!="_"){
cout << "Invalid option. Choose again! nn";
x=1;
} else if(turn==4 && b1!="_"){
cout << "Invalid option. Choose again! nn";
x=1;
} else if(turn==5 && b2!="_"){
cout << "Invalid option. Choose again! nn";
x=1;
} else if(turn==6 && b3!="_"){
cout << "Invalid option. Choose again! nn";
x=1;
} else if(turn==7 && c1!="_"){
cout << "Invalid option. Choose again! nn";
x=1;
} else if(turn==8 && c2!="_"){
cout << "Invalid option. Choose again! nn";
x=1;
} else if(turn==9 && c3!="_"){
cout << "Invalid option. Choose again! nn";
x=1;
} else if(turn==10){
cout << "Invalid option. Choose again! nn";
x=1;
} else {
x=0;
switch (turn){
case 1: a1=boardvalue; break;
case 2: a2=boardvalue; break;
case 3: a3=boardvalue; break;
case 4: b1=boardvalue; break;
case 5: b2=boardvalue; break;
case 6: b3=boardvalue; break;
case 7: c1=boardvalue; break;
case 8: c2=boardvalue; break;
case 9: c3=boardvalue; break;
}
}
return"";
};
/**< Checks if the game is won */
int wincheck(string boardvalue){
// Rows
if(a1==boardvalue && a2==boardvalue && a3==boardvalue){return 0;}else
if(b1==boardvalue && b2==boardvalue && b3==boardvalue){return 0;}else
if(c1==boardvalue && c2==boardvalue && c3==boardvalue){return 0;}else
// Columns
if(a1==boardvalue && b1==boardvalue && c1==boardvalue){return 0;}else
if(a2==boardvalue && b2==boardvalue && c2==boardvalue){return 0;}else
if(a3==boardvalue && b3==boardvalue && c3==boardvalue){return 0;}else
// Diagonals
if(c1==boardvalue && b2==boardvalue && a3==boardvalue){return 0;}else
if(a1==boardvalue && b2==boardvalue && c3==boardvalue){return 0;}else
{return 1;};
}
int main()
{
string player1;
string player2;
cout << "Player 1 enter your name n";
cin >> player1;
cout << "nPlayer 2 enter your name n";
cin >> player2;
cout << endl;
cout << "Input example: a1 [enter]nn";
string turni; /**< Converts Input in switch value! */
while(1){ /**< Play again */
string a1 = "_"; string a2 = "_"; string a3 = "_";
string b1 = "_"; string b2 = "_"; string b3 = "_";
string c1 = "_"; string c2 = "_"; string c3 = "_";
while(1){
/**< Player 1s turn */
x=1;
while(1){
cout << player1 << " place your X nn";
showboard();
cin >> turni;
if(turni=="a1"){turn=1;} else if(turni=="a2"){turn=2;} else if(turni=="a3"){turn=3;} else if(turni=="b1"){turn=4;} else if(turni=="b2"){turn=5;} else if(turni=="b3"){turn=6;} else if(turni=="c1"){turn=7;} else if(turni=="c2"){turn=8;} else if(turni=="c3"){turn=9;} else{turn=10;};
/**< Checks if Turn is valid/legal */
turnvalidation("X");
break;
}
/**< Win Check */
if(wincheck("X") == 0){
showboard();
cout << "Congratulations " << player1 << " you won!";
break;
};
/**< Player 1s turn is over */
/**< Player 2s turn */
x=1;
while(1){
cout << player2 << " place your 0 nn";
showboard();
cin >> turni;
if(turni=="a1"){turn=1;} else if(turni=="a2"){turn=2;} else if(turni=="a3"){turn=3;} else if(turni=="b1"){turn=4;} else if(turni=="b2"){turn=5;} else if(turni=="b3"){turn=6;} else if(turni=="c1"){turn=7;} else if(turni=="c2"){turn=8;} else if(turni=="c3"){turn=9;} else{turn=10;};
/**< Checks if Turn is valid/legal */
turnvalidation("O");
break;
}
/**< Win Check */
if(wincheck("O")==0){
showboard();
cout << "Congratulations " << player2 << " you won!";
break;
};
/**< Player 1s turn is over */
}
/**< Play again and clear board */
cout << "nnIf you want to play again type ""1""! n";
cin >> x;
if(x==1){
a1 = "_"; a2 = "_"; a3 = "_";
b1 = "_"; b2 = "_"; b3 = "_";
c1 = "_"; c2 = "_"; c3 = "_";
} else {break;}
}
}
游戏本身有效。
但
本节中出现错误:
cout << "nnIf you want to play again type ""1""! n";
cin >> x;
if(x==1){
a1 = "_"; a2 = "_"; a3 = "_";
b1 = "_"; b2 = "_"; b3 = "_";
c1 = "_"; c2 = "_"; c3 = "_";
} else {break;}
您可以通过获胜进入此部分。
如果您键入"1",游戏将重新启动并清除棋盘。
每隔一个输入将关闭程序。
游戏将重新启动,但棋盘不会清除。
你的错误就在这里
while(1){ /**< Play again */
string a1 = "_"; string a2 = "_"; string a3 = "_";
string b1 = "_"; string b2 = "_"; string b3 = "_";
string c1 = "_"; string c2 = "_"; string c3 = "_";
当您已将它们声明为全局时,不应再次声明它们。
您应该将此部分更改为此部分。因此,您的变量值将在任何地方更新。
while (1){ /**< Play again */
a1 = "_"; a2 = "_"; a3 = "_";
b1 = "_"; b2 = "_"; b3 = "_";
c1 = "_"; c2 = "_"; c3 = "_";
Mohammad Tayyab的答案对于修复错误是正确的。给他胜利,但如果下面也有帮助,点赞会很好。您在游戏开始时设置棋盘,无需在任何其他时间设置。将原始语句更改为:
/* Board variables */
string a1, a2, a3, b1, b2, b3, c1, c2, c3;
并且播放再次编码为:
/**< Play again and clear board */
cout << "nnIf you want to play again type ""1""! n";
cin >> x;
if (x != 1)
{
break;
}
此外,您最好为您的电路板使用矢量/数组,例如在一个简单的程序中完全摆脱 a1 - c3 并使用:
int board[9]; // a1 now = board[0], a2 now = board[1] and so on
您现在可以大大简化"轮次验证"功能。
此外,您在两个玩家的代码中重复此代码:
if (turni == "a1") { turn = 1; }
else if (turni == "a2") { turn = 2; }
else if (turni == "a3") { turn = 3; }
else if (turni == "b1") { turn = 4; }
else if (turni == "b2") { turn = 5; }
else if (turni == "b3") { turn = 6; }
else if (turni == "c1") { turn = 7; }
else if (turni == "c2") { turn = 8; }
else if (turni == "c3") { turn = 9; }
else { turn = 10; };
改用 board[9] 数组并将该代码组合到验证函数中(也将名称更改为"movevalidation"),您可以执行以下操作:
bool movevalidation(string move_string, string player_symbol)
{
string moves[9] = { "a1", "a2", "a3", "b1", "b2", "b3", "c1", "c2", "c3" };
int move_int = -1; // -1 means invalid
for (int i = 0; i < 9; ++i)
{
if (move_string == moves[i])
move_int = i;
}
if (moves < 0 || board[move_int] != "_")
{
cout << "Invalid option. Choose again! nn";
return false;
}
board[move_int] = player_symbol;
return true;
}
玩家选择移动循环变成这样:
while (1) {
cout << player1 << " place your X nn";
showboard();
cin >> turni;
if(movevalidation(turni))
break;
}
对于两个玩家。对于数组,您还需要将明板代码更改为循环:
while (1) { /**< Play again */
for(int i = 0; i < 9 ++i)
board[i] = "_";
您必须更改 WinCheck,以考虑将名称替换为数组名称。您可以简单地将 a1 替换为板 [0],将 a2 替换为板 [1] 等等。
相关文章:
- 为什么我的程序在 O0 和 O2 的优化级别返回不同的结果
- 如何优化以下程序?
- O2优化水平中断程序工作
- 如何优化C++键值程序以获得更快的运行时间
- 为什么警告阻止我们编写优化程序
- 多线程程序卡在优化模式下,但在 -O0 中正常运行
- 优化形状跟踪程序 - C++ OpenCV
- 如何在卷积程序的 c++ 中优化嵌套循环
- 如何优化此程序
- 未经GCC优化而编译的简单C++程序不会产生预期的结果
- Arm GNU编译器:通过多余的强制转换优化的三进制生成的程序集
- 对 constexpr 与内联函数的调用编译为不同的程序集,并禁用优化
- 使用优化编译时的多线程程序块
- C++井字游戏程序优化
- 如果我设置优化 -O3,C++整个程序优化是否在 gcc 中完成
- 是否有可能比 C 中的相同程序(优化)更快地获得 Java 程序
- 针对AT91SAM9 ARM处理器Linux用户空间程序优化FFT和数学运算
- 可能存在VS2012编译器错误(可能在整个程序优化中?)
- 如何在VC++2015全程序优化的情况下正确地从dll中公开接口
- Visual Studio警告C4743:整个程序优化如何影响_fltused