C语言-简单五子棋

#include
#include
int x=7,y=7;//设置中心位置
int danqianzhe=1;
int qizi[15][15]={0};

/*----------------API函数-----------------------
SetConsoleCursorPosition() 定位光标位置
GetStdHandle() 获取标准输出设备句柄
STD_OUTPUT_HANDLE (OUT指输出,IN输入) 获取输出设备的句柄
----------------------------------------------*/
int gotoxy(int x,int y)//创建坐标
{
COORD xy={2*x,y};//为什么是2*x?因为一个符号占2个字节。高度固定的,每行都一样的大小。
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),xy); //修改光标位置
}

void luozi(void)
{
if(qizi[x][y]==0)
{
if(danqianzhe==1)
{
printf("■");//当前者1号
qizi[x][y]=1;//将棋子储存到二维数组
danqianzhe=2;//换成当前者2号
}
else if(danqianzhe==2)
{
printf("●");
qizi[x][y]=2;
danqianzhe=1;
}
}
gotoxy(x,y);
}

void qipu_init(void)
{
int i,j;
gotoxy(0,15);
printf("控制:方向键 落子:空格 悔棋:v键");
gotoxy(0,0);

for(i=0;i<15;i++)
for(j=0;j<15;j++)
qizi[i][j]=0;//给棋盘赋初值

printf("┏┳┳┳┳┳┳┳┳┳┳┳┳┳┳┓\n");
for(i=0;i<13;i++)
printf("┣╋╋╋╋╋╋╋╋╋╋╋╋╋╋┫\n");
printf("┗┻┻┻┻┻┻┻┻┻┻┻┻┻┻┛\n");

gotoxy(7,7);//光标移到中心位置
}

void huiqi(void)
{
int i,j;
qizi[x][y]=0;
system("cls");
gotoxy(0,15);
printf("控制:方向键 落子:空格 悔棋:v键");
gotoxy(0,0);
printf("┏┳┳┳┳┳┳┳┳┳┳┳┳┳┳┓\n");
for(i=0;i<13;i++)
printf("┣╋╋╋╋╋╋╋╋╋╋╋╋╋╋┫\n");
printf("┗┻┻┻┻┻┻┻┻┻┻┻┻┻┻┛\n");

for(i=0;i<15;i++)
for(j=0;j<15;j++)
{
if(qizi[i][j]==1)
{
gotoxy(i,j);
printf("■");
}
else if(qizi[i][j]==2)
{
gotoxy(i,j);
printf("●");
}
}
danqianzhe=danqianzhe==1?2:1;
gotoxy(x,y);
}
void key_jiance(char ch)
{
switch(ch)
{
case 72://上移
if(y<=0) {y=15; gotoxy(x,15); break;}
else {gotoxy(x,--y); break;}
case 80://下移
if(y>=15) {y=1; gotoxy(x,0); break;}
else {gotoxy(x,++y); break;}
case 75://左移
if(x<=0) {x=15; gotoxy(15,y); break;}
else {gotoxy(--x,y); break;}
case 77://右移
if(x>=15) {x=0; gotoxy(0,y); break;}
else {gotoxy(++x,y); break;}
case 32: luozi();break;//落子
case 27: qipu_init();break;//ESC键
case 'v': huiqi();break;//悔棋
}
}

int shuyin(void)//检查游戏是否有输赢
{
int a,b,aa,bb,player;
int tongyang=0;
player=danqianzhe==1?2:1;
for(a=0;a<15;a++)
{
for(b=0;b<15;b++)
{
if(qizi[a][b]!=player) continue;//找到第一个当前者的棋子

aa=a;bb=b;//赋初值(从上面if语句获得的x,y值)
/*--------------先看懂从上往下找--------------------*/
/*每次判断当前位置的棋

子是否为当前落棋者,若成立则变量+1,否则直接跳出循环*/
while(aa>=0 && qizi[--aa][bb] == player) tongyang++;//向上找

aa=a;bb=b;
while(aa<15 && qizi[++aa][bb] == player) tongyang++;//向下找

if(tongyang+1>=5) return player;//判断是否连续5颗,如果是则返回当前落子的人

tongyang=0;
/*---------------------------------------------*/
aa=a;bb=b;
while(bb>=0&&qizi[aa][--bb]==player) tongyang++;//向左找

aa=a;bb=b;
while(bb<15&&qizi[aa][++bb]==player) tongyang++;//向右找

if(tongyang+1>=5) return player;

tongyang=0;

/*列提前一列和行提前一行,就会走对角线*/

bb--;aa--;//先除去自身位置,再找下一个
while((bb>=0||aa>=0)&&qizi[aa][bb]==player) {tongyang++;bb--;aa--;} //向左上找
aa=a;bb=b;
bb++;aa++;//先除去自身位置,再找下一个
while((bb<15||aa<15)&&qizi[aa][bb]==player) {tongyang++;bb++;aa++;} //向左下找
aa=a;bb=b;
if(tongyang+1>=5) return player;

tongyang=0;

bb++;aa--;//先除去自身位置,再找下一个
while((bb<15||aa>=0)&&qizi[aa][bb]==player) {tongyang++;bb++;aa--;} //向右上找
aa=a;bb=b;
bb--;aa++;//先除去自身位置,再找下一个
while((bb>=0||aa<15)&&qizi[aa][bb]==player) {tongyang++;bb--;aa++;} //向右下找
aa=a;bb=b;
if(tongyang+1>=5) return player;
tongyang=0;

}
}
return 0;
}

int main(void)
{
char ch;
int win=0;
system("title 五子棋");//设置控制台标题
system("mode con cols=33 lines=18");//设置控制台窗口尺寸
system("color 3A");//设置控制台背景和字体颜色
qipu_init();//打印棋盘
ch=getch();//获取按键信息
while(1)
{
key_jiance(ch); //检测当前按下的某键
if(ch==32)
{
win=shuyin();
}
if(win==1)
{
gotoxy(0,16);
printf("■ win\n");break;
}
else if(win==2)
{
gotoxy(0,16);
printf("● win\n");break;
}
else
{
ch=getch();
continue;
}
}
}

相关文档
最新文档