⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 movegenerator.cpp

📁 这是使用 C++ 写的棋子游戏
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// MoveGenerator.cpp: implementation of the CMoveGenerator class.
//
//////////////////////////////////////////////////////////////////////

#include "MoveGenerator.h"
#include <stdlib.h>

#ifdef _DEBUG
#undef THIS_FILE
static BYTE THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CMoveGenerator::CMoveGenerator()
{
    
}

CMoveGenerator::~CMoveGenerator()
{
    
}

int CMoveGenerator::AddMove(int nFromX,int nFromY,int nToX,int nToY,int nPly,int nChessID)
{
    m_MoveList[nPly][m_nMoveCount].From.x=nFromX;
    m_MoveList[nPly][m_nMoveCount].From.y=nFromY;
    m_MoveList[nPly][m_nMoveCount].To.x=nToX;
    m_MoveList[nPly][m_nMoveCount].To.y=nToY;
    m_MoveList[nPly][m_nMoveCount].nChessID=nChessID;
    m_nMoveCount++;

    return m_nMoveCount;
}

//nPly指明当前搜索的层数,每层将走法存在不同的位置,以免覆盖
//nSide指明产生哪一方的走法,TRUE为红方,FALSE是黑方
int CMoveGenerator::CreatePossibleMove(BYTE position[][9],int nPly,int nSide,int nUserChessColor)
{
    int nChessID;
    int i,j;

    m_nMoveCount=0;
    m_nUserChessColor=nUserChessColor;

    for(j=0;j<9;j++)
        for(i=0;i<10;i++)
        {
            if(position[i][j]!=NOCHESS)
            {
                nChessID=position[i][j];

                if(nUserChessColor==REDCHESS)
                {
                    if(!nSide && IsRed(nChessID))
                        continue;//如要产生黑棋走法,跳过红棋
                    
                    if(nSide && IsBlack(nChessID))
                        continue;//如要产生红棋走法,跳过黑棋
                }
                else
                {
                    if(nSide && IsRed(nChessID))
                        continue;//如要产生黑棋走法,跳过红棋
                    
                    if(!nSide && IsBlack(nChessID))
                        continue;//如要产生红棋走法,跳过黑棋
                }

                switch(nChessID)
                {
                case R_KING://红帅
                case B_KING://黑将
                    Gen_KingMove(position,i,j,nPly);
                    break;

                case R_BISHOP://红士
                    Gen_RBishopMove(position,i,j,nPly);
                    break;
                
                case B_BISHOP://黑士
                    Gen_BBishopMove(position,i,j,nPly);
                    break;
                
                case R_ELEPHANT://红相
                case B_ELEPHANT://黑象
                    Gen_ElephantMove(position,i,j,nPly);
                    break;
                
                case R_HORSE://红马
                case B_HORSE://黑马
                    Gen_HorseMove(position,i,j,nPly);
                    break;
                
                case R_CAR://红车
                case B_CAR://黑车
                    Gen_CarMove(position,i,j,nPly);
                    break;

                case R_PAWN://红兵
                    Gen_RPawnMove(position,i,j,nPly);
                    break;
                
                case B_PAWN://黑卒
                    Gen_BPawnMove(position,i,j,nPly);
                    break;
                
                case B_CANON://黑炮
                case R_CANON://红炮
                    Gen_CanonMove(position,i,j,nPly);
                    break;
                
                default:
                    break;
                }
            }
        }

    return m_nMoveCount;
}

void CMoveGenerator::Gen_KingMove(BYTE position[10][9],int i,int j,int nPly)
{
    int x,y;
    
    for(y=0;y<3;y++)
        for(x=3;x<6;x++)
            if(IsValidMove(position,j,i,x,y,m_nUserChessColor))
                AddMove(j,i,x,y,nPly,position[i][j]);

    for(y=7;y<10;y++)
        for(x=3;x<6;x++)
            if(IsValidMove(position,j,i,x,y,m_nUserChessColor))
                AddMove(j,i,x,y,nPly,position[i][j]);
}

//红士
void CMoveGenerator::Gen_RBishopMove(BYTE position[10][9],int i,int j,int nPly)
{
    int x,y;
    
    for(y=7;y<10;y++)
        for(x=3;x<6;x++)
            if(IsValidMove(position,j,i,x,y,m_nUserChessColor))
                AddMove(j,i,x,y,nPly,position[i][j]);
}

//黑士
void CMoveGenerator::Gen_BBishopMove(BYTE position[10][9],int i,int j,int nPly)
{
    int x,y;

    for(y=0;y<3;y++)
        for(x=3;x<6;x++)
            if(IsValidMove(position,j,i,x,y,m_nUserChessColor))
                AddMove(j,i,x,y,nPly,position[i][j]);
}

