我正在尝试编写Tic-Tac-Toe游戏,但我遇到了编译器错误。有3个与TTT::whoWins
函数相关的错误。任何人都可以帮助我,或者指出我正确的方向。
错误是:
Error 2 error C2664: 'TTT::checkColumn' : cannot convert parameter 1 from 'cli::array<Type,dimension> ^' to 'int [][3]' C:\Users\Grunt\Desktop\tictactoe game\tictactoe game\TTT.cpp 59
Error 3 error C2664: 'TTT::checkDiagonal' : cannot convert parameter 1 from 'cli::array<Type,dimension> ^' to 'int [][3]' C:\Users\Grunt\Desktop\tictactoe game\tictactoe game\TTT.cpp 59
Error 1 error C2664: 'TTT::checkRow' : cannot convert parameter 1 from 'cli::array<Type,dimension> ^' to 'int [][3]' C:\Users\Grunt\Desktop\tictactoe game\tictactoe game\TTT.cpp 59
代码如下所示:
TTT::TTT()
{
matrix = gcnew array <int,2>(3,3);
}
bool TTT::isaTie()
{
return 0;
}
bool TTT::isaTie2()
{
return 0;
}
int TTT::whoWins()
{
if((checkRow(matrix,ROW_SIZE))==1 || (checkColumn(matrix,COLUMN_SIZE))==1 || (checkDiagonal(matrix,ROW_SIZE))==1)
return 1;
else
return 0;
}
bool TTT::checkRow (int mat[][COLUMN_SIZE], int ROW_SIZE)
{
int row1 = mat[0][0] + mat[0][1] + mat [0][2];
int row2 = mat[1][0] + mat[1][1] + mat [1][2];
int row3 = mat[2][0] + mat[2][1] + mat [2][2];
if (row1 == 0 || row2 == 0 || row3 == 0)
{
return 1;
}
else if (row1 == 3 || row2 == 3 || row3 == 3)
{
return 1;
}
else
return 0;
}
bool TTT::checkColumn (int mat[][COLUMN_SIZE], int ROW_SIZE)
{
int col1 = mat[0][0] + mat[1][0] + mat [2][0];
int col2 = mat[0][1] + mat[1][1] + mat [2][1];
int col3 = mat[0][2] + mat[1][2] + mat [2][2];
if (col1 == 0 || col2 == 0 || col3 == 0)
{
return 1;
}
else if (col1 == 3 || col2 == 3 || col3 == 3)
{
return 1;
}else
return 0;
}
bool TTT::checkDiagonal (int mat[][COLUMN_SIZE], int ROW_SIZE)
{
int diag1 = mat[0][0] + mat[1][1] + mat [2][2];
int diag2 = mat[2][0] + mat[1][1] + mat [0][2];
if (diag1 == 0 || diag2 == 0)
{
return 1;
}
else if (diag1 == 3 || diag2 == 3)
{
return 1;
}else
return 0;
}
答案 0 :(得分:0)
在您的班级matrix
中,array
类型,但在您的函数中(例如checkRow
),您的第一个参数类型为int
。因此,您需要将其更改为array
。
另一方面,你的check *函数是TTT的一部分,所以他们可以直接访问矩阵,不需要它作为参数。
答案 1 :(得分:0)
我不够专家知道如何做到这一点,但我了解到一种方法是创建另一个指针数组并将其与数组链接,并使用它而不是直接使用数组。另一种方法是全局声明数组。要全局声明数组,它不能在任何函数中,并且声明一个int数组,例如(int * x [10])。
我希望这有用:)
答案 2 :(得分:0)
我认为您遇到的问题是,我发现CLI gc对象(例如array ^)与C ++样式数组完全不同。你无法互换它们。它们的布局完全不同,任何CLI类型都位于可移动内存中,具有某些方法等,而C ++数组只是一块内存。在C ++ / CLI中,您可以选择使用任一类型的对象,但由于您似乎等待使用gc对象,因此我已编辑您的代码以使用它,如下所示。语法稍有不同,您使用array ^作为函数参数(引用int的2D数组)。然后使用CLI样式的索引来解决数组,例如[0,1]而不是[0] [1],就像在C ++中使用的那样。不知道为什么你有ROW_SIZE和COLUMN_SIZE因为你没有使用它们所以我删除了它们。
public ref class TTT
{
public:
array<int, 2>^ matrix;
TTT::TTT()
{
matrix = gcnew array <int,2>(3, 3);
}
bool TTT::isaTie()
{
return 0;
}
bool TTT::isaTie2()
{
return 0;
}
int TTT::whoWins()
{
if ((checkRow(matrix))==1 || (checkColumn(matrix))==1 || (checkDiagonal(matrix))==1)
return 1;
else
return 0;
}
bool TTT::checkRow(array<int, 2>^ mat)
{
int row1 = mat[0,0] + mat[0,1] + mat[0,2];
int row2 = mat[1,0] + mat[1,1] + mat[1,2];
int row3 = mat[2,0] + mat[2,1] + mat[2,2];
if (row1 == 0 || row2 == 0 || row3 == 0)
{
return 1;
}
else if (row1 == 3 || row2 == 3 || row3 == 3)
{
return 1;
}
else
return 0;
}
bool TTT::checkColumn (array<int, 2>^ mat)
{
int col1 = mat[0,0] + mat[1,0] + mat[2,0];
int col2 = mat[0,1] + mat[1,1] + mat[2,1];
int col3 = mat[0,2] + mat[1,2] + mat[2,2];
if (col1 == 0 || col2 == 0 || col3 == 0)
{
return 1;
}
else if (col1 == 3 || col2 == 3 || col3 == 3)
{
return 1;
}else
return 0;
}
bool TTT::checkDiagonal (array<int, 2>^ mat)
{
int diag1 = mat[0,0] + mat[1,1] + mat[2,2];
int diag2 = mat[2,0] + mat[1,1] + mat[0,2];
if (diag1 == 0 || diag2 == 0)
{
return 1;
}
else if (diag1 == 3 || diag2 == 3)
{
return 1;
}else
return 0;
}
};