用C++写的五子棋 [转]
#include <stdio.h>
#include<stdlib.h>
#include<conio.h>
#define N 21
void chessboard(int name[N][N],int *,int *,int *);//棋盘,和下子
int win(int name[N][N],int *,int *);//判断胜负
int output(int count[8],int win);//输入胜负
void explain();//游戏说明
void reset(int name[N][N],int *,int *,int *);//重置棋盘
void main()
{
int name[N][N]={0},a=N/2,b=N/2,player,t,j;
do
{
printf("1.开始游戏-------------------------2.游戏说明-------------------------0.结束游戏");
scanf("%d",&t);
switch(t)
{
case 1:
system("cls");
printf("********************************************************************************");
printf("1.先手白棋/n2.先手黑棋/n");
scanf("%d",&player);
do
{
system("cls");
chessboard(name,&a,&b,&player);
}while(win(name,&a,&b));
reset(name,&a,&b,&player);
break;
case 2:
explain();
break;
case 0:
printf("谢谢使用,欢迎下次光临");
fflush(stdin);
j=getch();
break;
}
system("cls");
}while(t);
}
void chessboard(int name[N][N],int *a,int *b,int *player)
{
int i,j;
for (i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
if(*a==i && *b==j)
{
printf("□");
}
else if(name[i][j]==0)
{
printf("╋");
}
else if(name[i][j]==1)
{
printf("●");
}
else
{
printf("○");
}
}
printf("/n");
}
fflush(stdin);
int input=getch();
switch(input)
{
case 'w':
if(*a>0)
{
(*a)--;
}
break;
case 's':
if(*a<N-1)
{
(*a)++;
}
break;
case 'a':
if(*b>0)
{
(*b)--;
}
break;
case 'd':
if(*b<N-1)
{
(*b)++;
}
break;
case ' ':
if(name[*a][*b]==0)
{
*player=*player==1?2:1;
name[*a][*b]=*player;
}else
{
printf("此处有子!/n");
printf("按任意键继续");
fflush(stdin);
j=getch();
}
break;
}
}
//判断胜负
int win(int name[N][N],int *a,int *b)
{
int i,j,count[8]={0},k,win;
//判断行是否5个
for(j=0;j<N;j++)
{
for(i=0;i<N;i++)
{
for(k=0;k<5;k++)
{
if(name[i][j+k]==1)
{
count[0]++;
}
if(name[i][j+k]==2)
{
count[1]++;
}
}
win=output(count,win);
}
}
//判断列是否5个
for(j=0;j<N;j++)
{
for(i=0;i<N;i++)
{
for(k=0;k<5;k++)
{
if(name[i+k][j]==1)
{
count[2]++;
}
if(name[i+k][j]==2)
{
count[3]++;
}
}
win=output(count,win);
}
}
//判断左到右斜方向是否有5个
for(j=0;j<N;j++)
{
for(i=0;i<N;i++)
{
for(k=0;k<5;k++)
{
if(name[i+k][j+k]==1)
{
count[4]++;
}
if(name[i+k][j+k]==2)
{
count[5]++;
}
}
win=output(count,win);
}
}
//判断右到左斜方向是否有5个
for(j=1;j<N;j++)
{
for(i=0;i<N;i++)
{
for(k=0;k<5;k++)
{
if(name[i+k][j-k]==1)
{
count[6]++;
}
if(name[i+k][j-k]==2)
{
count[7]++;
}
}
win=output(count,win);
}
}
return win;
}
//输出胜负
int output(int count[8],int win)
{
int i,j;
if(count[0]==5 || count[2]==5 || count[4]==5 || count[6]==5)
{
win=0;
printf("白纸赢了/n");
printf("按任意键回到主菜单");
fflush(stdin);
j=getch();
}
if(count[1]==5 || count[3]==5 || count[5]==5 || count[7]==5)
{
printf("黑子赢了/n");
win=0;
printf("按任意键回到主菜单");
fflush(stdin);
j=getch();
}
for(i=0;i<8;i++)
{
count[i]=0;
}
return win;
}
//游戏说明
void explain()
{
int j;
printf("************************************游戏说明************************************");
printf("/n1.按w向上移动光标/n2.按s向下移动光标/n3.按a向左移动光标/n4.按d向右移动光标/n5.按空格放子/n/n/n/n");
printf("胜负条件:只要一方横竖斜连续达到5个,方可获胜!/n/n/n");
printf("按任意键回到主菜单/n/n/n");
fflush(stdin);
j=getch();
}
//重置棋盘
void reset(int name[N][N],int *a,int *b,int *player)
{
int i,j;
for (i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
name[i][j]=0;
}
}
*a=N/2;
*b=N/2;
*player=1;
}