智能机器人游戏——五子棋AI算法大比拼!

规则:
     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);
        }


示例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:
可以让用户自已输入:
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;
        }

    }

示例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)];
        }
    }


结果示例:
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.

源码下载

转载于:https://www.cnblogs.com/Zimmem/archive/2008/05/21/1204011.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值