Othello UVA - 220

本文分享了一段使用C++实现的Reversi(翻转棋)博弈算法代码,详细展示了如何通过遍历棋盘来判断合法落子位置,并实现了棋子的翻转逻辑。文章代码包括了棋盘状态更新、玩家交替、棋子计数等功能,适用于理解Reversi游戏规则及算法实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

过了udebug的所有数据以及各种数据但是就是wa不知道为什么 哎

只能先放着了 以后再来写写看把

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <algorithm>

using namespace std;

struct node 
{
    int x,y;
}num[111],num1[111];

int m1[8]={1,1,0,-1,-1,-1,0,1};
int m2[8]={0,1,1,1,0,-1,-1,-1};

bool judge(int x,int y)
{
    if(x>=1&&x<=8&&y>=1&&y<=8)
        return true;
    return false;
}

bool cmp(struct node a,struct node b)
{
    if(a.x==b.x)
        return a.y<b.y;
    return a.x<b.x;
}
char map[10][10];
    int map1[10][10];
int xuan;
int L(int fg)
{
    int ans=0;
    memset(map1,0,sizeof(map1));
                int cont=0;
                if(xuan==0)
                {
                    for(int i=1;i<=8;i++)
                    {
                        for(int j=1;j<=8;j++)
                        {
                            if(map[i][j]=='W')
                            {
                                int x1,y1;
                                for(int m=0;m<8;m++)
                                {
                                    int fg1=0;
                                    x1=i+m1[m];
                                    y1=j+m2[m];
                                    while(judge(x1,y1)&&map[x1][y1]=='B')
                                    {
                                        fg1=1;
                                        x1+=m1[m];
                                        y1+=m2[m];
                                    }
                                    if(judge(x1,y1)&&fg1==1&&map[x1][y1]=='-'&&map1[x1][y1]==0)
                                    {
                                        map1[x1][y1]=1;
                                        num[cont].x=x1;
                                        num[cont].y=y1;
                                        cont++;
                                    }
                                    
                                }
                            }
                        }
                    }
                }
                else if(xuan==1)
                {
                    for(int i=1;i<=8;i++)
                    {
                        for(int j=1;j<=8;j++)
                        {
                            if(map[i][j]=='B')
                            {
                                int x1,y1;
                                for(int m=0;m<8;m++)
                                {
                                    int fg1=0;
                                    x1=i+m1[m];
                                    y1=j+m2[m];
                                    while(judge(x1,y1)&&map[x1][y1]=='W')
                                    {
                                        fg1=1;
                                        x1+=m1[m];
                                        y1+=m2[m];
                                    }
                                    if(judge(x1,y1)&&fg1==1&&map[x1][y1]=='-'&&map1[x1][y1]==0)
                                    {
                                        map1[x1][y1]=1;
                                        num[cont].x=x1;
                                        num[cont].y=y1;
                                        cont++;
                                    }
                                   
                                }
                            }
                        }
                    }
                }
                //cout<<"!!!"<<cont<<endl;
                if(cont==0)
                {
                    if(fg==0)
                        cout<<"No legal move."<<endl;
                    ans=0;
                }
                else
                {
                    ans=1;
                    if(fg==0)
                    {
                        sort(num,num+cont,cmp);
                    for(int i2=0;i2<cont;i2++)
                    {
                    if(i2==0)
                        cout<<"("<<num[i2].x<<","<<num[i2].y<<")";
                    else
                        cout<<" ("<<num[i2].x<<","<<num[i2].y<<")";
                    }
                    cout<<endl;
                    }
                    
                }
                return ans;
}
int main()
{
    //freopen("out.txt","w",stdout);
    int n;
    cin>>n;
    int fff=0;
    while(n--)
    {
        if(fff!=0)
            cout<<endl;
        memset(map,'\0',sizeof(map));
        for(int i=1;i<=8;i++)
        {
            getchar();
            for(int j=1;j<=8;j++)
            {
                cin>>map[i][j];
            }
        }
        char str;
        while(1)
        {
            getchar();
            cin>>str;
            if(str=='Q')
            {
                fff++;
                for(int i=1;i<=8;i++)
                {
                    for(int j=1;j<=8;j++)
                    {
                        cout<<map[i][j];
                    }
                    cout<<endl;
                }
                
                break;
            }
            else if(str=='W')
            {
                xuan=0;
                continue;
            }
            else if(str=='B')
            {
                xuan=1;
                continue;
            }
            else if(str=='L')
            {
                int LL=L(0);
            }
            else if(str=='M')
            {
                int pp=L(1);
                if(pp==0)
                {
                    if(xuan==0)
                        xuan=1;
                    else if(xuan==1)
                        xuan=0;
                }
                char s[2];
                scanf("%s",s);
                //puts(s);
                int x1,y1;
                x1=s[0]-'0';
                y1=s[1]-'0';
                if(xuan==0)
                {
                    map[x1][y1]='W';
                    int cont2=0;
                    for(int i=0;i<8;i++)
                    {
                        int x2,y2;
                        x2=x1+m1[i];
                        y2=y1+m2[i];
                        int fg2=0;
                        while(judge(x2,y2)&&map[x2][y2]=='B')
                        {
                            fg2=1;
                            num1[cont2].x=x2;
                            num1[cont2].y=y2;
                            x2+=m1[i];
                            y2+=m2[i];
                            //cout<<x2<<"!@#"<<y2<<endl;
                            cont2++;
                        }
                        if(judge(x2,y2)&&fg2==1&&map[x2][y2]=='W')
                        {
                            
                            for(int i1=0;i1<cont2;i1++)
                            {
                                //cout<<"!!!"<<num1[i1].x<<"!!"<<num1[i1].y<<endl;
                                map[num1[i1].x][num1[i1].y]='W';
                            }
                        }
                        else
                            cont2=0;
                    }
                    xuan=1;
                    int a1=0;
                int b1=0;
                for(int j1=1;j1<=8;j1++)
                {
                    for(int j2=1;j2<=8;j2++)
                    {
                        if(map[j1][j2]=='B')
                            a1++;
                        else if(map[j1][j2]=='W')
                            b1++;
                    }
                }
                printf("Black - %2d White - %2d\n",a1,b1);
             
                   
                }
                else if(xuan==1)
                {
                    map[x1][y1]='B';
                    int cont2=0;
                    for(int i=0;i<8;i++)
                    {
                        int x2,y2;
                        x2=x1+m1[i];
                        y2=y1+m2[i];
                        int fg2=0;
                        while(judge(x2,y2)&&map[x2][y2]=='W')
                        {
                            fg2=1;
                            num1[cont2].x=x2;
                            num1[cont2].y=y2;
                            x2+=m1[i];
                            y2+=m2[i];
                            cont2++;
                        }
                        if(judge(x2,y2)&&fg2==1&&map[x2][y2]=='B')
                        {
                            for(int i1=0;i1<cont2;i1++)
                            {
                                map[num1[i1].x][num1[i1].y]='B';
                            }
                        }
                        else
                            cont2=0;
                    }
                    xuan=0;
                    int a1=0;
                int b1=0;
                for(int j1=1;j1<=8;j1++)
                {
                    for(int j2=1;j2<=8;j2++)
                    {
                        if(map[j1][j2]=='B')
                            a1++;
                        else if(map[j1][j2]=='W')
                            b1++;
                    }
                }
                printf("Black - %2d White - %2d\n",a1,b1);
               
                }
                
            }
            
        }
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值