Uva220 Othello




1.输出格式注意 程序结束的结尾换行是否有多 

2.输出黑白棋子数的时候数字%2d输出

3.边界值注意

4.打印所有合法点的时候两点之间有空格 最有一个点输出没有空格

5.可用Udebug上的测试数据测试下(不全)

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
char board[8][8]={},current;
int up(char current,int i,int j)			//判断是否合法   //上 
{
    if(board[i-1][j]==current||board[i-1][j]=='-'||board[i][j]!='-')
    {
        return 0;
    }
    else
    {
        for(int m=i-2;m>=0;m--)
        {
            if(board[m][j]=='-')
                return 0;
            else if(board[m][j]==current)
                return 1;
        }
    }
    return 0;
}
int down(char current,int i,int j)        //下 
{
    if(board[i+1][j]==current||board[i+1][j]=='-'||board[i][j]!='-')
        return 0;
    else
    {
        for(int m=i+2;m<8;m++)
        {
            if(board[m][j]=='-')
                return 0;
            else if(board[m][j]==current)
                return 1;
        }
    }
    return 0;
}
int left(char current,int i,int j)				//左 
{
    if(board[i][j-1]==current||board[i][j-1]=='-'||board[i][j]!='-')
        return 0;
    else
    {
        for(int n=j-2;n>=0;n--)
        {
            if(board[i][n]=='-')
                return 0;
            else if(board[i][n]==current)
                return 1;
        }
    }
    return 0;
}
int right(char current,int i,int j)				//右 
{
    if(board[i][j+1]==current||board[i][j+1]=='-'||board[i][j]!='-')
        return 0;
    else
    {
        for(int n=j+2;n<8;n++)
        {
            if(board[i][n]=='-')
                return 0;
            else if(board[i][n]==current)
                return 1;
        }
    }
    return 0;
}
int leftup(char current,int i,int j)			//左上 
{
    if(board[i-1][j-1]==current||board[i-1][j-1]=='-'||board[i][j]!='-')
        return 0;
    else
    {
        for(int m=i-2,n=j-2;m>=0&&n>=0;m--,n--)
        {
            if(board[m][n]=='-')
                return 0;
            else if(board[m][n]==current)
                return 1;
        }
    }
    return 0;
}
int rightup(char current,int i,int j)			//右上 
{
    if(board[i-1][j+1]==current||board[i-1][j+1]=='-'||board[i][j]!='-')
        return 0;
    else
    {
        for(int m=i-2,n=j+2;m>=0&&n<8;m--,n++)
        {
            if(board[m][n]=='-')
                return 0;
            else if(board[m][n]==current)
                return 1;
        }
    }
    return 0;
}
int leftdown(char current,int i,int j)			//左下 
{
    if(board[i+1][j-1]==current||board[i+1][j-1]=='-'||board[i][j]!='-')
        return 0;
    else
    {
        for(int m=i+2,n=j-2;m<8&&n>=0;m++,n--)
        {
            if(board[m][n]=='-')
                return 0;
            else if(board[m][n]==current)
                return 1;
        }
    }
    return 0;
}
int rightdown(char current,int i,int j)			//右下 
{
    if(board[i+1][j+1]==current||board[i+1][j+1]=='-'||board[i][j]!='-')
        return 0;
    else
    {
        for(int m=i+2,n=j+2;m<8&&n<8;m++,n++)
        {
            if(board[m][n]=='-')
                return 0;
            else if(board[m][n]==current)
                return 1;
        }
    }
    return 0;
}
void num()                              //计算当前棋面黑白子的个数
{
    int B=0,W=0;
    for(int i=0;i<8;i++)
        for(int j=0;j<8;j++)
    {
        if(board[i][j]=='B') B++;
        if(board[i][j]=='W') W++;
    }
    printf("Black - %2d White - %2d\n",B,W);
}
void L(char current)                    //输出当前玩家所有合法操作
{
    int flag=0,temp=0,p=0;
    for(int i=0;i<8;i++)
    {
        for(int j=0;j<8;j++)
        {
            if(up(current,i,j)||down(current,i,j)||left(current,i,j)||right(current,i,j)||leftup(current,i,j)||rightup(current,i,j)||leftdown(current,i,j)||rightdown(current,i,j))
            {
                temp++;
            }
        }
    }
        for(int i=0;i<8;i++)
        {
        for(int j=0;j<8;j++)
        {
            if(up(current,i,j)||down(current,i,j)||left(current,i,j)||right(current,i,j)||leftup(current,i,j)||rightup(current,i,j)||leftdown(current,i,j)||rightdown(current,i,j))
            {
                flag=1;
                cout<<'('<<i+1<<','<<j+1<<')';
                if(p!=temp-1)
                {
                    cout<<' ';
                    p++;
                }

                else
                    p++;
            }
        }
        }

    if(flag==0)
    {
        cout<<"No legal move.";
    }
            cout<<endl;

}
int L2(char current)                    //判断当前玩家是否有合法操作
{
    for(int i=0;i<8;i++)
    {
        for(int j=0;j<8;j++)
        {
            if(up(current,i,j)||down(current,i,j)||left(current,i,j)||right(current,i,j)||leftup(current,i,j)||rightup(current,i,j)||leftdown(current,i,j)||rightdown(current,i,j))
            {
                return 1;
            }

        }
    }
    return 0;
}
void Mup(int r,int c)						//翻转棋子 
{
    board[r][c]=current;
    if(board[r-1][c]!=current&&board[r-1][c]!='-')
    {
        for(int m=r-2;m>=0;m--)
        {
            if(board[m][c]=='-')
            break;
			if(board[m][c]==current)
            {
                for(int p=r-1;p>=m;p--)
                    board[p][c]=current;
                break;
            }
        }
    }

}
void Mdown(int r,int c)
{
    board[r][c]=current;
    if(board[r+1][c]!=current&&board[r+1][c]!='-')
    {
        for(int m=r+2;m<8;m++)
        {
        	if(board[m][c]=='-')
        	break;
            if(board[m][c]==current)
            {
                for(int p=r+1;p<=m;p++)
                    board[p][c]=current;
                break;
            }
        }
    }
}
void Mleft(int r,int c)
{
    board[r][c]=current;
    if(board[r][c-1]!=current&&board[r][c-1]!='-')
    {
        for(int n=c-2;n>=0;n--)
        {
        	if(board[r][n]=='-')
        	break;
            if(board[r][n]==current)
            {
                for(int q=c-1;q>=n;q--)
                    board[r][q]=current;
                break;
            }
        }
    }
}
void Mright(int r,int c)
{
    board[r][c]=current;
    if(board[r][c+1]!=current&&board[r][c+1]!='-')
    {
        for(int n=c+2;n<8;n++)
        {
        	if(board[r][n]=='-')
        	break;
            if(board[r][n]==current)
            {
                for(int q=c+1;q<n;q++)
                {
                    board[r][q]=current;
                }
                break;
            }
        }
    }
}
void Mleftup(int r,int c)
{
    board[r][c]=current;
    if(board[r-1][c-1]!=current&&board[r-1][c-1]!='-')
    {
        for(int m=r-2,n=c-2;m>=0&&n>=0;m--,n--)
        {
        	if(board[m][n]=='-')
        	break;
            if(board[m][n]==current)
            {
                for(int p=r-1,q=c-1;p>m&&q>n;p--,q--)
                    board[p][q]=current;
                break;
            }
        }
    }
}
void Mrightup(int r,int c)
{
    board[r][c]=current;
    if(board[r-1][c+1]!=current&&board[r-1][c+1]!='-')
    {
        for(int m=r-2,n=c+2;m>=0&&n<8;m--,n++)
        {
        	if(board[m][n]=='-')
        	break;
            if(board[m][n]==current)
            {
                for(int p=r-1,q=c+1;p>m&&q<n;p--,q++)
                    board[p][q]=current;
                break;
            }
        }
    }
}
void Mleftdown(int r,int c)
{
    board[r][c]=current;
    if(board[r+1][c-1]!=current&&board[r+1][c-1]!='-')
    {
        for(int m=r+2,n=c-2;m<8&&n>=0;m++,n--)
        {
        	if(board[m][n]=='-')
        	break;
            if(board[m][n]==current)
            {
                for(int p=r+1,q=c-1;p<m&&q>n;p++,q--)
                    board[p][q]=current;
                break;
            }
        }
    }
}
void Mrightdown(int r,int c)
{
    board[r][c]=current;
    if(board[r+1][c+1]!=current&&board[r+1][c+1]!='-')
    {
        for(int m=r+2,n=c+2;m<8&&n<8;m++,n++)
        {
        	if(board[m][n]=='-')
        	break;
            if(board[m][n]==current)
            {
                for(int p=r+1,q=c+1;p<m&&q<n;p++,q++)
                    board[p][q]=current;
                break;
            }
        }
    }
}
void printboard()
{
    for(int i=0;i<8;i++)      //输出棋盘
    {
        for(int j=0;j<8;j++)
            cout<<board[i][j];
				cout<<endl;
    }
}
void M(char r,char c)
{
	
    r=r-'0'-1;c=c-'0'-1;            //将char型转为int型再-1让棋盘适配数组
    while(L2(current)==0)               //如果当前玩家没有合法操作则则切换游戏者
    {
        if(current=='B')
            current='W';
        else
            current='B';
    }
    Mleftup(r,c);
    Mup(r,c);Mdown(r,c);Mleft(r,c);Mright(r,c);Mrightup(r,c);Mleftdown(r,c);Mrightdown(r,c);
    num();
    if(current=='W')
        current='B';
    else
        current='W';    
}

