master
18408000302@stu.hut.edu.cn 6 years ago
commit 6d1ff511bd

@ -0,0 +1,470 @@
#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);
}
}
Loading…
Cancel
Save