📄 wuzhiqi.txt
字号:
/*这个程序是人人对战的五子棋*/
#include<graphics.h>
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<bios.h>
#define COL 133 /*宏定义*/
#define FAR 53
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define Esc 0x011b
#define ENTER 0x1c0d
int a[25][25]; /*用-1表示白棋,用1表示黑棋*/
void gamebegin();
void gameover();
void gameplay();
void drawchess(int,int,int);
void gamewin(int);
void drawflag(int,int,int);
int gamecomputer(int,int); /*返回1表示win,返回0表示not win*/
void whochess(int);
/*主函数*/
void main()
{
int gdriver=DETECT,gmode;
initgraph(&gdriver,&gmode,"");
gameplay();
gameover();
closegraph();
}
/*这个函数是初始化函数*/
void gamebegin()
{
int i,j;
setbkcolor( GREEN );
cleardevice();
for(i=0;i<25;i++)
line(COL,FAR+i*15,COL+15*24,FAR+i*15);
for(i=0;i<25;i++)
line(COL+i*15,FAR,COL+i*15,FAR+15*24);
setcolor(YELLOW);
circle(140,40,6);
setfillstyle(SOLID_FILL,RED);
floodfill(140,40,YELLOW);
outtextxy(155,40,"VS");
setcolor(YELLOW);
circle(180,40,6);
setfillstyle(SOLID_FILL,WHITE);
floodfill(180,40,YELLOW);
for(i=0;i<25;i++)
for(j=0;j<25;j++)
a[i][j]=0;
}
/*结束函数*/
void gameover()
{
cleardevice();
outtextxy(FAR+15*13,COL+15*6,"Game Over");
getch();
exit(0);
}
/*游戏开始函数*/
void gameplay()
{
char again='y';
int who=1; /*用-1表示白棋,用1表示红棋*/
int key=0,x,y,win;
void *image;
while(again=='y'||again=='Y')
{
gamebegin();
key=0;
x=COL+15*13;
y=FAR+15*13;
while(1)
{
drawflag(x,y,key);
whochess(who);
key=bioskey(0);
if(key==Esc)
{
setactivepage(1);
outtextxy(10,200,"Exit?(Y/N)");
image=(char *)malloc(imagesize(10,190,120,210));
getimage(10,190,120,210,image);
setactivepage(0);
putimage(10,200,image,XOR_PUT);
while(1)
{
again=getch();
if(again=='y'||again=='Y'||again=='n'||again=='N')
break;
}
if(again=='y'||again=='Y')
gameover();
else
{drawflag(x,y,0);
putimage(10,200,image,XOR_PUT);
continue;
}
}
else if(key==LEFT)
{
if(x==COL)
x=COL+15*24;
else
x-=15;
}
else if(key==RIGHT)
{
if(x==COL+15*24)
x=COL;
else
x+=15;
}
else if(key==UP)
{
if(y==FAR)
y=FAR+15*24;
else
y-=15;
}
else if(key==DOWN)
{
if(y==FAR+15*24)
y=FAR;
else
y=y+15;
}
else if(key==ENTER)
{
if(a[(y-FAR)/15][(x-COL)/15]==0)
{
drawchess(who,x,y);
if(who==1)
{a[(y-FAR)/15][(x-COL)/15]=1;
who=-1;
}
else
{a[(y-FAR)/15][(x-COL)/15]=-1;
who=1;
}
win=gamecomputer(((x-COL)/15),((y-FAR)/15));
if(win==1)
{
gamewin(who);
break;
}
}
}
else
continue;
}
while(1)
{
outtextxy(10,200,"Continue?(Y/N)");
again=getch();
if(again=='y'||again=='Y'||again=='n'||again=='N')
break;
}
}
}
/*画棋子函数*/
void drawchess(int whose,int x,int y)
{
setcolor(YELLOW);
circle(x,y,6);
if(whose==1) /*画红棋*/
setfillstyle(SOLID_FILL,RED);
if(whose==-1) /*画白棋*/
setfillstyle(SOLID_FILL,WHITE);
floodfill(x,y,YELLOW); /*填充颜色*/
}
/*这个函数是用来控制上下左右的,实用异或来消除以前的图像*/
void drawflag(int x,int y,int key1)
{
void *p;
setactivepage(1);
setcolor(YELLOW);
rectangle(0,0,16,16);
p=(char *)malloc(imagesize(0,0,16,16));
getimage(0,0,16,16,p);
setactivepage(0);
putimage(x-8,y-8,p,XOR_PUT); /*输出当前的指示位置*/
if(key1==LEFT) /*当按左健时就把以前的那个指示位置消除*/
{if(x==COL+15*24) /*当在最右边的位置时就把最左边的指示位置消除*/
putimage(COL-8,y-8,p,XOR_PUT);
else /*当在一般位置是的情况*/
putimage(x-8+15,y-8,p,XOR_PUT);
}
else if(key1==RIGHT)
{if(x==COL)
putimage(COL+15*24-8,y-8,p,XOR_PUT);
else
putimage(x-8-15,y-8,p,XOR_PUT);
}
else if(key1==UP)
{if(y==FAR+15*24)
putimage(x-8,FAR-8,p,XOR_PUT);
else
putimage(x-8,y-8+15,p,XOR_PUT);
}
else if(key1==DOWN)
{if(y==FAR)
putimage(x-8,FAR+15*24-8,p,XOR_PUT);
else
putimage(x-8,y-8-15,p,XOR_PUT);
}
else if(key1==ENTER)
putimage(x-8,y-8,p,XOR_PUT);
}
/*计算有没有赢函数*/
int gamecomputer(int x,int y)
{
int flag1=0,flag2=0,i=0;
for(i=0,flag1=0,flag2=0;;i++) /*左-右*/
{
if(a[y][x]==a[y][x-i]&&x-i>=0)
flag1++;
if(a[y][x]==a[y][x+i]&&x+i<=24)
flag2++;
if((flag1+flag2-1)==5)
{
setcolor(11);
setlinestyle(SOLID_LINE,0,3);
line(15*x+COL-(flag1-1)*15-6,15*y+FAR,15*x+COL+(flag2-1)*15+6,15*y+FAR);
return 1;
}
if(!(a[y][x]==a[y][x-i]&&x-i>=0)&&!(a[y][x]==a[y][x+i]&&x+i<=24))
break;
}
for(i=0,flag1=0,flag2=0;;i++) /*上|下*/
{
if(a[y][x]==a[y-i][x]&&y-i>=0)
flag1++;
if(a[y][x]==a[y+i][x]&&y+i<=24)
flag2++;
if((flag1+flag2-1)==5)
{
setcolor(11);
setlinestyle(SOLID_LINE,0,3);
line(15*x+COL,15*y+FAR-(flag1-1)*15-6,15*x+COL,15*y+FAR+(flag2-1)*15+6);
return 1;
}
if(!(a[y][x]==a[y-i][x]&&y-i>=0)&&!(a[y][x]==a[y+i][x]&&y+i<=24))
break;
}
for(i=0,flag1=0,flag2=0;;i++) /*右上\左下*/
{
if(a[y][x]==a[y-i][x-i]&&(x-i)>=0&&(y-i)>=0)
flag1++;
if(a[y][x]==a[y+i][x+i]&&(x+i)<=24&&(y+i)<=24)
flag2++;
if((flag1+flag2-1)==5)
{
setcolor(11);
setlinestyle(SOLID_LINE,0,3);
line(15*x+COL-(flag1-1)*15-3,15*y+FAR-(flag1-1)*15-3,15*x+COL+(flag2-1)*15+3,15*y+FAR+(flag2-1)*15+3);
return 1;
}
if(!(a[y][x]==a[y-i][x-i]&&(x-i)>=0&&(y-i)>=0)&&!(a[y][x]==a[y+i][x+i]&&(x+i)<=24&&(y+i)<=24))
break;
}
for(i=0,flag1=0,flag2=0;;i++) /*左上/右下*/
{
if(a[y][x]==a[y-i][x+i]&&(x+i)<=24&&(y-i)>=0)
flag1++;
if(a[y][x]==a[y+i][x-i]&&(y+i)<=24&&(x-i)>=0)
flag2++;
if((flag1+flag2-1)==5)
{
setcolor(11);
setlinestyle(SOLID_LINE,0,3);
line(15*x+COL+(flag1-1)*15+3,15*y+FAR-(flag1-1)*15-3,15*x+COL-(flag2-1)*15-3,15*y+FAR+(flag2-1)*15+3);
return 1;
}
if(!(a[y][x]==a[y-i][x+i]&&(x+i)<=24&&(y-i)>=0)&&!(a[y][x]==a[y+i][x-i]&&(y+i)<=24&&(x-i)>=0))
break;
}
return 0;
}
/*判断谁胜利的函数*/
void gamewin(int whose)
{
setlinestyle(SOLID_LINE,0,1);
if(whose==1)
{setcolor(YELLOW);
circle(15,130,6);
setfillstyle(SOLID_FILL,WHITE);
floodfill(15,130,YELLOW);
outtextxy(30,130,"defeat");
circle(90,130,6);
setfillstyle(SOLID_FILL,RED);
floodfill(90,130,YELLOW);
outtextxy(10,150,"White Chess Win");
}
if(whose==-1)
{setcolor(YELLOW);
circle(15,130,6);
setfillstyle(SOLID_FILL,RED);
floodfill(15,130,YELLOW);
outtextxy(30,130,"defeat");
circle(90,130,6);
setfillstyle(SOLID_FILL,WHITE);
floodfill(90,130,YELLOW);
outtextxy(10,150,"Red Chess Win");
}
setcolor(WHITE);
}
/*提示是谁下棋函数*/
void whochess(int whose)
{
outtextxy(335,40,"Play");
setcolor(YELLOW);
circle(320,40,6);
if(whose==1)
setfillstyle(SOLID_FILL,RED);
else
setfillstyle(SOLID_FILL,WHITE);
floodfill(320,40,YELLOW);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -