双人围棋

· · 个人记录

//转自:https://www.luogu.com.cn/paste/c1fvaio2
//作者:https://www.luogu.com.cn/user/217233
#include<bits/stdc++.h>
#include<windows.h>
#include<conio.h>
#include<ctime>
using namespace std;
const int n=19,rangzi=7;//棋盘大小,让子子数
int x,y,turn,a[101][101],vis[101][101],vist[101][101],ans,p;char g;bool flag;
int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};
bool dfs1(int x,int y,int u){
    if(x==0||y==0||x==n+1||y==n+1||a[x][y]==3-u)return true;
    if(a[x][y]==0)return false;
    vis[x][y]=true;
    for(int i=0;i<=3;++i)if(!vis[x+dx[i]][y+dy[i]]&&!dfs1(x+dx[i],y+dy[i],u))return false;
    return true;
}
void dfs2(int x,int y,int u){
    if(x==0||y==0||x==n+1||y==n+1||a[x][y]!=u)return;
    a[x][y]=0;for(int i=0;i<=3;++i)dfs2(x+dx[i],y+dy[i],u);
}
bool dfs3(int x,int y){
    if(x==0||y==0||x==n+1||y==n+1||a[x][y]==1)return true;
    if(a[x][y]==2)return false;
    vis[x][y]=true;
    for(int i=0;i<=3;++i)if(!vis[x+dx[i]][y+dy[i]]&&!dfs3(x+dx[i],y+dy[i]))return false;
    return true;
}
void dfs4(int x,int y){
    if(x==0||y==0||x==n+1||y==n+1||vist[x][y]||a[x][y]==2)return;
    ans++;vist[x][y]=1;
    if(a[x][y]==0){a[x][y]=3;for(int i=0;i<=3;++i)dfs4(x+dx[i],y+dy[i]);}
}
void putchess(){
    system("cls");
    for(int i=1;i<=n;++i){
        for(int j=1;j<=n;++j){
            putchar(i==x&&j==y?'>':' ');
            putchar(a[i][j]==3?',':a[i][j]==0?((i==4||i==n-3||2*i==n+1)&&(j==4||j==n-3||2*j==n+1))?'*':'.':a[i][j]==1?'@':'O');
        }
        putchar('\n');
    }
}
bool control(char g){
    x=(g=='w'?x+n-2:g=='s'?x:x-1)%n+1;
    y=(g=='a'?y+n-2:g=='d'?y:y-1)%n+1;
    return g==' ';
}
int main(){
    x=y=(n+1)/2;turn=1;
    while(true){
        putchess();puts("按三下P结束游戏。");
        g=_getch();
        if(g=='p'){
            p++;if(p==3)break;continue;
        }else p=0;
        if(control(g)){
            if(a[x][y]!=0)continue;
            a[x][y]=turn;flag=false;
            for(int i=0;i<=3;++i){
                memset(vis,0,sizeof(vis));
                if(a[x+dx[i]][y+dy[i]]==3-turn&&dfs1(x+dx[i],y+dy[i],3-turn))flag=true,dfs2(x+dx[i],y+dy[i],3-turn);
            }
            if(!flag&&dfs1(x,y,turn)){a[x][y]=0;continue;}
            turn=3-turn;
        }
    }
    p=0;
    while(true){
        putchess();puts("请清除所有死子;按三下p结束清除。");
        g=_getch();
        if(g=='p'){
            p++;if(p==3)break;continue;
        }else p=0;
        if(control(g)){a[x][y]=0;continue;}
    }
    for(int i=1;i<=n;++i)for(int j=1;j<=n;++j){
        memset(vis,0,sizeof(vis));
        if(dfs3(i,j))dfs4(i,j);
    }
    putchess();printf("黑棋%d目,白棋%d目,%s赢了!",ans,n*n-ans,ans*2-rangzi>n*n?"黑棋":"白棋");
    Sleep(3000);
}