在线用户    站点地图 技术论坛 文档中心 站点导航 资源下载 语言参考 教程专题 站点统计 业务项目 使用帮助
您的位置
MSDN参考新加了CSS2参考,全中文,制作精良。245k下载。           新加了sxf_sxf推荐的"动态网页专家指导" 下载!          新加了lsg2002lsg推荐的"ASP.NET高级编程(PDF)" 下载!          新加了DHTML代码预览!!,功能强大哦!欢迎试用          新加了网友lincong为大家提供的SQL Server 2000 程序员指南,有点大,但同时也就说明内容全咯!           新加了网友ibra为大家提供的北大的JAVA课件,很适合初学者入门           新加了一个java的连接缓冲池代码示例           新加了人月神话电子版下载!软件工程巨著哦~~           更新了评分标准,引入了“专家分”概念,相信可以更好的激励大家的学习!详情请看“使用帮助”           新加了由网友GGG提供的“IIS超级管理手册”,值得一看哦!(虽然我没看过 :P )           新加了“英雄榜”,欢迎测试!           “无组件上传·从原理剖析到实践”已经全部完成,源码全部开放,有兴趣的朋友请到文档中心一探究竟。  您的位置  首页>文档中心>C++>文档A0000668 在同一窗口中打开页面中的链接 在新窗口中打开页面中的链接 将ASPCHINA设为首页 将ASPCHINA加入书签    
 LOGIN HERE
用户:
密码: 忘记密码
记住密码 用户注册 游客进入
相关文章

Compilers] Digital Mars C/C++ Compilers

如何在 Visual C++.NET 2003 下编译eMule

C++编译器推荐目录

C~C++程序员实用大全-C~C++最佳编程指南.rar

Java TCP/IP 文件传输源代码

在C++中创建并使用WEB服务

JavaScript源代码集锦

ACE简介

查看指定网页源代码

学好VC++的十大良好习惯
发表文章
西北风五子棋源代码

作者:evice     提交人:evice     发布时间:04-02-23     文章类型:原创     浏览量:3722
参考链结:http://    
关键字:C++|源程序|源代码|西北风|五子棋|evice
[本文档没有附件]
字体:    视力保护色: 杏仁黄  秋叶褐  胭脂红  芥末绿  天蓝  雪青  灰  银河白(默认色) [A0000668]

偶独立设计的西北风五子棋的关键代码,我没有参考过也从没看过别人的算法,所以我的算法虽简单,应该还有点参考价值吧。在此贴出,高手们见笑了。

在此贴出的是动态链接库的代码,该部分包含完整的算法,文件列表如下:

Defines.h
MyList.cpp
MyList.h
MyPlayer.cpp
MyPlayer.h
Player.cpp
Player.h
{{
resource.h
stdafx.cpp
stdafx.h
}}


用花括号括起来的略去,其他文件如下:

// ---Defines.h---------------------------------------
//

#define EMPTY      0
#define BLACK      1
#define WHITE      2

#define DIR_RIGHT    0
#define DIR_RIGHTDOWN  1
#define DIR_DOWN    2
#define DIR_LEFTDOWN  3

struct Point
{
  int x;
  int y;
};

struct LivingSpace
{
  int x;
  int y;
  int Direction;
  int Grade;
};


// ---MyList.cpp--------------------------------------------
//

#include "StdAfx.h"
#include ".\mylist.h"

CMyList::CMyList(void)
    :m_pHead(new LSC)
    ,count(0)
{
  //为头指针赋初值,头指针无任何实际数据。
  m_pHead->LS.Direction=705;
  m_pHead->LS.Grade=705;
  m_pHead->LS.x=705;
  m_pHead->LS.y=705;
  m_pHead->pPrev=NULL;
  m_pHead->pNext=NULL;

  //初始化链表
  m_pGuard=m_pHead;
  m_pCurrent=NULL;
}

CMyList::~CMyList(void)
{
  MoveLast();
  //删除整个链表
  while(m_pHead->pNext!=NULL)
    Delete();
  delete m_pHead;
}