int main()
{
    //freopen("c:\\test.txt","r",stdin);
    //freopen("c:\\out.txt","w",stdout);
    int T;
    cin>>T;
    while(T--)
    {
    for(int i=0;i<8;i++)      //输入棋盘
        for(int j=0;j<8;j++)
            cin>>board[i][j];

    cin>>current;             //当前玩家

    char command;
    while(cin>>command)             //输入命令
    {
        if(command=='L') L(current);            //打印合法操作
        if(command=='Q') break;
        if(command=='M')
        {
            char r,c;
            cin>>r>>c;
            M(r,c);
        }
    }
    
    printboard();
    if(T)
    cout<<endl;
    }
}



/*
Udebug上的测试数据 

10
--------
--------
--------
---WB---
---BW---
--------
--------
--------
W
L
M46
L
M34
L
M23
L
M47
L
M56
L
M57
L
M43
L
M33
L
M63
L
M64
Q
--------
--------
--------
---WB---
---BW---
--------
--------
--------
B
L
M56
L
M64
L
M33
L
M57
L
M74
L
M53
L
M42
L
M84
L
M63
L
M34
Q
--------
--------
--------
---WB---
---BW---
--------
--------
--------
W
L
M64
L
M63
L
M35
L
M34
L
M62
L
M26
L
M43
L
M52
L
M23
L
M25
Q
--------
--------
--------
---WB---
---BW---
--------
--------
--------
W
L
M35
L
M56
L
M64
L
M53
L
M63
L
M25
L
M46
L
M73
L
M66
L
M57
Q
--------
--------
--------
---WB---
---BW---
--------
--------
--------
W
L
M53
L
M63
L
M35
L
M52
L
M51
L
M41
L
M31
L
M36
L
M64
L
M34
Q
--------
--------
--------
---WB---
---BW---
--------
--------
--------
B
L
M34
L
M33
L
M65
L
M46
L
M36
L
M66
L
M43
L
M53
L
M22
L
M23
Q
--------
--------
--------
---WB---
---BW---
--------
--------
--------
W
L
M53
L
M65
L
M46
L
M52
L
M75
L
M76
L
M63
L
M35
L
M41
L
M47
Q
--------
--------
--------
---WB---
---BW---
--------
--------
--------
B
L
M43
L
M33
L
M34
L
M35
L
M25
L
M53
L
M36
L
M24
L
M63
L
M65
Q
--------
--------
--------
---WB---
---BW---
--------
--------
--------
B
L
M34
L
M53
L
M66
L
M56
L
M67
L
M35
L
M52
L
M33
L
M36
L
M62
Q
--------
--------
--------
---WB---
---BW---
--------
--------
--------
W
L
M64
L
M43
L
M35
L
M65
L
M75
L
M26
L
M42
L
M36
L
M46
L
M56
Q
*/


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值