//象
void CMoveGenerator::Gen_ElephantMove(BYTE position[10][9],int i,int j,int nPly)
{
    int x,y;
    
    //插入右下方的有效走法
    x=j+2;
    y=i+2;
    if(x<9 && y<10 && IsValidMove(position,j,i,x,y,m_nUserChessColor))
        AddMove(j,i,x,y,nPly,position[i][j]);
    
    //插入右上方的有效走法
    x=j+2;
    y=i-2;
    if(x<9 && y>=0 && IsValidMove(position,j,i,x,y,m_nUserChessColor))
        AddMove(j,i,x,y,nPly,position[i][j]);
    
    //插入左下方的有效走法
    x=j-2;
    y=i+2;
    if(x>=0 && y<10 && IsValidMove(position,j,i,x,y,m_nUserChessColor))
        AddMove(j,i,x,y,nPly,position[i][j]);
    
    //插入左上方的有效走法
    x=j-2;
    y=i-2;
    if(x>=0 && y>=0 && IsValidMove(position,j,i,x,y,m_nUserChessColor))
        AddMove(j,i,x,y,nPly,position[i][j]);
}

//马
void CMoveGenerator::Gen_HorseMove(BYTE position[10][9], int i, int j, int nPly)
{
    int x, y;
    
    //插入右下方的有效走法
    x=j+2;//右2
    y=i+1;//下1
    if((x<9 && y<10) && IsValidMove(position,j,i,x,y,m_nUserChessColor))
        AddMove(j,i,x,y,nPly,position[i][j]);
    
    //插入右上方的有效走法
    x=j+2;//右2
    y=i-1;//上1
    if((x<9 && y>=0) && IsValidMove(position,j,i,x,y,m_nUserChessColor))
        AddMove(j,i,x,y,nPly,position[i][j]);
    
    //插入左下方的有效走法
    x=j-2;//左2
    y=i+1;//下1
    if((x>=0 && y<10) && IsValidMove(position,j,i,x,y,m_nUserChessColor))
        AddMove(j,i,x,y,nPly,position[i][j]);

    //插入左上方的有效走法
    x=j-2;//左2
    y=i-1;//上1
    if((x>=0 && y>=0) && IsValidMove(position,j,i,x,y,m_nUserChessColor))
        AddMove(j,i,x,y,nPly,position[i][j]);
    
    //插入右下方的有效走法
    x=j+1;//右1
    y=i+2;//下2 
    if((x<9 && y<10) && IsValidMove(position,j,i,x,y,m_nUserChessColor))
        AddMove(j,i,x,y,nPly,position[i][j]);

    //插入左下方的有效走法
    x=j-1;//左1
    y=i+2;//下2
    if((x>=0 && y<10) && IsValidMove(position,j,i,x,y,m_nUserChessColor))
        AddMove(j,i,x,y,nPly,position[i][j]);    
    
    //插入右上方的有效走法
    x=j+1;//右1
    y=i-2;//上2
    if((x<9 && y >=0) && IsValidMove(position,j,i,x,y,m_nUserChessColor))
        AddMove(j,i,x,y,nPly,position[i][j]);

    //插入左上方的有效走法
    x=j-1;//左1
    y=i-2;//上2
    if((x>=0 && y>=0) && IsValidMove(position,j,i,x,y,m_nUserChessColor))
        AddMove(j,i,x,y,nPly,position[i][j]);
}

//红兵
void CMoveGenerator::Gen_RPawnMove(BYTE position[10][9], int i, int j, int nPly)
{
    int x,y;
    int nChessID;
    
    nChessID=position[i][j];

    if(m_nUserChessColor==REDCHESS)
    {
        y=i-1;//向前
        x=j;
        if(y>0 && !IsSameSide(nChessID,position[y][x]))
            AddMove(j,i,x,y,nPly,position[i][j]);//前方无阻碍
        
        if(i<5)//是否已过河
        {
            y=i;
            
            x=j+1;//右边
            if(x<9 && !IsSameSide(nChessID,position[y][x]))
                AddMove(j,i,x,y,nPly,position[i][j]);
            
            x=j-1;//左边
            if(x>=0 && !IsSameSide(nChessID,position[y][x]))
                AddMove(j,i,x,y,nPly,position[i][j]);
        }
    }
    else
    {
        y=i+1;//向前
        x=j;
        if(y>0 && !IsSameSide(nChessID,position[y][x]))
            AddMove(j,i,x,y,nPly,position[i][j]);//前方无阻碍
        
        if(i>4)//是否已过河
        {
            y=i;
            
            x=j+1;//右边
            if(x<9 && !IsSameSide(nChessID,position[y][x]))
                AddMove(j,i,x,y,nPly,position[i][j]);
            
            x=j-1;//左边
            if(x>=0 && !IsSameSide(nChessID,position[y][x]))
                AddMove(j,i,x,y,nPly,position[i][j]);
        }
    }
}

//黑卒
void CMoveGenerator::Gen_BPawnMove(BYTE position[10][9],int i,int j,int nPly)
{
    int x,y;
    int nChessID;
    
    nChessID=position[i][j];

    if(m_nUserChessColor==REDCHESS)
    {
        y=i+1;//向前
        x=j;
        if(y<10 && !IsSameSide(nChessID,position[y][x]))
            AddMove(j,i,x,y,nPly,position[i][j]);//前方无阻碍
        
        if(i>4)//是否已过河
        {
            y=i;
            
            x=j+1;//右边
            if(x<9 && !IsSameSide(nChessID,position[y][x]))
                AddMove(j,i,x,y,nPly,position[i][j]);
            
            x=j-1;//左边
            if(x>=0 && !IsSameSide(nChessID,position[y][x]))
                AddMove(j,i,x,y,nPly,position[i][j]);
        }
    }
    else
    {
        y=i-1;//向前
        x=j;
        if(y<10 && !IsSameSide(nChessID,position[y][x]))
            AddMove(j,i,x,y,nPly,position[i][j]);//前方无阻碍
        
        if(i<5)//是否已过河
        {
            y=i;
            
            x=j+1;//右边
            if(x<9 && !IsSameSide(nChessID,position[y][x]))
                AddMove(j,i,x,y,nPly,position[i][j]);
            
            x=j-1;//左边
            if(x>=0 && !IsSameSide(nChessID,position[y][x]))
                AddMove(j,i,x,y,nPly,position[i][j]);
        }
    }
}

//车
void CMoveGenerator::Gen_CarMove(BYTE position[10][9], int i, int j, int nPly)
{
    int x,y;
    int nChessID;
    
    nChessID=position[i][j];

    //插入向右的有效的走法
    x=j+1;
    y=i;
    while(x<9)
    {
        if(NOCHESS==position[y][x])
            AddMove(j,i,x,y,nPly,position[i][j]);
        else
        {
            if(!IsSameSide(nChessID,position[y][x]))
                AddMove(j,i,x,y,nPly,position[i][j]);

            break;
        }
        x++;
    }

    //插入向左的有效的走法
    x=j-1;
    y=i;
    while(x>=0)
    {
        if(NOCHESS==position[y][x])
            AddMove(j,i,x,y,nPly,position[i][j]);
        else
        {
            if(!IsSameSide(nChessID,position[y][x]))
                AddMove(j,i,x,y,nPly,position[i][j]);

            break;
        }
        x--;
    }

    //插入向下的有效的走法
    x=j;
    y=i+1;
    while(y<10)
    {
        if(NOCHESS==position[y][x])
            AddMove(j,i,x,y,nPly,position[i][j]);
        else
        {
            if(!IsSameSide(nChessID,position[y][x]))
                AddMove(j,i,x,y,nPly,position[i][j]);

            break;
        }
        y++;
    }

    //插入向上的有效的走法
    x=j;
    y=i-1;
    while(y>=0)
    {
        if(NOCHESS==position[y][x])
            AddMove(j,i,x,y,nPly,position[i][j]);
        else
        {
            if(!IsSameSide(nChessID,position[y][x]))
                AddMove(j,i,x,y,nPly,position[i][j]);

            break;
        }
        y--;
    }
}

//炮
void CMoveGenerator::Gen_CanonMove(BYTE position[10][9], int i, int j, int nPly)
{
    int x,y;
    BOOL flag;
    int nChessID;
    
    nChessID=position[i][j];

    //插入向右的有效的走法
    x=j+1;
    y=i;
    flag=FALSE;
    while(x<9)
    {
        if(NOCHESS==position[y][x])
        {
            if(!flag)//隔有棋子
                AddMove(j,i,x,y,nPly,position[i][j]);
        }
        else
        {
            if(!flag)//没有隔棋子,此棋子是第一个障碍,设置标志
                flag=TRUE;
            else     //隔有棋子,此处如为敌方棋子,则可走
            {
                if(!IsSameSide(nChessID,position[y][x]))
                    AddMove(j,i,x,y,nPly,position[i][j]);
                break;
            }
        }
        x++;//继续下一个位置
    }

    //插入向左的有效的走法
    x=j-1;
    y=i;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -