保证代码能够运行并达到理想效果,求点赞关注!
#include <bits/stdc++.h>
#include <windows.h>
#include <conio.h>
using namespace std;
int a[30][30],dp[30][30];
int flag[30][30];
int dx[9]= {-1,-1,-1,0,0,1,1,1};
int dy[9]= {-1,0,1,-1,1,-1,0,1};
int rx[9]= {-2,-2,-1,1,2,2,1,-1};
int ry[9]= {-1,1,2,2,1,-1,-2,-2};
int step,check;
void checksit(int n,int m) {
for(int i=0; i<8; i++) {
int num=0;
for(int j=1; j<5; j++) {
if(a[n+j*dx[i]][m+j*dy[i]]==1) num++;
if(a[n+j*dx[i]][m+j*dy[i]]==2) break;
}
for(int j=1; j<5; j++) {
if(a[n-j*dx[i]][m-j*dy[i]]==1) num++;
if(a[n-j*dx[i]][m-j*dy[i]]==2) break;
}
if(num==4) {
dp[n][m]+=1000;
flag[n][m]==3;
}
if(num==3&&a[n+4*dx[i]][m+4*dy[i]]==2) dp[n][m]+=10;
if(num==3&&a[n+4*dx[i]][m+4*dy[i]]==0) {
dp[n][m]+=500;
flag[n][m]==1;
}
if(num==2&&a[n+3*dx[i]][m+3*dy[i]]==2) dp[n][m]+=1;
if(num==2&&a[n+3*dx[i]][m+3*dy[i]]==0) dp[n][m]+=3;
}
for(int i=0; i<8; i++) {
int num=0;
for(int j=1; j<5; j++) {
if(a[n+j*dx[i]][m+j*dy[i]]==2) num++;
else break;
}
for(int j=1; j<5; j++) {
if(a[n-j*dx[i]][m-j*dy[i]]==2) num++;
else break;
}
if(num==4) {
dp[n][m]+=1000;
flag[n][m]==2;
}
if(num==3&&a[n+4*dx[i]][m+4*dy[i]]==1) dp[n][m]+=20;
if(num==3&&a[n+4*dx[i]][m+4*dy[i]]==0) {
dp[n][m]+=500;
flag[n][m]==2;
}
if(num==2&&a[n+3*dx[i]][m+3*dy[i]]==1) dp[n][m]+=2;
if(num==2&&a[n+3*dx[i]][m+3*dy[i]]==0) dp[n][m]+=10;
}
for(int i=0; i<8; i++) {
for(int j=0; j<8; j++) {
if(j==i) continue;
int num=0;
for(int k=1; k<3; k++) {
if(a[n+k*dx[j]][m+k*dy[j]]==1) num++;
if(a[n+k*dx[i]][m+k*dy[i]]==2) {
num-=2;
break;
}
}
for(int k=1; k<3; k++) {
if(a[n-k*dx[j]][m-k*dy[j]]==1) num++;
if(a[n-k*dx[i]][m-k*dy[i]]==2) {
num-=2;
break;
}
}
for(int k=1; k<3; k++) {
if(a[n+k*dx[i]][m+k*dy[i]]==1) num++;
if(a[n+k*dx[i]][m+k*dy[i]]==2) {
num-=2;
break;
}
}
for(int k=1; k<3; k++) {
if(a[n-k*dx[i]][m-k*dy[i]]==1) num++;
if(a[n-k*dx[i]][m-k*dy[i]]==2) {
num-=2;
break;
}
}
if(num>=4) dp[n][m]+=80;
else if(num==3) dp[n][m]+=20;
}
}
for(int i=0; i<8; i++) {
for(int j=0; j<8; j++) {
if(j==i) continue;
int num=0;
for(int k=1; k<3; k++) {
if(a[n+k*dx[j]][m+k*dy[j]]==2) num++;
if(a[n+k*dx[i]][m+k*dy[i]]==1) {
num-=2;
break;
}
}
for(int k=1; k<3; k++) {
if(a[n-k*dx[j]][m-k*dy[j]]==2) num++;
if(a[n-k*dx[i]][m-k*dy[i]]==1) {
num-=2;
break;
}
}
for(int k=1; k<3; k++) {
if(a[n+k*dx[i]][m+k*dy[i]]==2) num++;
if(a[n+k*dx[i]][m+k*dy[i]]==1) {
num-=2;
break;
}
}
for(int k=1; k<3; k++) {
if(a[n-k*dx[i]][m-k*dy[i]]==2) num++;
if(a[n-k*dx[i]][m-k*dy[i]]==1) {
num-=2;
break;
}
}
if(num>=4) dp[n][m]+=50;
else if(num==3) dp[n][m]+=10;
}
}
for(int i=0; i<8; i++) {
int seti=0,setj=0;
for(int j=1; j<5; j++)
if(a[n+j*dx[i]][m+j*dy[i]]==1) seti=j;
for(int j=1; j<5; j++)
if(a[n-j*dx[i]][m-j*dy[i]]==1) setj=j;
if(abs(seti-setj)<=4) dp[n][m]-=30;
}
int num=0;
for(int k=0; k<8; k++) {
if(a[n+dx[k]][m+dy[k]]==2) {
dp[n][m]+=10;
num++;
}
if(a[n+dx[k]][m+dy[k]]==1) dp[n][m]+=2;
}
if(num==0)
for(int i=0; i<8; i++) {
if(a[n+rx[i]][m+rx[i]]==2) dp[n][m]-=20;
}
}
int judgewin() {
for(int i=1; i<=25; i++) {
for(int j=1; j<=25; j++) {
if(a[i][j]==0) continue;
int numwin=0;
for(numwin=1; numwin<=4; numwin++) {
if(a[i+numwin][j]!=a[i][j])
break;
}
if(numwin==5) {
return a[i][j];
}
numwin==0;
for(numwin=1; numwin<=4; numwin++) {
if(a[i][j+numwin]!=a[i][j])
break;
}
if(numwin==5) {
return a[i][j];
}
numwin==0;
for(numwin=1; numwin<=4; numwin++) {
if(a[i+numwin][j+numwin]!=a[i][j])
break;
}
if(numwin==5) {
return a[i][j];
}
numwin==0;
if(j>5) {
for(numwin=1; numwin<=4; numwin++) {
if(a[i+numwin][j-numwin]!=a[i][j])
break;
}
if(numwin==5) {
return a[i][j];
}
}
}
}
return 0;
}
void out() {
system("cls");
for(int i=0; i<=24; i++) {
for(int j=0; j<=24; j++) {
if(a[i][j]!=0) {
if(a[i][j]==1&&i!=0&&j!=0) printf(" O");
else if(a[i][j]==2&&i!=0&&j!=0) printf(" X");
else cout<<setw(2)<<a[i][j];
} else printf(" -");
}
printf("\n");
}
}
int main() {
while(1) {
char change;
memset(a,0,sizeof(a));
system("cls");
cout<<"-----------------------------\n";
cout<<"| 五子棋 |\n";
cout<<"| 1.人机对战 |\n";
cout<<"| 2.双人对战 |\n";
cout<<"-----------------------------\n";
change=getch();
for(int i=0; i<=24; i++) a[0][i]=i;
for(int i=0; i<=24; i++) a[i][0]=i;
if(change=='1') {
int tempi,tempj;
out();
while(1) {
step++;
memset(dp,0,sizeof(dp));
memset(flag,0,sizeof(flag));
int n,m;
cout<<"尊敬的玩家,请输入行 列:\n";
scanf("%d%d",&n,&m);
while(a[n][m]!=0||n>24||m>24) {
printf("落子无效!请重新输入!\n");
Sleep(1000);
out();
cout<<"尊敬的玩家,请输入行 列:\n";
scanf("%d%d",&n,&m);
if(a[n][m]!=0||n>24||m>24) continue;
}
a[n][m]=1;
dp[n][m]=0;
out();
int ans=judgewin();
if(ans==2) {
printf("系统赢了!\n");
break;
}
if(ans==1) {
printf("玩家赢了!\n");
break;
}
if(step>=100) {
printf("您的步数已经超过了100步,您真是一位优秀的棋手!!\n");
break;
}
if(step==1) {
dp[n+1][m+2]=100;
tempi=n+1;
tempj=m+2;
} else if(step==2) {
if(a[tempi+1][tempj-1]==0) dp[tempi+1][tempj-1]=100;
else dp[tempi-1][tempj-1]=100;
} else for(int i=1; i<=25; i++) {
for(int j=1; j<=25; j++) {
if(a[i][j]!=0) continue;
checksit(i,j);
}
}
int max=0,maxn=0,maxm=0;
for(int i=1; i<=25; i++) {
for(int j=1; j<=25; j++) {
if(max<dp[i][j]) {
max=dp[i][j];
maxn=i;
maxm=j;
}
}
}
int mfl=0,mfln=0,mflm=0;
for(int i=1; i<=25; i++) {
for(int j=1; j<=25; j++) {
if(mfl<flag[i][j]) {
mfl=flag[i][j];
mfln=i;
mflm=j;
}
if(mfl==flag[i][j]&&mfl!=0) {
if(dp[mfln][mflm]<dp[i][j]) {
mfln=i;
mfln=j;
}
}
}
}
if(mfl==0) printf("%d %d\n",maxn,maxm);
else printf("%d %d\n",mfln,mflm);
a[maxn][maxm]=2;
out();
ans=judgewin();
if(ans==2) {
printf("系统赢了!\n");
break;
}
if(ans==1) {
printf("玩家赢了!\n");
break;
}
}
system("pause");
} else if(change=='2') {
out();
int who=1;
while(1) {
int n,m;
cout<<"尊敬的玩家"<<who<<",请输入行 列:\n";
cin>>n>>m;
while(a[n][m]!=0||n>24||m>24) {
printf("落子无效!请重新输入!\n");
Sleep(1000);
out();
cout<<"尊敬的玩家"<<who<<",请输入行 列:\n";
scanf("%d%d",&n,&m);
if(a[n][m]!=0||n>24||m>24) continue;
}
a[n][m]=who;
out();
if(judgewin()==1) {
cout<<"玩家1赢了!\n";
system("pause");
break;
} else if(judgewin()==2) {
cout<<"玩家2赢了!\n";
system("pause");
break;
}
if(who==1) who=2;
else who=1;
}
}
system("cls");
cout<<"重来还是结束?重来输入Y,否则输入N:\n";
char ch;
cin>>ch;
if(ch=='N') return 0;
}
}