void CMyList::Init(void)
{
  MoveFirst();
  //删除所有节点
  while(m_pHead->pNext!=NULL)
    Delete();
  count=0;

  //初始化各节点
  int i,j;
  LivingSpace ls;
  // Right
  ls.Direction=DIR_RIGHT;
  for(i=0;i<11;i++)
  {
    for(j=0;j<15;j++)
    {
      ls.x=i;
      ls.y=j;
      Add(ls);
    }
  }
  // RightDown
  ls.Direction=DIR_RIGHTDOWN;
  for(i=0;i<11;i++)
  {
    for(j=0;j<11;j++)
    {
      ls.x=i;
      ls.y=j;
      Add(ls);
    }
  }
  // Down
  ls.Direction=DIR_DOWN;
  for(i=0;i<15;i++)
  {
    for(j=0;j<11;j++)
    {
      ls.x=i;
      ls.y=j;
      Add(ls);
    }
  }
  // LeftDown
  ls.Direction=DIR_LEFTDOWN;
  for(i=4;i<15;i++)
  {
    for(j=0;j<11;j++)
    {
      ls.x=i;
      ls.y=j;
      Add(ls);
    }
  }
}

void CMyList::Add(LivingSpace ls)
{
  //如果是第一个记录,特殊处理
  if(m_pCurrent==NULL)
  {
    m_pCurrent=new LSC;
    m_pCurrent->LS=ls;
    m_pCurrent->pPrev=m_pGuard;
    m_pCurrent->pNext=NULL;
    m_pGuard->pNext=m_pCurrent;
    count=1;
    return;
  }

  // Guard 指向 Current 的下一节点
  m_pGuard=m_pCurrent->pNext;
  //在 Current 后添加新的节点
  m_pCurrent->pNext=new LSC;
  // 为新的节点赋值
  m_pCurrent->pNext->LS=ls;
  m_pCurrent->pNext->pPrev=m_pCurrent;
  m_pCurrent->pNext->pNext=m_pGuard;
  //更新 Guard 所指数据
  if(m_pGuard!=NULL)
    m_pGuard->pPrev=m_pCurrent->pNext;

  //完成添加操作
  count++;
  m_pGuard=m_pCurrent;
  m_pCurrent=m_pCurrent->pNext;
}

bool CMyList::Delete(void)
{
  //如果是空的则返回
  if(m_pCurrent==NULL)
    return false;

  //删除
  m_pGuard->pNext=m_pCurrent->pNext;
  delete m_pCurrent;
  count--;

  if(m_pGuard->pPrev==NULL)
  {//如果是首节点
    m_pCurrent=m_pGuard->pNext;
    if(m_pCurrent!=NULL)
      m_pCurrent->pPrev=m_pGuard;
  }
  else
  {//如果不是首节点
    if(m_pGuard->pNext!=NULL)
      m_pGuard->pNext->pPrev=m_pGuard;
    m_pCurrent=m_pGuard;
    m_pGuard=m_pGuard->pPrev;
  }

  return true;
}

bool CMyList::MoveFirst(void)
{
  //移到首节点
  m_pGuard=m_pHead;
  m_pCurrent=m_pHead->pNext;
  if(m_pCurrent==NULL)
    return false;
  else
    return true;
}

bool CMyList::MovePrev(void)
{
  //如果是首节点则返回 false
  if(m_pGuard==m_pHead)
    return false;

  //上移一个节点
  m_pCurrent=m_pGuard;
  m_pGuard=m_pGuard->pPrev;

  return true;
}

bool CMyList::MoveNext(void)
{
  //如果链表已空,返回 false
  if(m_pCurrent==NULL)
    return false;
  //如果是尾节点则返回 false
  if(m_pCurrent->pNext==NULL)
    return false;

  //下移一个节点
  m_pGuard=m_pCurrent;
  m_pCurrent=m_pCurrent->pNext;

  return true;
}

bool CMyList::MoveLast(void)
{
  //如果为空则返回 false
  if(m_pCurrent==NULL)
    return false;

  //移到最后一个节点
  while(m_pCurrent->pNext!=NULL)
  {
    m_pGuard=m_pCurrent;
    m_pCurrent=m_pCurrent->pNext;
  }
  return true;
}

