You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

471 lines
14 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"计分板.c"
extern void jifenban();//调用另一个文件的计分板函数
void huanying();//欢迎界面
void printqipan();//打印棋盘
void initqipan();//初始化棋盘
void white();//白方下棋
void black();//黑方下棋
void startgame();//游戏开始主体
int panduan(int,int);//判断输赢函数
int win(); //显示谁赢
char p[19][19][4];//棋盘数组
int a,b,c,d,x,y,w,z,B,H;//BH用来记录白黑棋手的赢局计分
char ch;
int whowin;
int last;//棋盘剩余空位
int main(){
huanying();
return 0;
}
void startgame() //游戏主体函数
{
initqipan(); /*棋盘初始化*/
while(1)
{
black();//进入黑方下棋函数
last--;//检测棋盘剩余空位
if(win()==1)//判断是否这一步下完就赢了
break;
system("cls");//清理屏幕
//黑棋下完白棋下
white();//进入白方下棋函数
last--;//检测棋盘剩余空位
if(win()==1)//判断是否这一步下完就赢了
break;
system("cls");//清理屏幕
if(last==0)
win();//平局进入胜利函数,显示谁赢
}
printf(" 您是否重新开始游戏请输入Y or N ");//询问用户是否再来一局
scanf("%s",&ch);
if(ch=='Y')//再来一局
{
system("cls");
startgame();//再次进入游戏函数,开始游戏
}
if(ch=='N')//退出游戏
{
system("cls");
printf(" ~游戏结束~");//结束游戏
jifenban();////////调用另一个文件的计分板函数/////////
return;
}
}
void black() //黑棋落子
{
printqipan();
printf("\n 请黑方落子 \n");//请黑方下棋
printf(" 示例为“行坐标 空格 纵坐标”“2 3”表示下棋在行坐标为2纵坐标为3处 \n");//提示用户下棋格式
printf(" ");
scanf("%d%d",&x,&y);
while(1)
{
if(x>=0&&x<=18&&y>=0&&y<=18)
{
if(strcmp(p[x][y]," ")==0)//判断棋盘位置是否已有棋子
{
strcpy(p[x][y],"");//没有则下黑棋
break;
}
else
printf(" 您不能在此位置落子,请重新输入坐标:");//已有棋子则提示用户重新落子
}
else printf(" 输入的坐标超过了棋盘范围");
scanf("%d%d",&x,&y);
}
system("cls");
printqipan();
printf(" 请问少侠要悔棋吗请输入Y 悔棋 N不悔棋 ");//询问用户是否需要悔棋
scanf("%s",&ch);
if(ch=='Y')
{
system("cls");
strcpy(p[x][y]," ");//悔棋则复原上一步棋盘
black();//进入黑棋下棋函数
}
if(ch=='N')
return;//不悔棋则退出
}
void white() //白旗落子
{
printqipan();//进入打印棋盘函数
printf("\n 请白方落子 \n");//请白方落子
printf(" 示例为“行坐标 空格 纵坐标”“2 3”表示下棋在行坐标为2纵坐标为3处 \n");//提示输入坐标格式
printf(" ");
scanf("%d%d",&x,&y);
while(1)
{
if(x>=0&&x<=18&&y>=0&&y<=18)
{
if(strcmp(p[x][y]," ")==0)//判断棋盘位置是否已有棋子
{
strcpy(p[x][y],"");//没有则下黑棋
break;
}
else
printf(" 您不能在此位置落子,请重新输入坐标:");//已有棋子则提示用户重新落子
}
else printf(" 输入的坐标超过了棋盘范围");
scanf("%d%d",&x,&y);
}
system("cls");
printqipan();
printf(" 请问少侠要悔棋吗请输入Y 悔棋 N不悔棋 ");//询问是否悔棋
scanf("%s",&ch);
if(ch=='Y')
{
strcpy(p[x][y]," ");//悔棋则复原
system("cls");
white();//悔棋的重新下棋
}
if(ch=='N')//不悔棋则退出
return;
}
int win() ///////显示哪一方赢了
{
int havewinner=0;
int whowin;
whowin=panduan(x,y); //////表示谁赢了 白方返回 1 黑方返回 2
if(whowin==1)
{
havewinner=1;
printf(" \n 白方胜利\n");
B++;//计分赢一局
}
if(whowin==2)
{
havewinner=1;
printf(" \n 黑方胜利\n");
H++;//计分赢一句
}
if(last==0&&havewinner==0)
printf("~本局平局~");//平局显示
return havewinner;
}
int panduan(int x,int y)/////////////判断函数
{
char color[4];//保存下棋方的颜色
int count=1;//统计个数,针对的同一个线
int i=1;//水平和竖直方向上
int j=1;//和i同时用来代表斜方向上
int winner=0;//1代表白方2代表黑方
strcpy(color,p[x][y]);
//水平的左边
while(strcmp(color,p[x][y-i])==0&&x>=0&&x<19&&y>=0&&y<19&&count<5)
{
i++;
count++;
if(count==5)//首先count是5才能来判断谁赢了不然连资格都没有
{
if(strcmp(color,"")==0)
winner=1;
else
winner=2;
strcpy(p[x][y],"");
i=1;count=1;
while(strcmp(color,p[x][y-i])==0&&x>=0&&x<19&&y>=0&&y<19&&count<5)
{
strcpy(p[x][y-i],"");
i++;count++;
}
i=1;
while(strcmp(color,p[x][y+i])==0&&x>=0&&x<19&&y>=0&&y<19&&count<5)
{
strcpy(p[x][y+i],"");
i++;count++;
}
}
}
//水平的右边
i=1;
while(strcmp(color,p[x][y+i])==0&&x>=0&&x<19&&y>=0&&y<19&&count<5)
{
i++;
count++;
if(count==5)//首先count是5才能来判断谁赢了不然连资格都没有
{
if(strcmp(color,"")==0)
winner=1;
else
winner=2;
strcpy(p[x][y],"");
i=1;count=1;
while(strcmp(color,p[x][y+i])==0&&x>=0&&x<19&&y>=0&&y<19&&count<5)
{
strcpy(p[x][y+i],"");
i++;count++;
}
i=1;
while(strcmp(color,p[x][y-i])==0&&x>=0&&x<19&&y>=0&&y<19&&count<5)
{
strcpy(p[x][y-i],"");
i++;count++;
}
}
}
//解决垂直的方向
//垂直上方
i=1;
count=1;//清理掉之前的数据
while(strcmp(color,p[x-i][y])==0&&x>=0&&x<19&&y>=0&&y<19&&count<5)
{
i++;
count++;
if(count==5)//首先count是5才能来判断谁赢了不然连资格都没有
{
if(strcmp(color,"")==0)
winner=1;
else
winner=2;
strcpy(p[x][y],"");
i=1;count=1;
while(strcmp(color,p[x-i][y])==0&&x>=0&&x<19&&y>=0&&y<19&&count<=5)
{
strcpy(p[x-i][y],"");
i++;count++;
}
i=1;
while(strcmp(color,p[x+i][y])==0&&x>=0&&x<19&&y>=0&&y<19&&count<=5)
{
strcpy(p[x+i][y],"");
i++;count++;
}
}
}
//垂直下方
i=1;
while(strcmp(color,p[x+i][y])==0&&x>=0&&x<19&&y>=0&&y<19&&count<5)
{
i++;
count++;
if(count==5)//首先count是5才能来判断谁赢了不然连资格都没有
{
if(strcmp(color,"")==0)
winner=1;
else
winner=2;
strcpy(p[x][y],"");
i=1;count=1;
while(strcmp(color,p[x+i][y])==0&&x>=0&&x<19&&y>=0&&y<19&&count<=5)
{
strcpy(p[x+i][y],"");
i++;count++;
}
i=1;
while(strcmp(color,p[x-i][y])==0&&x>=0&&x<19&&y>=0&&y<19&&count<=5)
{
strcpy(p[x-i][y],"");
i++;count++;
}
}
}
//解决左上的斜线 上方
i=1;
j=1;
count=1;
while(strcmp(color,p[x-i][y-j])==0&&x>=0&&x<19&&y>=0&&y<19&&count<5)
{
i++;
j++;
count++;
if(count==5)//首先count是5才能来判断谁赢了不然连资格都没有
{
if(strcmp(color,"")==0)
winner=1;
else
winner=2;
strcpy(p[x][y],"");
i=1;j=1;count=1;
while(strcmp(color,p[x-i][y-j])==0&&x>=0&&x<19&&y>=0&&y<19&&count<5)
{
strcpy(p[x-i][y-j],"");
i++;j++;count++;
}
i=1;j=1;
while(strcmp(color,p[x+i][y+j])==0&&x>=0&&x<19&&y>=0&&y<19&&count<5)
{
strcpy(p[x+i][y+j],"");
i++;j++;count++;
}
}
}
//解决左上的斜线 下方
i=1;
j=1;
while(strcmp(color,p[x+i][y+j])==0&&x>=0&&x<19&&y>=0&&y<19&&count<5)
{
i++;
j++;
count++;
if(count==5)//首先count是5才能来判断谁赢了不然连资格都没有
{
if(strcmp(color,"")==0)
winner=1;
else
winner=2;
strcpy(p[x][y],"");
i=1;j=1;count=1;
while(strcmp(color,p[x+i][y+j])==0&&x>=0&&x<19&&y>=0&&y<19&&count<5)
{
strcpy(p[x+i][y+j],"");
i++;j++;count++;
}
i=1;j=1;
while(strcmp(color,p[x-i][y-j])==0&&x>=0&&x<19&&y>=0&&y<19&&count<5)
{
strcpy(p[x-i][y-j],"");
i++;j++;count++;
}
}
}
//解决右上的斜线 上方
i=1;
j=1;
count=1;
while(strcmp(color,p[x-i][y+j])==0&&x>=0&&x<19&&y>=0&&y<19&&count<5)
{
i++;
j++;
count++;
if(count==5)//首先count是5才能来判断谁赢了不然连资格都没有
{
if(strcmp(color,"")==0)
winner=1;
else
winner=2;
strcpy(p[x][y],"");
i=1;j=1;count=1;
while(strcmp(color,p[x-i][y+j])==0&&x>=0&&x<19&&y>=0&&y<19&&count<5)
{
strcpy(p[x-i][y+j],"");
i++;j++;count++;
}
i=1;j=1;
while(strcmp(color,p[x+i][y-j])==0&&x>=0&&x<19&&y>=0&&y<19&&count<5)
{
strcpy(p[x+i][y-j],"");
i++;j++;count++;
}
}
}
//解决右上的斜线 下方
i=1;
j=1;
while(strcmp(color,p[x+i][y-j])==0&&x>=0&&x<19&&y>=0&&y<19&&count<5)
{
i++;
j++;
count++;
if(count==5)//首先count是5才能来判断谁赢了不然连资格都没有
{
if(strcmp(color,"")==0)
winner=1;
else
winner=2;
strcpy(p[x][y],"");
i=1;j=1;count=1;
while(strcmp(color,p[x+i][y-j])==0&&x>=0&&x<19&&y>=0&&y<19&&count<5)
{
strcpy(p[x+i][y-j],"");
i++;j++;count++;
}
i=1;j=1;
while(strcmp(color,p[x-i][y+j])==0&&x>=0&&x<19&&y>=0&&y<19&&count<5)
{
strcpy(p[x-i][y+j],"");
i++;j++;count++;
}
}
}
return winner;
}
void initqipan() /////////初始化棋盘
{
int i,j;
for(i=0;i<19;i++)
for(j=0;j<19;j++)
strcpy(p[i][j]," ");
}
void printqipan() /*打印棋盘*/
{
int i,j;
system("color e2");//更改屏幕为淡黄色,字体为绿色。
printf(" 欢迎来到湖工大王力宏五子棋\n");
printf(" 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 \n");
printf(" ┌ —┬ —┬ —┬ —┬ —┬ —┬ —┬ —┬ —┬ —┬ —┬ —┬ —┬ —┬ —┬ —┬ —┬ —┬ —┐\n");
for(i=0,j=0;i<18;i++,j++){
printf(" %2d │ %s│ %s│ %s│ %s│ %s│ %s│ %s│ %s│ %s│ %s│ %s│ %s│ %s│ %s│ %s│ %s│ %s│ %s│ %s│%2d\n",j,p[i][0],p[i][1],p[i][2],p[i][3],p[i][4],p[i][5],p[i][6],p[i][7],p[i][8],p[i][9],p[i][10],p[i][11],p[i][12],p[i][13],p[i][14],p[i][15],p[i][16],p[i][17],p[i][18],j);
printf(" ├ —┼ —┼ —┼ —┼ —┼ —┼ —┼ —┼ —┼ —┼ —┼ —┼ —┼ —┼ —┼ —┼ —┼ —┼ —┤\n");
}
printf(" 18 │ %s│ %s│ %s│ %s│ %s│ %s│ %s│ %s│ %s│ %s│ %s│ %s│ %s│ %s│ %s│ %s│ %s│ %s│ %s│18\n",p[18][0],p[18][1],p[18][2],p[18][3],p[18][4],p[18][5],p[18][6],p[18][7],p[18][8],p[18][9],p[18][10],p[18][11],p[18][12],p[18][13],p[18][14],p[18][15],p[18][16],p[18][17],p[18][18]);
printf(" └ —┴ —┴ —┴ —┴ —┴ —┴ —┴ —┴ —┴ —┴ —┴ —┴ —┴ —┴ —┴ —┴ —┴ —┴ —┘\n");
printf(" 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 \n");
}
void huanying() //欢迎界面
{
char choice;
int i,j;
system("color e2"); //更改屏幕为浅黄色,字体为绿色。
printf("\n\n\n\n\n\n\n\n\n\n\n");
printf(" ●● ●● ●●●●● ●●●●● ●●●●●●●●●●●\n");/*欢迎界面*/
for(i=0;i<5;i++)
printf(" ●● ●● ●● ●● ●●\n");
printf(" ●●●●●●●●●●● ●● ●● ●●\n");
for(i=0;i<3;i++)
printf(" ●● ●● ●● ●● ●●\n");
printf(" ●● ●● ●●●●●●● ●●\n");
printf(" ●● ●● ●●●●●● ●●\n\n");
printf(" 欢迎来到湖南工业大学五子棋游戏\n\n");
printf(" 五子棋的简介:两个人一起玩的游戏。谁率先在棋盘上连成连续五个线型\n");/*游戏简介*/
printf(" 的同色棋子谁就赢得比赛线型包括直线型和斜45°线型。\n\n");
printf(" *******************************小艺、小羊联合出品***********************************\n");
printf(" 【寒 星 溪 月 疏 星 首,花 残 二 月 并 白 莲。】\n");
printf(" 【雨 月 金 星 追 黑 玉,松 丘 新 宵 瑞 山 腥。】\n");
printf(" 【星 月 长 峡 恒 水 流,白 莲 垂 俏 云 浦 岚。】\n");
printf(" 【黑 玉 银 月 倚 明 星,斜 月 明 月 堪 称 朋。】\n");
printf(" 【二 十 六 局 先 弃 二,直 指 游 星 斜 彗 星。】\n\n");
printf(" ---这首诗,送给少侠。。。\n\n");/*一首关于五子棋的诗,送给游戏者。*/
printf(" 少侠,请来一局吧。\n\n");
printf(" 人人对战\n\n");
printf(" 少侠请开始您的游戏1.开始游戏 2.退出游戏\n\n 您的选择是:");/*让用户选择游戏的开始或者退出游戏*/
scanf("%s",&choice);
while(1){
if(choice=='1'||choice=='2')
{
if(choice=='1')
{
system("cls");
startgame(); ////////开始游戏
}
if(choice=='2')
return ;
}
else
printf(" 输入错误,少侠请重试哦。。。");/*用户不规范输入的提示并要求用户重新输入*/
scanf("%s",&choice);
}
}