这一节我们实现如何判定棋子输赢。
1. 定义一个二维数组存储棋子,来判断棋子的位置,在WZQ类中新建方法,代码如下;
//尝试用二维数组存储棋子,好处是便利我们判断每个棋子的位置(连续性)
public QZ[,] Convert2Array()
{
QZ[,] a = new QZ[20, 20];
for(int i=0;i<20; i++)
{
for(int j = 0; j < 20; j++)
{
a[i, j] = null;
}
}
foreach (QZ qz in list)
{
int j = qz.x / grid;
int i = qz.y / grid;
a[i, j] = qz;
}
return a;
}
2. 先判定行方向的输赢,在WZQ类中新建Win_Row方法,代码如下;
public bool Win_Row(QZ qz)//qz位置为起点判断行上是否有五个连续棋子
{
QZ[,] a = Convert2Array();//获取二维数组
int col = qz.x / grid;
int row = qz.y / grid;
if (col > 5) return false;
if (a[row, col + 1] == null || a[row, col + 2] == null ||
a[row, col + 3] == null || a[row, col + 4] == null)
return false;
if (a[row, col + 1].color == qz.color && a[row, col + 2].color == qz.color &&
a[row, col + 3].color ==qz.color && a[row, col + 4].color == qz.color)
return true;
return false;
}
3. 同理可得列方向;
public bool Win_Col(QZ qz)//qz位置为起点判断列上是否有五个连续棋子
{
QZ[,] a = Convert2Array();//获取二维数组
int col = qz.x / grid;
int row = qz.y / grid;
if (row > 5) return false;
if (a[row + 1, col] == null || a[row + 2, col] == null ||
a[row + 3, col] == null || a[row + 4, col] == null)
return false;
if (a[row + 1, col].color == qz.color && a[row + 2, col].color == qz.color &&
a[row + 3, col].color == qz.color && a[row + 4, col].color == qz.color)
return true;
return false;
}
4. 对角方向;
public bool Win_Diangle(QZ qz)//qz位置为起点判断对角线上是否有五个连续棋子
{
QZ[,] a = Convert2Array();//获取二维数组
int col = qz.x / grid;
int row = qz.y / grid;
if (row > 5) return false;
if (a[row + 1, col + 1] == null || a[row + 2, col + 2] == null ||
a[row + 3, col + 3] == null || a[row + 4, col + 4] == null)
return false;
if (a[row + 1, col + 1].color == qz.color && a[row + 2, col + 2].color == qz.color &&
a[row + 3, col + 3].color == qz.color && a[row + 4, col + 4].color == qz.color)
return true;
return false;
}
5. 反对角方向;
public bool Win_AntiDiangle(QZ qz)//qz位置为起点判断反对角线上是否有五个连续棋子
{
QZ[,] a = Convert2Array();//获取二维数组
int col = qz.x / grid;
int row = qz.y / grid;
if (row > 5) return false;
if (a[row + 1, col - 1] == null || a[row + 2, col - 2] == null ||
a[row + 3, col - 3] == null || a[row + 4, col - 4] == null)
return false;
if (a[row + 1, col - 1].color == qz.color && a[row + 2, col - 2].color == qz.color &&
a[row + 3, col - 3].color == qz.color && a[row + 4, col - 4].color == qz.color)
return true;
return false;
}
6. 定义一个win方法来综合四个方向判断输赢;
public bool Win()
{
foreach (QZ qz in list)
{
if (Win_Row(qz) || Win_Col(qz) || Win_AntiDiangle(qz) ||
Win_Diangle(qz)) return true;
}
return false;
}
7. 在form1中picturebox点击事件中添加如下代码;
if (wzq.Win())
{
MessageBox.Show(qz.color.ToString() + "赢了!");
}
8. 运行即可;