int CMyList::GetListCount(void)
{
  //返回节点数
  return count;
}

LivingSpace* CMyList::GetCurrentLS(void)
{
  //返回当前指针指向的 LivingSpace 对象(LS)
  return &m_pCurrent->LS;
}


// ---MyList.h--------------------------------------------
//

#pragma once

struct LSC
{
  LivingSpace LS;
  LSC* pPrev;
  LSC* pNext;
};

class CMyList
{
public:
  CMyList(void);
  ~CMyList(void);

public:
  LSC* m_pCurrent;

protected:
  LSC* const m_pHead;
  LSC* m_pGuard;
  int count;

public:
  void Init(void);
  void Add(LivingSpace ls);
  bool Delete(void);
  bool MoveFirst(void);
  bool MovePrev(void);
  bool MoveNext(void);
  bool MoveLast(void);
  int GetListCount(void);

  LivingSpace* GetCurrentLS(void);
};


// ---MyPlayer.cpp------------------------------------------
//

#include "StdAfx.h"
#include ".\myplayer.h"


//定义各种情况的得分
static const double ZERO=10;
static const double ONE=100;
static const double TWO=500;
static const double THREE=2500;
static const double FOUR=12500;
static const double ADDITIONAL=300;

CMyPlayer::CMyPlayer(void)
{
  Init();
}

CMyPlayer::~CMyPlayer(void)
{
}

void CMyPlayer::Init()
{
  for(int i=0;i<15;i++)
  {
    for(int j=0;j<15;j++)
    {
      m_ChessStatus[i][j]=EMPTY;
      m_ScoreForBlack.SC[i][j].score=0;
      m_ScoreForWhite.SC[i][j].score=0;
      m_TotalScore.TS[i][j].score=0;
    }
  }
}

//重置,恢复到初始状态
void CMyPlayer::Reset(void)
{
  Init();
}

//设置指定位置的棋子状态
bool CMyPlayer::SetChessByPos(int x, int y, int ChessStatus)
{
  if(x<0||x>=15||y<0||y>=15||ChessStatus<0||ChessStatus>2)
    return false;

  m_ChessStatus[x][y]=ChessStatus;
  return true;
}

//获得某位置的棋子状态
int CMyPlayer::GetChessByPos(int x, int y)
{
  if(x<0||x>=15||y<0||y>=15)
    return -1;

  return m_ChessStatus[x][y];
}

//获得 player 将要下的位置,如果出错,返回 false 否则返回 true
bool CMyPlayer::GetPosFromPlayer(Point* point, int player, bool PlayNow/*=true*/)
{
  //扫描生存空间
  ScanLivingSpace(BLACK);
  ScanLivingSpace(WHITE);

  //特殊情况
  if(m_BlackLSC.GetListCount()==572&&m_WhiteLSC.GetListCount()==572)
  {
    point->x=7;
    point->y=7;
  }
  else
  {
    //为生存空间评分
    GradePos(BLACK);
    GradePos(WHITE);
    //计算总分并获取分值最高点
    CalculateTotalScoreForPos(player);
    GetBestPosByTotalScore(point);
  }

  if(GetChessByPos(point->x,point->y)!=EMPTY)
    return false;

  if(PlayNow)
    return SetChessByPos(point->x,point->y,player);
  else
    return true;
}

//判断 player 是否获胜
bool CMyPlayer::IsWin(int player)
{
  ScanLivingSpace(player);
  CMyList& LSC=(player==BLACK)?m_BlackLSC:m_WhiteLSC;

  if(!LSC.MoveFirst())
    return false;
  do{//遍历所有节点
    if(LSC.GetCurrentLS()->Grade==5)
      return true;
  }
  while(LSC.MoveNext());
  return false;
}

