五子棋
__Silvefish__ · · 个人记录
欢迎使用五子棋程序!
源代码:
#include <bits/stdc++.h>
#include <windows.h>
#include <conio.h>
using namespace std;
struct gamestatus
{
int g[20][20];
int step;
};
gamestatus g;
int iq=2;
int wx=1,wy=1;
int bx=10,by=10;
int winner;
inline int bigrand()
{
return rand()*32768+rand();
}
inline int randrange(int l,int r)
{
return bigrand()%(r-l+1)+l;
}
void gotoxy(int x, int y)
{
COORD coord;
coord.X = x;
coord.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
void drawmap()
{
printf("■■■■■■■■■■■■■■■■■■■■■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■ ■\n");
printf("■■■■■■■■■■■■■■■■■■■■■\n");
}
long long score()
{
long long sc=0;
int cnt1,cnt2;
for(int i=1;i<=19;i++)
{
for(int j=1;j<=15;j++)
{
cnt1=cnt2=0;
if(g.g[i][j]==1) cnt1++;if(g.g[i][j]==2) cnt2++;
if(g.g[i][j+1]==1) cnt1++;if(g.g[i][j+1]==2) cnt2++;
if(g.g[i][j+2]==1) cnt1++;if(g.g[i][j+2]==2) cnt2++;
if(g.g[i][j+3]==1) cnt1++;if(g.g[i][j+3]==2) cnt2++;
if(g.g[i][j+4]==1) cnt1++;if(g.g[i][j+4]==2) cnt2++;
if(cnt1==0 && cnt2==0) continue;
if(cnt1!=0 && cnt2!=0) continue;
if(cnt1==0) sc-=pow(iq,cnt2*2);
if(cnt2==0) sc+=pow(iq,cnt1*2-1);
}
}
for(int j=1;j<=19;j++)
{
for(int i=1;i<=15;i++)
{
cnt1=cnt2=0;
if(g.g[i][j]==1) cnt1++;if(g.g[i][j]==2) cnt2++;
if(g.g[i+1][j]==1) cnt1++;if(g.g[i+1][j]==2) cnt2++;
if(g.g[i+2][j]==1) cnt1++;if(g.g[i+2][j]==2) cnt2++;
if(g.g[i+3][j]==1) cnt1++;if(g.g[i+3][j]==2) cnt2++;
if(g.g[i+4][j]==1) cnt1++;if(g.g[i+4][j]==2) cnt2++;
if(cnt1==0 && cnt2==0) continue;
if(cnt1!=0 && cnt2!=0) continue;
if(cnt1==0) sc-=pow(iq,cnt2*2);
if(cnt2==0) sc+=pow(iq,cnt1*2-1);
}
}
for(int i=1;i<=15;i++)
{
for(int j=1;j<=15;j++)
{
cnt1=cnt2=0;
if(g.g[i][j]==1) cnt1++;if(g.g[i][j]==2) cnt2++;
if(g.g[i+1][j+1]==1) cnt1++;if(g.g[i+1][j+1]==2) cnt2++;
if(g.g[i+2][j+2]==1) cnt1++;if(g.g[i+2][j+2]==2) cnt2++;
if(g.g[i+3][j+3]==1) cnt1++;if(g.g[i+3][j+3]==2) cnt2++;
if(g.g[i+4][j+4]==1) cnt1++;if(g.g[i+4][j+4]==2) cnt2++;
if(cnt1==0 && cnt2==0) continue;
if(cnt1!=0 && cnt2!=0) continue;
if(cnt1==0) sc-=pow(iq,cnt2*2);
if(cnt2==0) sc+=pow(iq,cnt1*2-1);
}
}
for(int i=5;i<=19;i++)
{
for(int j=1;j<=15;j++)
{
cnt1=cnt2=0;
if(g.g[i][j]==1) cnt1++;if(g.g[i][j]==2) cnt2++;
if(g.g[i-1][j+1]==1) cnt1++;if(g.g[i-1][j+1]==2) cnt2++;
if(g.g[i-2][j+2]==1) cnt1++;if(g.g[i-2][j+2]==2) cnt2++;
if(g.g[i-3][j+3]==1) cnt1++;if(g.g[i-3][j+3]==2) cnt2++;
if(g.g[i-4][j+4]==1) cnt1++;if(g.g[i-4][j+4]==2) cnt2++;
if(cnt1==0 && cnt2==0) continue;
if(cnt1!=0 && cnt2!=0) continue;
if(cnt1==0) sc-=pow(iq,cnt2*2);
if(cnt2==0) sc+=pow(iq,cnt1*2-1);
}
}
return sc+bigrand()%(iq*iq);
}
void drop(int x,int y,int turn)
{
gotoxy(x*2,y);
printf(turn==1 ? "○" : "●");
g.g[x][y]=turn;
g.step++;
gotoxy(0,0);
}
void blkgo()
{
int x,y;
long long mx=-0x8000000000000000;
for(int i=1;i<=19;i++)
{
for(int j=1;j<=19;j++)
{
if(g.g[i][j]!=0) continue;
g.g[i][j]=1;
long long _sc=score();
if(_sc>mx)
{
mx=_sc;x=i;y=j;
}
g.g[i][j]=0;
}
}
if(g.step==0) x=y=10;
drop(x,y,1);
bx=x;
by=y;
}
void whtgo()
{
while(1)
{
int x=rand()%19+1,y=rand()%19+1;
if(g.g[x][y]==0)
{
wx=x;wy=y;
gotoxy(wx*2,wy);
printf("·");
break;
}
}
gotoxy(0,0);
while(1)
{
if(_kbhit())
{
int key=_getch();
if(key==' ')
{
if(g.g[wx][wy]==0)
{
drop(wx,wy,2);
return;
}
}
if(tolower(key)=='q')
{
for(int i=1;i<=10;i++)
{
gotoxy(bx*2,by);
printf("☆");
gotoxy(0,0);
Sleep(500);
gotoxy(bx*2,by);
printf("○");
gotoxy(0,0);
Sleep(500);
}
}
if(key==0 || key==224)
{
key=_getch();
bool f=true;
if(key==75)
{
if(wx<=1) f=false;
}
if(key==77)
{
if(wx>=19) f=false;
}
if(key==72)
{
if(wy<=1) f=false;
}
if(key==80)
{
if(wy>=19) f=false;
}
if(f)
{
if(key==75)
{
gotoxy(wx*2,wy);
if(g.g[wx][wy]==0) printf(" ");
if(g.g[wx][wy]==2) printf("●");
if(g.g[wx][wy]==1) printf("○");
wx--;
gotoxy(wx*2,wy);
printf("·");
}
if(key==77)
{
gotoxy(wx*2,wy);
if(g.g[wx][wy]==0) printf(" ");
if(g.g[wx][wy]==2) printf("●");
if(g.g[wx][wy]==1) printf("○");
wx++;
gotoxy(wx*2,wy);
printf("·");
}
if(key==72)
{
gotoxy(wx*2,wy);
if(g.g[wx][wy]==0) printf(" ");
if(g.g[wx][wy]==2) printf("●");
if(g.g[wx][wy]==1) printf("○");
wy--;
gotoxy(wx*2,wy);
printf("·");
}
if(key==80)
{
gotoxy(wx*2,wy);
if(g.g[wx][wy]==0) printf(" ");
if(g.g[wx][wy]==2) printf("●");
if(g.g[wx][wy]==1) printf("○");
wy++;
gotoxy(wx*2,wy);
printf("·");
}
}
}
gotoxy(0,0);
}
}
}
int gamestatus()
{
int cnt1,cnt2;
for(int i=1;i<=19;i++)
{
for(int j=1;j<=15;j++)
{
cnt1=cnt2=0;
if(g.g[i][j]==1) cnt1++;if(g.g[i][j]==2) cnt2++;
if(g.g[i][j+1]==1) cnt1++;if(g.g[i][j+1]==2) cnt2++;
if(g.g[i][j+2]==1) cnt1++;if(g.g[i][j+2]==2) cnt2++;
if(g.g[i][j+3]==1) cnt1++;if(g.g[i][j+3]==2) cnt2++;
if(g.g[i][j+4]==1) cnt1++;if(g.g[i][j+4]==2) cnt2++;
if(cnt1==5) return 1;
if(cnt2==5) return 2;
}
}
for(int j=1;j<=19;j++)
{
for(int i=1;i<=15;i++)
{
cnt1=cnt2=0;
if(g.g[i][j]==1) cnt1++;if(g.g[i][j]==2) cnt2++;
if(g.g[i+1][j]==1) cnt1++;if(g.g[i+1][j]==2) cnt2++;
if(g.g[i+2][j]==1) cnt1++;if(g.g[i+2][j]==2) cnt2++;
if(g.g[i+3][j]==1) cnt1++;if(g.g[i+3][j]==2) cnt2++;
if(g.g[i+4][j]==1) cnt1++;if(g.g[i+4][j]==2) cnt2++;
if(cnt1==5) return 1;
if(cnt2==5) return 2;
}
}
for(int i=1;i<=15;i++)
{
for(int j=1;j<=15;j++)
{
cnt1=cnt2=0;
if(g.g[i][j]==1) cnt1++;if(g.g[i][j]==2) cnt2++;
if(g.g[i+1][j+1]==1) cnt1++;if(g.g[i+1][j+1]==2) cnt2++;
if(g.g[i+2][j+2]==1) cnt1++;if(g.g[i+2][j+2]==2) cnt2++;
if(g.g[i+3][j+3]==1) cnt1++;if(g.g[i+3][j+3]==2) cnt2++;
if(g.g[i+4][j+4]==1) cnt1++;if(g.g[i+4][j+4]==2) cnt2++;
if(cnt1==5) return 1;
if(cnt2==5) return 2;
}
}
for(int i=5;i<=19;i++)
{
for(int j=1;j<=15;j++)
{
cnt1=cnt2=0;
if(g.g[i][j]==1) cnt1++;if(g.g[i][j]==2) cnt2++;
if(g.g[i-1][j+1]==1) cnt1++;if(g.g[i-1][j+1]==2) cnt2++;
if(g.g[i-2][j+2]==1) cnt1++;if(g.g[i-2][j+2]==2) cnt2++;
if(g.g[i-3][j+3]==1) cnt1++;if(g.g[i-3][j+3]==2) cnt2++;
if(g.g[i-4][j+4]==1) cnt1++;if(g.g[i-4][j+4]==2) cnt2++;
if(cnt1==5) return 1;
if(cnt2==5) return 2;
}
}
return 0;
}
int main()
{
while(1)
{
system("cls");
memset(g.g,0,sizeof(g.g));
g.step=0;
srand(time(NULL));
drawmap();
while(1)
{
blkgo();
if(gamestatus()==1)
{
winner=1;break;
}
if(gamestatus()==2)
{
winner=2;break;
}
whtgo();
if(gamestatus()==1)
{
winner=1;break;
}
if(gamestatus()==2)
{
winner=2;break;
}
Sleep(100);
}
Sleep(5000);
system("cls");
printf(winner==1 ? "Winner : Computer" : "Winner : You");
Sleep(3000);
}
}