规则:
1.棋局类是一个单例,可以通过 Chessboard.GetInstance()棋局类的单例对象。
2.棋局会随机为两个玩家设置白棋或黑棋,白棋先手。
3.每局每个玩家可以使用时间为10分钟,超时算负。
4.如果玩家返回的坐标为非法,如该坐标已有棋子或超出棋局范围,系统将自动重新调用该玩家play()函数。
5.玩家只要继承player类,并重写play函数,返回放置棋子的坐标。
6.可通过GetMyChessStyle()方法获取自子的棋子是白或黑。
7.通过棋局类方法start()设置棋盘大小并开始比赛。
8.可能过棋局类单例对象的getCurrentChessBoard()方法获取当前棋盘的一个拷贝以了解战况,可通过棋局类单例对象的GetSize()方法获取棋盘的大小。
9.通过在main()函数中调用棋局类单例对象的SetPlayer方法设置比赛的AI,设用start方法开始比赛。
main()函数示例:
public
static
void
Main()
{
Chessboard cb = Chessboard.GetInstance();
cb.SetPlayer(new Creazer (), new Zimmem_1());
cb.start(15);
}
{
Chessboard cb = Chessboard.GetInstance();
cb.SetPlayer(new Creazer (), new Zimmem_1());
cb.start(15);
}
示例1:
一个只会随机乱下的疯子:
class
Creazer:Player
{
public override Position play()
{
/**//*获取棋局对象*/
Chessboard cb=Chessboard.GetInstance();
/**//*随机数生成器*/
Random ra = new Random();
/**//*随机生成一个坐标*/
Position pos = new Position();
pos.x = ra.Next(cb.GetSize());
pos.y = ra.Next(cb.GetSize());
return pos;
}
}
示例2:
{
public override Position play()
{
/**//*获取棋局对象*/
Chessboard cb=Chessboard.GetInstance();
/**//*随机数生成器*/
Random ra = new Random();
/**//*随机生成一个坐标*/
Position pos = new Position();
pos.x = ra.Next(cb.GetSize());
pos.y = ra.Next(cb.GetSize());
return pos;
}
}
可以让用户自已输入:
class
UserPlayer : Player
{
public override Position play()
{
/**//*获取棋局对象*/
Chessboard cb = Chessboard.GetInstance();
/**//*获取当前棋盘*/
Chessboard.ChessState[,] chessboard = cb.getCurrentChessBoard();
/**//*输出棋盘以让用户了解战况*/
for (long i = 0; i < cb.GetSize(); i++)
{
for (long j = 0; j < cb.GetSize(); j++)
{
Console.Write(chessboard[i, j].GetHashCode());
}
Console.WriteLine();
}
/**//*玩家输入坐标*/
Position pos = new Position();
pos.x = int.Parse(Console.ReadLine());
pos.y = int.Parse(Console.ReadLine());
return pos;
}
}
{
public override Position play()
{
/**//*获取棋局对象*/
Chessboard cb = Chessboard.GetInstance();
/**//*获取当前棋盘*/
Chessboard.ChessState[,] chessboard = cb.getCurrentChessBoard();
/**//*输出棋盘以让用户了解战况*/
for (long i = 0; i < cb.GetSize(); i++)
{
for (long j = 0; j < cb.GetSize(); j++)
{
Console.Write(chessboard[i, j].GetHashCode());
}
Console.WriteLine();
}
/**//*玩家输入坐标*/
Position pos = new Position();
pos.x = int.Parse(Console.ReadLine());
pos.y = int.Parse(Console.ReadLine());
return pos;
}
}
示例3:
我写的一个只会进攻,不会防守的算法,有点长.....
Code
class Zimmem_1 : Player
{
public override Position play()
{
Chessboard cb = Chessboard.GetInstance();
Chessboard.ChessState[,] chessBoard = cb.getCurrentChessBoard();
int BoardSize = cb.GetSize();
int[,] Weight = new int[BoardSize, BoardSize];
int temp;
int i,j,k;
#region 计算橫向权值
for (i = 0; i < BoardSize; i++)
{
for (j = 0; j < BoardSize; j++)
{
temp = 0;
if (chessBoard[i, j] != Chessboard.ChessState.Empty)
{
temp = 0;
continue;
}
/*向左*/
for (k = 1; k < 5; k++)
{
if ( j + k >= BoardSize)
break;
if (chessBoard[i, j + k] == GetMyChessStyle())
{
temp += 10;
}
else if (chessBoard[i, j + k] == Chessboard.ChessState.Empty)
{
temp += 1;
break;
}
else
break;
}
/*向右*/
for (k = 1; k < 5; k++)
{
if (j - k < 0 )
break;
if (chessBoard[i, j - k] == GetMyChessStyle())
{
temp += 10;
}
else if (chessBoard[i, j -k] == Chessboard.ChessState.Empty)
{
temp += 1;
break;
}
else
break;
}
if (Weight[i, j] < temp)
Weight[i,j] = temp;
}
}
#endregion
#region 计算竖向权值
for (i = 0; i < BoardSize; i++)
{
for (j = 0; j < BoardSize; j++)
{
temp = 0;
if (chessBoard[i, j] != Chessboard.ChessState.Empty)
{
temp = 0;
continue;
}
/*向下*/
for (k = 1; k < 5; k++)
{
if ( i + k >= BoardSize)
break;
if (chessBoard[i+k, j ] == GetMyChessStyle())
{
temp += 10;
}
else if (chessBoard[i+k, j ] == Chessboard.ChessState.Empty)
{
temp += 1;
break;
}
else
break;
}
/*向上*/
for (k =1; k < 5; k++)
{
if (i - k < 0)
break;
if (chessBoard[i- k, j ] == GetMyChessStyle())
{
temp += 10;
}
else if (chessBoard[i- k, j ] == Chessboard.ChessState.Empty)
{
temp += 1;
break;
}
else
break;
}
if (Weight[i, j] < temp)
Weight[i,j] = temp;
}
}
#endregion
#region 计算斜45度权值
for (i = 0; i < BoardSize; i++)
{
for (j = 0; j < BoardSize; j++)
{
temp = 0;
if (chessBoard[i, j] != Chessboard.ChessState.Empty)
{
temp = 0;
continue;
}
/*向左下*/
for (k = 1; k < 5; k++)
{
if (j - k < 0 || i + k >= BoardSize)
break;
if (chessBoard[i+k, j - k] == GetMyChessStyle())
{
temp += 10;
}
else if (chessBoard[i+k, j - k] == Chessboard.ChessState.Empty)
{
temp += 1;
break;
}
else
break;
}
/*向右上*/
for (k = 1; k < 5; k++)
{
if (i- k < 0 || j + k >= BoardSize)
break;
if (chessBoard[i-k, j + k] == GetMyChessStyle())
{
temp += 10;
}
else if (chessBoard[i-k, j + k] == Chessboard.ChessState.Empty)
{
temp += 1;
break;
}
else
break;
}
if (Weight[i, j] < temp)
Weight[i,j] = temp;
}
}
#endregion
#region 计算斜135度权值
for (i = 0; i < BoardSize; i++)
{
for (j = 0; j < BoardSize; j++)
{
temp = 0;
if (chessBoard[i, j] != Chessboard.ChessState.Empty)
{
temp = 0;
continue;
}
/*向左上*/
for (k = 1; k < 5; k++)
{
if (j - k < 0 || i-k<0)
break;
if (chessBoard[i-k, j - k] == GetMyChessStyle())
{
temp += 10;
}
else if (chessBoard[i - k, j - k] == Chessboard.ChessState.Empty)
{
temp += 1;
break;
}
else
break;
}
/*向右下*/
for (k = 1; k < 5; k++)
{
if (i+ k >= BoardSize || j + k >= BoardSize)
break;
if (chessBoard[i+k, j + k] == GetMyChessStyle())
{
temp += 10;
}
else if (chessBoard[i+k, j + k] == Chessboard.ChessState.Empty)
{
temp += 1;
break;
}
else
break;
}
if (Weight[i, j] < temp)
Weight[i,j]= temp;
}
}
#endregion
int max = 0;
IList<Position> weightList = new List<Position>();
for (i = 0; i < BoardSize; i++)
{
for (j = 0; j < BoardSize; j++)
{
if (max < Weight [i, j])
max = Weight[i, j];
}
}
for (i = 0; i < BoardSize; i++)
{
for (j = 0; j < BoardSize; j++)
{
if (Weight[i, j] == max)
{
Position pos = new Position();
pos.x = i;
pos.y = j;
weightList.Add(pos);
}
}
}
Random ra = new Random();
return weightList[ra.Next(weightList.Count)];
}
}
class Zimmem_1 : Player
{
public override Position play()
{
Chessboard cb = Chessboard.GetInstance();
Chessboard.ChessState[,] chessBoard = cb.getCurrentChessBoard();
int BoardSize = cb.GetSize();
int[,] Weight = new int[BoardSize, BoardSize];
int temp;
int i,j,k;
#region 计算橫向权值
for (i = 0; i < BoardSize; i++)
{
for (j = 0; j < BoardSize; j++)
{
temp = 0;
if (chessBoard[i, j] != Chessboard.ChessState.Empty)
{
temp = 0;
continue;
}
/*向左*/
for (k = 1; k < 5; k++)
{
if ( j + k >= BoardSize)
break;
if (chessBoard[i, j + k] == GetMyChessStyle())
{
temp += 10;
}
else if (chessBoard[i, j + k] == Chessboard.ChessState.Empty)
{
temp += 1;
break;
}
else
break;
}
/*向右*/
for (k = 1; k < 5; k++)
{
if (j - k < 0 )
break;
if (chessBoard[i, j - k] == GetMyChessStyle())
{
temp += 10;
}
else if (chessBoard[i, j -k] == Chessboard.ChessState.Empty)
{
temp += 1;
break;
}
else
break;
}
if (Weight[i, j] < temp)
Weight[i,j] = temp;
}
}
#endregion
#region 计算竖向权值
for (i = 0; i < BoardSize; i++)
{
for (j = 0; j < BoardSize; j++)
{
temp = 0;
if (chessBoard[i, j] != Chessboard.ChessState.Empty)
{
temp = 0;
continue;
}
/*向下*/
for (k = 1; k < 5; k++)
{
if ( i + k >= BoardSize)
break;
if (chessBoard[i+k, j ] == GetMyChessStyle())
{
temp += 10;
}
else if (chessBoard[i+k, j ] == Chessboard.ChessState.Empty)
{
temp += 1;
break;
}
else
break;
}
/*向上*/
for (k =1; k < 5; k++)
{
if (i - k < 0)
break;
if (chessBoard[i- k, j ] == GetMyChessStyle())
{
temp += 10;
}
else if (chessBoard[i- k, j ] == Chessboard.ChessState.Empty)
{
temp += 1;
break;
}
else
break;
}
if (Weight[i, j] < temp)
Weight[i,j] = temp;
}
}
#endregion
#region 计算斜45度权值
for (i = 0; i < BoardSize; i++)
{
for (j = 0; j < BoardSize; j++)
{
temp = 0;
if (chessBoard[i, j] != Chessboard.ChessState.Empty)
{
temp = 0;
continue;
}
/*向左下*/
for (k = 1; k < 5; k++)
{
if (j - k < 0 || i + k >= BoardSize)
break;
if (chessBoard[i+k, j - k] == GetMyChessStyle())
{
temp += 10;
}
else if (chessBoard[i+k, j - k] == Chessboard.ChessState.Empty)
{
temp += 1;
break;
}
else
break;
}
/*向右上*/
for (k = 1; k < 5; k++)
{
if (i- k < 0 || j + k >= BoardSize)
break;
if (chessBoard[i-k, j + k] == GetMyChessStyle())
{
temp += 10;
}
else if (chessBoard[i-k, j + k] == Chessboard.ChessState.Empty)
{
temp += 1;
break;
}
else
break;
}
if (Weight[i, j] < temp)
Weight[i,j] = temp;
}
}
#endregion
#region 计算斜135度权值
for (i = 0; i < BoardSize; i++)
{
for (j = 0; j < BoardSize; j++)
{
temp = 0;
if (chessBoard[i, j] != Chessboard.ChessState.Empty)
{
temp = 0;
continue;
}
/*向左上*/
for (k = 1; k < 5; k++)
{
if (j - k < 0 || i-k<0)
break;
if (chessBoard[i-k, j - k] == GetMyChessStyle())
{
temp += 10;
}
else if (chessBoard[i - k, j - k] == Chessboard.ChessState.Empty)
{
temp += 1;
break;
}
else
break;
}
/*向右下*/
for (k = 1; k < 5; k++)
{
if (i+ k >= BoardSize || j + k >= BoardSize)
break;
if (chessBoard[i+k, j + k] == GetMyChessStyle())
{
temp += 10;
}
else if (chessBoard[i+k, j + k] == Chessboard.ChessState.Empty)
{
temp += 1;
break;
}
else
break;
}
if (Weight[i, j] < temp)
Weight[i,j]= temp;
}
}
#endregion
int max = 0;
IList<Position> weightList = new List<Position>();
for (i = 0; i < BoardSize; i++)
{
for (j = 0; j < BoardSize; j++)
{
if (max < Weight [i, j])
max = Weight[i, j];
}
}
for (i = 0; i < BoardSize; i++)
{
for (j = 0; j < BoardSize; j++)
{
if (Weight[i, j] == max)
{
Position pos = new Position();
pos.x = i;
pos.y = j;
weightList.Add(pos);
}
}
}
Random ra = new Random();
return weightList[ra.Next(weightList.Count)];
}
}
结果示例:
Gobang.Creazer 先手,使用白棋,标志为1!
Gobang.Zimmem_1使用黑棋,标志为2!
游戏开始!
最终棋局为!
000000000000000
000000000000000
000000000000000
000000000000000
100000000000000
000000000000000
000000000000000
010000000000000
000000000122222
000000000000000
000000000000000
000100000000000
000000000000000
000000000000000
000010000000000
Gobang.Zimmem_1 胜!
由于时间不多,判胜负的算法没细想,有点垃圾,不过应该没问题,有兴趣的帮忙更进下。现在是用C#写,有兴趣的帮忙翻译成C++或java. Gobang.Zimmem_1使用黑棋,标志为2!
游戏开始!
最终棋局为!
000000000000000
000000000000000
000000000000000
000000000000000
100000000000000
000000000000000
000000000000000
010000000000000
000000000122222
000000000000000
000000000000000
000100000000000
000000000000000
000000000000000
000010000000000
Gobang.Zimmem_1 胜!
源码下载