智能机器人游戏——五子棋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


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

源码下载
posted @ 2008-05-21 13:59  Zimmem  阅读(4137)  评论(3编辑  收藏  举报