📄 五子棋.txt
字号:
#include <stdio.h>
#include <graphics.h>
#include <conio.h>
#define ESC 27
#define LEFT 'a'
#define RIGHT 'd'
#define UP 'w'
#define DOWN 's'
#define MAXLIE 20
#define MAXHANE 20
#define MAXMARK 2000000000
void beep()
{
printf("\a");
}
/* box() */
void box(int xl,int yu,int xr,int yd)
{
line(xl,yu,xr,yu);
line(xl,yu,xl,yd);
line(xl,yd,xr,yd);
line(xr,yu,xr,yd);
}
/* end */
long int basemark(char chess[MAXHANE][MAXLIE],int x,int y,char who);
void basefind(char chess[MAXHANE][MAXLIE],int *xp,int *yp,char who);
main()
{
int x,y,xr,yr,xb,yb,xstart,ystart,xtemp,ytemp,xfind,yfind;
int player1=1,player2=2,playernow;
int player1color,player2color,movecancolor,movecannotcolor;
int normalcolor,blackcolor,gd=VGA,gm=VGAHI;
int i,ii;
char chess[MAXHANE][MAXLIE],c;
initgraph(&gd,&gm,"");
player1color=EGA_GREEN;player2color=EGA_YELLOW;
xr=xstart=getmaxx()/(MAXLIE+4);
yr=ystart=getmaxy()/(MAXHANE+4);
if(xr%2==1)xr=xr/2;else xr=xr/2-1;
if(yr%2==1)yr=yr/2;else yr=yr/2-1;
normalcolor=15;
blackcolor=1;
movecancolor=EGA_GREEN;
movecannotcolor=EGA_RED;
for(i=0;i<MAXLIE;i++)
for(ii=0;ii<MAXHANE;ii++)
chess[ii][i]=0;
setcolor(normalcolor);
setbkcolor(blackcolor);
clrscr();
playernow=player1;
x=0;y=0;
for(i=0;i<MAXLIE;i++)
for(ii=0;ii<MAXHANE;ii++)
{
xtemp=xstart*(i+1);ytemp=ystart*(ii+1);
setcolor(normalcolor);
box(xtemp,ytemp,xtemp+xstart,ytemp+ystart);
if(chess[ii][i]==player1)
{
setcolor(player1color);
fillellipse(xtemp+xr,ytemp+yr,xr,yr);
}
if(chess[ii][i]==player2)
{
setcolor(player2color);
fillellipse(xtemp+xr,ytemp+yr,xr,yr);
}
}
/*>>>>>>>>>>>>>>>> in mani() <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*//*>>>>>>>>>>>>>>>>>in main()<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
do{
if(chess[y][x]==0)
if(playernow==player1)setcolor(player1color);else setcolor(player2color);
else
setcolor(movecannotcolor);
xtemp=xstart*(x+1);
ytemp=ystart*(y+1);
xb=x;yb=y;
box(xtemp,ytemp,xtemp+xstart,ytemp+ystart);
if(playernow==player1)
{
setcolor(player1color);
outtextxy(xstart,ystart*(MAXHANE+2)+3,"It's player1's turns");
}
else
{
setcolor(player2color);
outtextxy(xstart,ystart*(MAXHANE+2)+3,"It's player2's turns");
}
if(playernow==player1)c=getch();
else
{
basefind(chess,&xfind,&yfind,playernow);
if(x<xfind)c=RIGHT;
else if(y<yfind)c=DOWN;
else if(x>xfind)c=LEFT;
else if(y>yfind)c=UP;
else c='\r';
}
switch(c)
{
case RIGHT:
if(x<MAXLIE-1)
x++;
else
x=0;
goto lable1;
case LEFT:if(x>0)
x--;
else
x=MAXLIE-1;
goto lable1;
case UP: if(y>0)
y--;
else
y=MAXHANE-1;
goto lable1;
case DOWN:if(y<MAXHANE-1)
y++;
else
y=0;
lable1:
xtemp=xstart*(xb+1);
ytemp=ystart*(yb+1);
setcolor(normalcolor);
box(xtemp,ytemp,xtemp+xstart,ytemp+ystart);
break;
case '\r':
if(chess[y][x]==0)
{
chess[y][x]=playernow;
if(playernow==player1)
setcolor(player1color);
else
setcolor(player2color);
xtemp=xstart*(x+1);
ytemp=ystart*(y+1);
fillellipse(xtemp+xr+1,ytemp+yr+1,xr,yr);
if(basemark(chess,x,y,playernow)>=MAXMARK)
{
if(playernow==player1)
outtextxy(xstart,ystart*(MAXHANE +3),"Player1 win,press any key to quit");
else
outtextxy(xstart,ystart*(MAXHANE+3 ),"Player2 win,press any key to quit");
getch();
clrscr();
exit();
}
if(playernow==player1)
playernow=player2;
else
playernow=player1;
}
else
beep();
break;
case 'y':if(playernow==player1)
playernow=player2;
else
playernow=player1;
break;
case ESC:exit();
}
}while(1);
clrscr();
exit();
}
/*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
long int basemark(char chess[MAXHANE][MAXLIE],int x,int y,char who)
{
long int mark,m[6];
int xtp,ytp,xn,yn,xn2,yn2,xr,xl,yu,yd,i1,i2,i3;
int xad[4],yad[4],i,ii,whobk=-1,mm;
char whoa;
m[0]=0;m[1]=1;m[2]=m[1]*20;m[3]=m[2]*16*2;m[4]=m[3]*12*2;m[5]=m[4]*8*2;
xad[0]=1;yad[0]=0;
xad[1]=1;yad[1]=1;
xad[2]=0;yad[2]=1;
xad[3]=-1;yad[3]=1;
mark=0;
if(chess[y][x]!=0)
{
whobk=chess[y][x];
chess[y][x]=0;
}
for(i=0;i<=3;i++)
{
whoa=0;xn=x;yn=y;
for(ii=1;ii<=4;ii++)
{
xtp=xn-xad[i];
ytp=yn-yad[i];
if(xtp<0||xtp>=MAXLIE)break;
if(ytp<0||ytp>=MAXHANE)break;
if(whoa==0)whoa=chess[ytp][xtp];
if(whoa!=chess[ytp][xtp]&&chess[ytp][xtp]!=0)break;
xn=xtp;yn=ytp;
}
xl=xn;yu=yn;
xn=x;yn=y;whoa=0;
for(ii=1;ii<=4;ii++)
{
xtp=xn+xad[i];
ytp=yn+yad[i];
if(xtp<0||xtp>MAXLIE)break;
if(ytp<0||ytp>MAXHANE)break;
if(whoa==0)whoa=chess[ytp][xtp];
if(whoa!=chess[ytp][xtp]&&chess[ytp][xtp]!=0)break;
xn=xtp;yn=ytp;
}
xr=xn;yd=yn;xn=xl;yn=yu;
if(yd>yu)i1=yd-yu+1;
else i1=xr-xl+1;
for(i2=0;i2<=i1-5;i2++)
{
whoa=0;mm=1;
xn2=xn;yn2=yn;
for(i3=1;i3<=5;i3++)
{
if(whoa==0)whoa=chess[yn2][xn2];
if(whoa!=chess[yn2][xn2]&&chess[yn2][xn2]!=0)
{mm=0;break;}
if(chess[yn2][xn2]!=0)mm++;
xn2=xn2+xad[i];yn2=yn2+yad[i];
}
mark=mark+m[mm];
if(whoa==who)
{
if(mm==5)
{
mark=MAXMARK;
return mark;
}
else
mark=mark+m[mm];
}
xn=xn+xad[i];yn=yn+yad[i];
}
}
if(whobk!=-1)chess[y][x]=whobk;
return mark;
}
/*>>>>>>>>>>>>>>>>>>>> basemark() end <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< <<,<<<<<<<<<<<<<<<<<<<<<<<<<*/
void basefind(char chess[MAXHANE][MAXLIE],int *xp,int *yp,char who)
{
int i,ii,xa=-1,ya=-1;
long int maxmark=-1,mark;
for(i=0;i<MAXHANE;i++)
for(ii=0;ii<MAXLIE;ii++)
{
if(chess[i][ii]==0)
{
mark=basemark(chess,ii,i,who);
outtextxy(100,getmaxy()-16,ltoa(ii,"abc",1));
if(mark>maxmark)
{
maxmark=mark;
xa=ii;
ya=i;
}
}
}
*xp=xa;*yp=ya;
}
/*>>>>>>>>>>>>>>>>>>>>>>>>>>>. basefind() end <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<,,*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -