#include
#include
#include
#include
#include
#include
#define up 'w' //上
#define down 's' //下
#define left 'a' //左
#define right 'd' //右
#define lz 'p' //落子
#define cls 'q' //重新开始
int player=1;//玩家
int cx=21,cy=21;//当前的光标位置
typedef struct stu//光标位置结构体
{
int x,y;
}Weizhi;
Weizhi weizhi;
int Q[20][20]={0};//记录玩家1当前位置已落子的情况
int P[20][20]={0};//记录玩家2前位置已落子的情况
int win1=0,win2=0;//玩家1和2的胜负情况,都0表示当前双方均未胜利
void gotoxy(int x,int y)
{
COORD c;
c.X=2*x;
c.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c);
}
void drawPain() //画棋盘
{
int i,j;
system("cls");
for(i=0;i<20;i++)
{
for(j=0;j<20;j++)
{
printf("十");
}
printf("\n");
}
weizhi.x=0;
weizhi.y=0;
gotoxy(weizhi.x,weizhi.y);
}
void luozi()//玩家1落子
{
if(Q[weizhi.x][weizhi.y]==0&&P[weizhi.x][weizhi.y]==0)
{
printf("●");
player=2;
Q[weizhi.x][weizhi.y]=1;
}
}
void cluozi()//玩家2落子
{
if(Q[weizhi.x][weizhi.y]==0&&P[weizhi.x][weizhi.y]==0)
{
printf("○");
player=1;
P[weizhi.x][weizhi.y]=1;
}
}
void KeyPress(char press)
{
switch(press)
{
case up: if(weizhi.y<=0){weizhi.y=19;} else weizhi.y--; gotoxy(weizhi.x,weizhi.y); break;
case down: if(weizhi.y>=19){weizhi.x=0;} else weizhi.y++; gotoxy(weizhi.x,weizhi.y); break;
case left: if(weizhi.x<=0){weizhi.x=19;} else weizhi.x--; gotoxy(weizhi.x,weizhi.y); break;
case right: if(weizhi.x>=19){weizhi.x=0;} else weizhi.x++; gotoxy(weizhi.x,weizhi.y); break;
case lz: if(1==player){luozi();} else if(2==player){cluozi();} break;
case cls: drawPain(); player=1; memset(Q,0,sizeof(char)*400); memset(P,0,sizeof(char)*400); break;
}
}
void checkWin()//检查胜利方
{
int i,j;
for(i=0;i<20;i++)//遍历检查:行列,正斜边是否五子连成一线
{
for(j=0;j<20;j++)
{
if(i+4<20&&j+4<20)
{
if(Q[i][j]==1&&Q[i+1][j]==1&&Q[i+2][j]==1&&Q[i+3][j]==1&&Q[i+4][j]==1)
{
win1=1;
}
else if(Q[i][j]==1&&Q[i][j+1]==1&&Q[i][j+2]==1&&Q[i][j+3]==1&&Q[i][j+4]==1)
{
win1=1;
}
else if(Q[i][j]==1&&Q[i+1][j+1]==1&&Q[i+2][j+2]==1&&Q[i+3][j+3]==1&&Q[i+4][j+4]==1)
{
win1=1;
}
if(1==win1)
{
return;
}
if(P[i][j]==1&&P[i+1][j]==1&&P[i+2][j]==1&&P[i+3][j]==1&&P[i+4][j]==1)
{
win2=1;
}
else if(P[i][j]==1&&P[i][j+1]==1&&P[i][j+2]==1&&P[i][j+3]==1&&P[i][j+4]==1)
{
win2=1;
}
else if(P[i][j]==1&&P[i+1][j+1]==1&&P[i+2][j+2]==1&&P[i+3][j+3]==1&&P[i+4][j+4]==1)
{
win2=1;
}
if(1==win2)
{
return;
}
}
}
}
for(i=19;i>=0;i--)//检查反斜边
{
for(j=0;j<20;j++)
{
if(i-4>=0&&j+4<200)
{
if(Q[i][j]==1&&Q[i-1][j+1]==1&&Q[i-2][j+2]==1&&Q[i-3][j+3]==1&&Q[i-4][j+4]==1)
{
win1=1;
}
if(1==win1)
{
return;
}
if(P[i][j]==1&&P[i-1][j+1]==1&&P[i-2][j+2]==1&&P[i-3][j+3]==1&&P[i-4][j+4]==1)
{
win2=1;
}
if(1==win2)
{
return;
}
}
}
}
}
int main(void)
{
char press;
int winer=0;
system("color 2f");
drawPain();
press=getch();
while(1)
{
KeyPress(press);
checkWin();
if(1==win1)
{
gotoxy(5,20);
printf("●方胜利!\n");
break;
//以下有bug
/*printf("是否要继续进行游戏! y or n\n");
press=getch();
if('y'==press)
{
//将所有数据初始化为初始值
player=1;
memset(P,0,sizeof(char)*400);
memset(Q,0,sizeof(char)*400);
win1=0;
win2=0;
cx=21;
cy=21;
drawPain();//重画地图
}
else if('n'==press)
{
break;
}*/
}
if(1==win2)
{
gotoxy(5,20);
printf("○方胜利!\n");
printf("是否要继续进行游戏! y or n\n");
break;
/*press=getch();
if('y'==press)
{
player=1;
memset(P,0,sizeof(char)*400);
memset(P,0,sizeof(char)*400);
drawPain();
win2=0;
win1=0;
cx=21;
cy=21;
}
else if('n'==press)
{
break;
}*/
}
press=getch();
}
return 0;
}
阅读(768) | 评论(0) | 转发(0) |