象棋

本文深入探讨了一种中国象棋博弈算法的实现细节,通过分析不同棋子的移动规则和攻击范围,构建了一个能够判断棋局胜负的智能系统。文章详细介绍了车、马、炮、帅等棋子的走法及对局中可能产生的威胁,同时提供了一段AC代码示例,展示了如何用C++语言实现这一复杂算法。

4-1
此题ac但是非常的长,用了我一天半的时间,服了

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
/*
2 1 4
G 10 5
R 6 4

3 1 5
H 4 5
G 10 5
C 7 5

0 0 0
//车是R,马是H,炮是C,帅是G
*/
using namespace std;
char c[11][10];//棋子类型是啥
int a[11][10];//会被吃掉的地方
int b[11][10];//此地是否有棋子
int checkpoint(int x, int y)//x,y处是否有棋子
{
    if(b[x][y])
    {
        return 1;
    }
    else
        return 0;
}
void setr(int x, int y)//车能够吃得到的地方
{
    for(int i = x-1; i >= 1; --i)
    {
        if(!checkpoint(i, y) || c[i][y] == 'J')
        {
            ++a[i][y];
            //cout << i << " " << y << endl;
        }
        else if(c[i][y] != 'J')
        {
            ++a[i][y];
            break;
        }


    }
    for(int i = x+1; i <= 10; ++i)
    {
        if(!checkpoint(i, y) || c[i][y] == 'J')
        {
            ++a[i][y];
            //cout << i << " " << y << endl;
        }
        else if(c[i][y] != 'J')
        {
            ++a[i][y];
            break;
        }
    }
    for(int j = y+1; j <= 9; ++j)
    {
        if(!checkpoint(x, j) || c[x][j] == 'J')
        {
            ++a[x][j];
            //cout << x << " " << j << endl;
        }
        else if(c[x][j] != 'J')
        {
            ++a[x][j];
            break;
        }

    }
    for(int j = y-1; j >= 1; --j)
    {
        if(!checkpoint(x, j) || c[x][j] == 'J')
        {
            ++a[x][j];
            //cout << x << " " << j << endl;
        }
        else if(c[x][j] != 'J')
        {
            ++a[x][j];
            break;
        }
    }
}
void clearr(int x, int y)//清除车能够吃得到的地方
{
     for(int i = x-1; i >= 1; --i)
    {
        if(!checkpoint(i, y) || c[i][y] == 'J')
        {
            --a[i][y];

        }
        else if(c[i][y] != 'J')
        {
            --a[i][y];
            break;
        }


    }
    for(int i = x+1; i <= 10; ++i)
    {
        if(!checkpoint(i, y) || c[i][y] == 'J')
        {
            --a[i][y];

        }
        else if(c[i][y] != 'J')
        {
            --a[i][y];
            break;
        }
    }
    for(int j = y+1; j <= 9; ++j)
    {
        if(!checkpoint(x, j) || c[x][j] == 'J')
        {
            --a[x][j];

        }
        else if(c[x][j] != 'J')
        {
            --a[x][j];
            break;
        }

    }
    for(int j = y-1; j >= 1; --j)
    {
        if(!checkpoint(x, j) || c[x][j] == 'J')
        {
            --a[x][j];

        }
        else if(c[x][j] != 'J')
        {
            --a[x][j];
            break;
        }
    }
}
void seth(int x, int y)//马可能够吃到的地方
{
    if((x+2)<=10 && !(checkpoint(x+1, y)))
    {
        if(y-1>=1)
        {
            ++a[x+2][y-1];
            //cout << x+2 << " " << y-1 << endl;
        }
        if(y+1<=9)
        {
            ++a[x+2][y+1];
            //cout << x+2 << " " << y+1 << endl;
        }
    }
    if((x-2)>=1 && !(checkpoint(x-1,y)))
    {
        if(y-1>=1)
        {
            ++a[x-2][y-1];
            //cout << x-2 << " " << y-1 << endl;
        }
        if(y+1<=9)
        {
            ++a[x-2][y+1];
            //cout << x-2 << " " << y+1 << endl;
        }
    }
    if((y+2)<=9 && !(checkpoint(x,y+1)))
    {
        if(x-1>=1)
        {
            ++a[x-1][y+2];
            //cout << x-1 << " " << y+2 << endl;
        }
        if(x+1<=10)
        {
            ++a[x+1][y+2];
            //cout << x+1 << " " << y+2 << endl;
        }
    }
    if((y-2)>=1 &&!(checkpoint(x,y-1)))
    {
         if(x-1>=1)
        {
            ++a[x-1][y-2];
            //cout << x-1 << " " << y-2 << endl;
        }
        if(x+1<=10)
        {
            ++a[x+1][y-2];
            //cout << x+1 << " " << y-2 << endl;
        }
    }
}
void clearh(int x, int y)//清除马可能够吃到的地方
{
    if((x+2)<=10 && !(checkpoint(x+1, y)))
    {
        if(y-1>=1)
        {
            --a[x+2][y-1];
        }
        if(y+1<=9)
        {
            --a[x+2][y+1];
        }
    }
    if((x-2)>=1 && !(checkpoint(x-1,y)))
    {
        if(y-1>=1)
        {
            --a[x-2][y-1];
        }
        if(y+1<=9)
        {
            --a[x-2][y+1];
        }
    }
    if((y+2)<=9 && !(checkpoint(x,y+1)))
    {
        if(x-1>=1)
        {
            --a[x-1][y+2];
        }
        if(x+1<=10)
        {
            --a[x+1][y+2];
        }
    }
    if((y-2)>=1 &&!(checkpoint(x,y-1)))
    {
         if(x-1>=1)
        {
            --a[x-1][y-2];
        }
        if(x+1<=10)
        {
            --a[x+1][y-2];
        }
    }
}
void setc(int x, int y)//能被炮吃掉的坐标置1;
{
    for(int i = x-1; i >= 0; --i)
    {
        if(checkpoint(i, y) && c[i][y] != 'J')
        {
            for(int n = i-1; n >= 0; --n)
            {
                if(!checkpoint(n, y) || c[n][y] == 'J')
                {
                    ++a[n][y];
                    //cout << n << " " << y << endl;
                }
                else
                {
                    ++a[n][y];
                    break;
                }//炮可能有缺陷
            }
            break;
        }
    }
    for(int j = y+1; y <= 9; ++j)
    {
        if(checkpoint(x, j) && c[x][j] != 'J')
        {
            for(int n = j+1; n <= 9; ++n)
            {
                if(!checkpoint(x, n) || c[x][n] == 'J')
                {
                    ++a[x][n];
                    //cout << x << " " << n << endl;
                }
                else
                {
                    ++a[x][n];
                    break;
                }
            }
            break;
        }
    }
    for(int j = y-1; j >= 1; --j)
    {
        if(checkpoint(x, j) && c[x][j] != 'J')
        {
            for(int n = j-1; n>=1; --n)
            {
                if(!checkpoint(x, n) || c[x][n] == 'J')
                {
                    ++a[x][n];
                    //cout << x << " " << n << endl;
                }
                else
                {
                    ++a[x][n];
                    break;
                }
            }
            break;
        }
    }
}

