对于学校,我需要制作一个TicTacToe控制台程序,让计算机选择一个随机位置来设置其“o”。
我尝试了不同的东西(切换案例陈述,if else陈述,检查和重新检查我的功能)但是,在人类玩家进行第二次移动后,计算机将不会进行任何移动,这在我的程序中会导致“让你的行动“印刷线无限重复。
我已经尝试过再次尝试解决它,但我只是一个初学者(本月刚刚开始。)请帮忙!
这是我的代码:
// Tic_Tac_Toe.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}
// Tic Tac Toe, by Your Name
// Include the libraries
#include <iostream>
#include <string>
#include <ctime>
//Use the standard namespace
using namespace std;
// Declare global variables
char Board[9];
// Declare functions
void showBoard ( );
bool moveIsValid (int m);
int whoWon ( ); // Returns 0 if no one has won, 1 if player 1 has won, and 2 if player 2 has won
void main ( )
{
// Seed the rand function
srand(time(NULL));
// Declare local variables
string Player_1_Name;
string Player_2_Name = "Computer";
int Whose_Turn = 1; // 1 means it's player 1's turn, 2 means it's player 2's turn
int Move; // Stores where the player wants to move
int totalMoves = 0;
int aiMove = rand () % 10 - 1;
//Assign values to the playing board
Board[0] = '0';
Board[1] = '1';
Board[2] = '2';
Board[3] = '3';
Board[4] = '4';
Board[5] = '5';
Board[6] = '6';
Board[7] = '7';
Board[8] = '8';
// Get player names
cout << "Player 1: Please enter your name." << endl;
cin >> Player_1_Name;
cout << "Computer: I will be playing you today." << endl;
while (whoWon ( ) == 0 && totalMoves < 9)
{
// Do this until the player chooses a valid move
do
{
// Show the board
showBoard ( );
// Tell which player to move
switch (Whose_Turn)
{
case(1):
{
cout << Player_1_Name << " , It's your turn." << endl;
cin >> Move;
break;
}
case(2):
{
cout << Player_2_Name << " , It's your turn." << endl;
if (aiMove == 0)
{
Move = 0;
}
else if (aiMove == 1)
Move = aiMove;
}
}
} while (moveIsValid (Move) != true);
// Add a move to the totalMoves
totalMoves++;
// Change whose turn it is
switch (Whose_Turn)
{
case (1):
{
Board[Move] = 'x';
Whose_Turn = 2;
break;
}
case (2):
{
Board[Move] = 'o';
Whose_Turn = 1;
}
}
}
// Show the board
showBoard ( );
//Tell the user who won
if (whoWon ( ) == 1)
{
cout << Player_1_Name << " has won." << endl;
}
else if (whoWon ( ) == 2)
{
cout << Player_2_Name << " has won." << endl;
}
else
{
cout <<"It's a tie game!" << endl;
}
system("PAUSE");
}
void showBoard ( )
{
cout << endl;
cout << Board[0] << " | " << Board[1] << " | " << Board[2] << endl;
cout << "--+---+--" << endl;
cout << Board[3] << " | " << Board[4] << " | " << Board[5] << endl;
cout << "--+---+--" << endl;
cout << Board[6] << " | " << Board[7] << " | " << Board[8] << endl;
cout << endl;
}
bool moveIsValid (int m)
{
if (Board[m] != 'x' && Board[m] != 'o')
{
return true;
}
else
{
return false;
}
}
int whoWon ( )
{
if (Board[0] == Board[1] && Board[1] == Board[2])
{
if (Board[0] == 'x')
{
return 1;
}
else
{
return 2;
}
}
if (Board[3] == Board[4] && Board[4] == Board[5])
{
if (Board[3] == 'x')
{
return 1;
}
else
{
return 2;
}
}
if (Board[6] == Board[7] && Board[7] == Board[8])
{
if (Board[6] == 'x')
{
return 1;
}
else
{
return 2;
}
}
if (Board[0] == Board[3] && Board[3] == Board[6])
{
if (Board[0] == 'x')
{
return 1;
}
else
{
return 2;
}
}
if (Board[1] == Board[4] && Board[4] == Board[7])
{
if (Board[1] == 'x')
{
return 1;
}
else
{
return 2;
}
}
if (Board[2] == Board[5] && Board[5] == Board[8])
{
if (Board[2] == 'x')
{
return 1;
}
else
{
return 2;
}
}
if (Board[0] == Board[4] && Board[4] == Board[8])
{
if (Board[0] == 'x')
{
return 1;
}
else
{
return 2;
}
}
if (Board[2] == Board[4] && Board[4] == Board[6])
{
if (Board[2] == 'x')
{
return 1;
}
else
{
return 2;
}
}
return 0;
}
答案 0 :(得分:2)
好吧,在你的代码中,aiMove变量值没有改变。 这就是为什么代码:
if (aiMove == 0)
{
Move = 0;
}
else if (aiMove == 1)
Move = aiMove;
}
永远不会执行,并且移动值不会更改。 您的逻辑中存在两个问题: 首先,以下代码仅生成一次aiMove值。 你应该把它放在while循环
中int aiMove = rand () % 10 - 1;
其次,其余部分仅为0或1并非总是如此,因此您的代码
if (aiMove == 0)
{
Movee = 0;
}
else if (aiMove == 1)
Move = aiMove;
}
应修改为:
if (aiMove == 0)
{
Move = 0;
}
else if (aiMove != 0)
Move = aiMove;
}
然后,您的代码将正常工作。请尝试以下方法:
while (whoWon ( ) == 0 && totalMoves < 9)
{
system("CLS");
aiMove = rand () % 10 - 1;
// Do this until the player chooses a valid move
do
{
// Show the board
showBoard ( );
// Tell which player to move
switch (Whose_Turn)
{
case(1):
{
cout << Player_1_Name << " , It's your turn." << endl;
cin >> Move;
break;
}
case(2):
{
cout << Player_2_Name << " , It's your turn." << endl;
if (aiMove == 0)
{
Move = 0;
}
else if (aiMove != 0)
Move = aiMove;
}
break;
}
} while (moveIsValid (Move) != true);
方法系统(“CLS”);将在每次移动后清除您的屏幕,您将看到只有一个板子看到多个(正如在当前情况下发生的那样)。
现在你的代码将是干净的。希望这有帮助
答案 1 :(得分:0)
你没有每回合重置你的aiMove变量,所以moveIsValid返回false,这反过来又满足了while循环条件,导致重复ai移动的无限循环。
答案 2 :(得分:0)
对于初学者来说,一切都发生在int main()
,所以你可能不想让它无效。其次,您似乎将模板用于控制台应用程序int t_main()
,因为您似乎不需要命令行参数,因此应将其删除。第三,允许AI移动的功能永远不会中断。此外,还有一些轻微的格式问题阻碍了你。