69,382
社区成员
发帖
与我相关
我的任务
分享
#include<stdio.h>
#include<graphics.h>
#include<conio.h>
#include<stdlib.h>
#include<windows.h>
#define N 690 //棋盘大小
void printpage(); //打印游戏规则
void MainFace(); //开局打印棋牌
void mouse(); //鼠标响应算法
int Game_Over1 (int a[690][690],int chess_symbol); //判断棋子是否连成‘--’形或‘|’形
int Game_Over2 (int a[690][690],int chess_symbol); //判断棋子是否连成‘/’形
int Game_Over3 (int a[690][690],int chess_symbol); //判断棋子是否连成‘\’形
void main()
{
printpage();
MainFace();
mouse();
}
void printpage()
{
char select;
printf("\t\t\t欢迎进入五子棋世界\n");
printf("游戏规则:\n");
printf("1、玩家分别持黑棋和白棋\n");
printf("2、玩家轮流下棋,单击鼠标左键落子\n");
printf("3、棋子落在两线交叉处\n");
printf("4、允许玩家悔棋一步\n");
printf("5、三局两胜\n");
printf("6、是否遵守规则并开局(y/n)\n");
scanf("%c",&select);
fflush(stdin);
if(select=='y'||select=='Y')
{
MainFace();
}
if(select=='n'||select=='N')
{
exit(0);
}
else
{
printf("非法输入,只能接受(Y,y,N,n)\n1秒后继续选择");
Sleep(1000);
system("cls");
printpage();
}
}
void MainFace() //打印23*23的方格棋盘,红线,白色背景
{
int x;
initgraph(690,690);
setbkcolor(LIGHTGRAY);
cleardevice();
setcolor(RED);
for(x=0;x<=690;x+=30)
{
line(x,0,x,690);
line(0,x,690,x);
}
}
int Game_Over1 (int a[N][N],int chess_symbol)
{
int i,j,k,l,r;
for(i=0;i<N;i++)
for(k=0;k<N-4;k++)
{
l=r=0;
for(j=k;j<k+5;j++)
{
if(a[i][j]==chess_symbol)
l++;
if(a[j][i]==chess_symbol)
r++;
}
if(l==5||r==5)
return 1;
}
return 0;
}
int Game_Over2 (int a[N][N],int chess_symbol)
{
int i,j,k,m,LeftDown,RightUp;
for(m=0;m<N-4;m++)
for(k=0;k<N-4;k++)
{
RightUp=LeftDown=0;
for(i=k,j=k+m;i<k+5;i++,j++)
{
if(a[i][j]==chess_symbol)
RightUp++;
if(a[j][i]==chess_symbol)
LeftDown++;
}
if(RightUp==5||LeftDown==5)
return 1;
}
return 0;
}
int Game_Over3 (int a[N][N],int chess_symbol)
{
int i,j,k,m,LeftUp,RightDown;
for(m=N-1;m>=4;m--)
for(k=0;k<m+1-4;k++)
{
LeftUp=RightDown=0;
for(i=k,j=m-k;i<k+5;i++,j--)
{
if(a[i][j]==chess_symbol)
LeftUp++;
if(a[N-1-j][N-1-i]==chess_symbol)
RightDown++;
}
if(RightDown==5||LeftUp==5)
return 1;
}
return 0;
}
void mouse() //鼠标响应
{
int x,y ;
int n=1 ; //n初始化为1,n=1或2分别标记两个玩家
int i,j ;
int chess[N][N]={0}; //存放棋盘的二维数组,初值为0
int v[2]={0}; //v[0]和v[1]分别标记玩家胜局次数
char ch;
MOUSEMSG m;
while(true)
{
m=GetMouseMsg(); //获得鼠标信息
if(m.uMsg==WM_LBUTTONDOWN)
{
x=m.x%30 ; //将鼠标左键点击处坐标转化为棋盘线相交处坐标,即确定落子位置
if(x<=15)m.x=m.x-x ;
else m.x=m.x+(30-x);
y=m.y%30 ;
if(y<=15)m.y=m.y-y ;
else m.y=m.y+(30-y);
i=m.x/30 ;
j=m.y/30 ;
if(chess[i][j]!=0)continue ; // 防止在一个地方重复下棋,chess[i][j]==1为白子,chess[i][j]==2为黑子
if(n==1) //判断玩家
{
setcolor(WHITE);
setfillcolor(WHITE);
fillcircle(m.x,m.y,6); //白棋落子
chess[i][j]=1 ; //标记已落棋子位置
if(Game_Over1(chess,1)==1||Game_Over2(chess,1)==1||Game_Over3(chess,1)==1)//判断是否赢棋
{
setcolor(BLACK);
outtextxy(200,200,"此局白子获胜"); //如赢棋,在棋盘上打印"此局白子获胜"
v[0]++; //胜局次数加1
if(v[0]==2) //判断胜局次数是否达到2次,三局两胜
{
outtextxy(200,300,"三局两胜,白子胜两局,白子胜出");
break ;
}
outtextxy(250,250,"是否继续下棋:Y or N");
ch=getch();
if(ch=='N')break ; //判断是否继续下棋
else
{
for(i=0;i<N;i++)
for(j=0;j<N;j++)
chess[i][j]=0 ;
setbkcolor(LIGHTGRAY);
cleardevice();
setcolor(RED);
for(x=0;x<=690;x+=30)
{
line(x,0,x,690);
line(0,x,690,x);
}
}
}
n=2 ; //标记下次落子玩家2
}
else //如果玩家不是1
{
chess[i][j]=2 ; //标记以落子位置
setcolor(BLACK);
setfillcolor(BLACK);
fillcircle(m.x,m.y,6); //黑棋落子
if(Game_Over1(chess,2)==1||Game_Over2(chess,2)==1||Game_Over3(chess,2)==1)//判断是否赢棋
{
setcolor(BLACK);
outtextxy(200,200,"此局黑子胜利");
v[1]++;
if(v[1]=2)
{
outtextxy(200,200,"三局两胜,黑子胜两局,黑子胜出");
break ;
}
outtextxy(250,250, "是否继续下棋:Y or N");
ch=getch();
if(ch=='N')break ;
else
{
for(i=0;i<N;i++)
for(j=0;j<N;j++)
chess[i][j]=0 ;
setbkcolor(LIGHTGRAY);
cleardevice();
setcolor(RED);
for(x=0;x<=690;x+=30)
{
line(x,0,x,690);
line(0,x,690,x);
}
}
}
n=1; //标记下次落子玩家1
}
}
if(m.uMsg==WM_RBUTTONUP)break;
}
}