void setg(int x, int y)
{
    for(int i = x-1; i >= 1; --i)
    {
        if(checkpoint(i,y) && c[i][y] != 'J')
        {
            ++a[i][y];
            break;
        }
        else
        {
            ++a[i][y];
            //cout << i << " " << y << endl;
        }
    }

}

int checkj(int x, int y)//检查奖是否会被吃掉,会返回1;也有缺陷
{
    for(int i = x+1; i <= 10; ++i)
    {
        if(checkpoint(i,y))
        {
            if(c[i][y] != 'G')
            {
                break;
            }
            else if(c[i][y] == 'G')
            {
                return 0;
            }
        }
    }

    if((x+1)<=3)
    {
        if(checkpoint(x+1,y) && a[x+1][y] < 1)
        {
            if(c[x+1][y] == 'R')
            {
                clearr(x+1,y);
            }
            else if(c[x+1][y] == 'H')
            {
                clearh(x+1,y);
            }

        }
    }
    if(x-1>=1)
    {
        if(checkpoint(x-1,y) && a[x-1][y] < 1)
        {
            if(c[x-1][y] == 'R')
            {
                clearr(x-1,y);
            }
            else if(c[x-1][y] == 'H')
            {
                clearh(x-1,y);
            }

        }
    }
    if(y+1<=6)
    {
        if(checkpoint(x,y+1) && a[x][y+1] < 1)
        {
            if(c[x][y+1] == 'R')
            {
                clearr(x,y+1);
            }
            else if(c[x][y+1] == 'H')
            {
                clearh(x,y+1);
            }

        }
    }
    if(y-1>=4)
    {
         if(checkpoint(x,y-1) && a[x][y-1] < 1)
        {
            if(c[x][y-1] == 'R')
            {
                clearr(x,y-1);
            }
            else if(c[x][y-1] == 'H')
            {
                clearh(x,y-1);
            }

        }
    }
    if(a[x+1][y] != 0 && a[x-1][y] != 0 && a[x][y+1] != 0 && a[x][y-1] != 0)
    {
        //cout << a[x+1][y] << " " <<a[x-1][y] << " " << a[x][y+1] << " " <<a[x][y-1];
        return 1;
    }
    else
    {
        return 0;
    }

}


int main()
{
   //freopen("data.out", "w", stdout);
    int countn = 0;
    int t[3];
    while((cin >> t[0] >> t[1] >> t[2]))
    {
        if(t[0] == 0)
        {
            return 0;
        }
        memset(a, 0, sizeof(a));
        memset(b, 0, sizeof(b));
        memset(c, '0', sizeof(c));
        for(int j = 0; j < 10; ++j)
        {
            a[0][j] = 1;
        }
        for(int j = 4;j<=6;++j)
        {
            a[4][j] = 1;
        }
        for(int i = 1; i <= 3; ++i)
        {
            a[i][3] = 1;
        }
        for(int i = 1; i <= 3;++i)
        {
            a[i][7] = 1;
        }
        c[t[1]][t[2]] = 'J';
        b[t[1]][t[2]] = 1;
        while(t[0]--)
        {
            int a1, a2;
            char a3;
            cin >> a3 >> a1 >> a2;
            c[a1][a2] = a3;
            b[a1][a2] = 1;
        }

        for(int i = 1; i <= 10; ++i)
        {
            for(int j = 1; j <= 9; ++j)
            {
                if(c[i][j] == 'R')
                    setr(i, j);
                else if(c[i][j] == 'H')
                    seth(i, j);
                else if(c[i][j] == 'C')
                    setc(i, j);
                else if(c[i][j] == 'G')
                    setg(i, j);
            }
        }
        if(checkj(t[1], t[2]))
        {
            printf("%s\n", "YES");
            //cout << ++countn << endl;
        }

        else
        {
            printf("%s\n", "NO");
           // cout << ++countn << endl;
        }



    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值