//扫描某方的生存空间
void CMyPlayer::ScanLivingSpace(int player)
{
  CMyList& LSC=(player==BLACK)?m_BlackLSC:m_WhiteLSC;
  LSC.Init();//初始化

  //删除死亡的生存间并为各生存空间评定等级
  int i,count;
  Point pos;
  if(!LSC.MoveFirst())
    return;
  do{//遍历所有节点
    pos.x=LSC.GetCurrentLS()->x;
    pos.y=LSC.GetCurrentLS()->y;
    count=0;
    for(i=0;i<5;i++)
    {
      if(m_ChessStatus[pos.x][pos.y]==player)
      {
        count++;
      }
      else if(m_ChessStatus[pos.x][pos.y]!=EMPTY)
      {
        count=100;
        break;
      }

      switch(LSC.GetCurrentLS()->Direction)
      {
      case DIR_RIGHT:    pos.x++;      break;
      case DIR_RIGHTDOWN:  pos.x++;pos.y++;  break;
      case DIR_DOWN:    pos.y++;      break;
      case DIR_LEFTDOWN:  pos.x--;pos.y++;  break;
      default:MessageBox(NULL,"出现内部错误!","错误",MB_OK|MB_ICONERROR);
      }
    }
    if(count>=100)
      LSC.Delete();
    else
      LSC.GetCurrentLS()->Grade=count;
  }
  while(LSC.MoveNext());
}

//为某方评各个位置的单方得分
void CMyPlayer::GradePos(int player)
{
  CMyList& LSC=(player==BLACK)?m_BlackLSC:m_WhiteLSC;
  MyScore& Score=(player==BLACK)?m_ScoreForBlack:m_ScoreForWhite;
  int x,y;
  double score=0;

  int i,j;
  //重置所有位置的得分。
  for(i=0;i<15;i++)
  {
    for(j=0;j<15;j++)
    {
      Score.SC[i][j].score=0;
    }
  }

  if(!LSC.MoveFirst())
    return;
  do{//遍历所有节点
    x=LSC.GetCurrentLS()->x;
    y=LSC.GetCurrentLS()->y;

    switch(LSC.GetCurrentLS()->Grade)
    {
    case 0:score=ZERO;  break;
    case 1:score=ONE;  break;
    case 2:score=TWO;  break;
    case 3:score=THREE;  break;
    case 4:score=FOUR;  break;
    default:score=0;
    }

    for(i=0;i<5;i++)
    {
      if(GetChessByPos(x,y)==EMPTY)
        Score.SC[x][y].score+=score;

      switch(LSC.GetCurrentLS()->Direction)
      {
      case DIR_RIGHT:    x++;    break;
      case DIR_RIGHTDOWN:  x++;y++;  break;
      case DIR_DOWN:    y++;    break;
      case DIR_LEFTDOWN:  x--;y++;  break;
      default:MessageBox(NULL,"出现内部错误!","错误",MB_OK|MB_ICONERROR);
      }
    }
  }
  while(LSC.MoveNext());
}

//计算各个位置相对某方的总分
void CMyPlayer::CalculateTotalScoreForPos(int player)
{
  for(int i=0;i<15;i++)
  {
    for(int j=0;j<15;j++)
    {
      m_TotalScore.TS[i][j].score=m_ScoreForBlack.SC[i][j].score+m_ScoreForWhite.SC[i][j].score;
      if(player==BLACK)
      {
        m_TotalScore.TS[i][j].score+=(m_ScoreForBlack.SC[i][j].score==0)?0:ADDITIONAL;
      }
      else
      {
        m_TotalScore.TS[i][j].score+=(m_ScoreForWhite.SC[i][j].score==0)?0:ADDITIONAL;
      }
    }
  }
}

//获得总分最好的位置
void CMyPlayer::GetBestPosByTotalScore(Point* point)
{
  double tmp_Score=0;

  for(int i=0;i<15;i++)
  {
    for(int j=0;j<15;j++)
    {
      if(m_TotalScore.TS[i][j].score>=tmp_Score)
      {
        tmp_Score=m_TotalScore.TS[i][j].score;
        point->x=i;
        point->y=j;
      }
    }
  }
}


// ---MyPlayer.h---------------------------------------------------
//


#pragma once

#include ".\mylist.h"

//用于保存分数的数据结构
struct Score
{
  double score;
};

struct TotalScore
{
  double score;
};

struct MyScore
{
  struct Score SC[15][15];
};

struct MyTotalScore
{
  struct TotalScore TS[15][15];
};

class CMyPlayer
{
public:
  CMyPlayer(void);
  ~CMyPlayer(void);

protected:
  int m_ChessStatus[15][15];//标示棋盘上各位置的棋子状态
  MyScore m_ScoreForBlack;//标示棋盘上各位置相对黑方的单方价值
  MyScore m_ScoreForWhite;//标示棋盘上各位置相对白方的单方价值
  MyTotalScore m_TotalScore;//标示棋盘上各位置相对某方的总价值

  CMyList m_BlackLSC;//黑子的生存空间集合
  CMyList m_WhiteLSC;//白子的生存空间集合

protected:
  void ScanLivingSpace(int player);
  void GradePos(int player);
  void CalculateTotalScoreForPos(int player);
  void GetBestPosByTotalScore(Point* point);

public:
  void Init();
  void Reset(void);
  bool SetChessByPos(int x, int y, int ChessStatus);
  int GetChessByPos(int x, int y);
  bool GetPosFromPlayer(Point* point, int player, bool PlayNow=true);
  bool IsWin(int player);
};


// ---play.cpp-----------------------------------------------------
// Defines the entry point for the DLL application.
//
#include "stdafx.h"
#include "player.h"
#include "MyPlayer.h"

////////////////////////////////////////////////////////////////////
//    方 法 声 明
//...
//<<< 接口
void Reset();
bool SetChessByPos(Point pos,int flag);
int  GetChessByPos(Point pos);

//获得电脑计算出的下子位置
bool GetPosFromPlayer(Point* pos,int flag);
bool IsWin(int flag);
//>>> 接口
//唯一的 CMyPlayer 类变量
CMyPlayer ComputerPlayer;

////////////////////////////////////////////////////////////////////
//    函 数 定 义
//...

BOOL APIENTRY DllMain( HANDLE hModule,
                      DWORD  ul_reason_for_call,
                      LPVOID lpReserved
          )
{
    return TRUE;
}

//<<< 接口
void Reset()
{
  ComputerPlayer.Reset();
}

bool SetChessByPos(Point pos,int flag)
{
  return ComputerPlayer.SetChessByPos(pos.x,pos.y,flag);
}

int  GetChessByPos(Point pos)
{
  return ComputerPlayer.GetChessByPos(pos.x,pos.y);
}

//{{{{{{{{{{{{{--- 电脑计算函数 ---{{{{{{{{{{{{{{{
bool GetPosFromPlayer(Point* pPos,int flag)
{
  return ComputerPlayer.GetPosFromPlayer(pPos,flag);
}
//}}}}}}}}}}}}}--- 电脑计算函数 ---}}}}}}}}}}}}}}}

bool IsWin(int flag)//判断flag是否获胜
{
  return ComputerPlayer.IsWin(flag);
}
//>>>>> 接口


// ---play.h--------------------------------------------------------


//////////////////////////////////////////////////////////////////
//
//            导 出 函 数 列 表
//
//////////////////////////////////////////////////////////////////
//重置到初始产状态
extern "C" _declspec(dllexport) void Reset();

//设置position位置的棋子为flag
extern "C" _declspec(dllexport) bool SetChessByPos(Point pos,int flag);

//获得position位置的棋子
extern "C" _declspec(dllexport) int GetChessByPos(Point pos);
//获得电脑要下的位置
extern "C" _declspec(dllexport) bool GetPosFromPlayer(Point* pos,int flag);

//判断flag是否获胜
extern "C" _declspec(dllexport) bool IsWin(int flag);

关于这篇文章的评论 [注意:这里仅仅是给大家提供了一个发表对文章本身看法的地方,如果有疑问,请到论坛提出] 我要提问!
标题
内容
发言
*您尚未以注册用户身份登录,不能发表评论。这里登录
您的位置
  (c)2000-2020 Yup Studio, all rights reserved.  
82.03125