时间过的真快,寒假这就快完了.....作业也刚刚完成,100道oj和一个小游戏的作业量感觉秒杀了不少学生(学霸走开).....
oj很多水题就不发了,把五子棋的简单实现奉上,可能会有点帮助,代码写的很乱,不过注释自我感觉还是很全面的.....
这个代码用到的知识都很简单,主要还是思路吧,所以做出来很low,根本不能当作小游戏,权当是简单实现....
这个代码我是参考了别人写的框架,然后自己想的核心,算是个半仿,水平很低,代码还有很多改进的地方,甚至有bug,时间有限,后来功力上涨后在看吧
/*Copyright(c)2016,烟台大学计算机学院 all rights reserved.
作者:曹欣宇
指导教师:贺利坚
完成日期:2017年2月21日
输入
落子坐标
输出
落子后棋盘
样例输入
见运行图
样例输出
见运行图
*/
#include
#include
#define N 20
//以下为初始化棋盘函数,将棋盘初始化
void init_wzq(char (*game)[N])
{
int i,j;
for(i=0; i=4)//横向分两种情况,第一,下的子纵坐标>=4,第二,下的子纵坐标<4
p1=qizi2-4;
else
p1=0;
for(j=p1; j<=qizi2+4; j++)//从下子左边4个开始看整行是否存在五子连珠,若左边不到四个就到零的话就从零开始。
{
if(game[qizi1][j]=='@')
{
for(j2=j; j2<=j+4; j2++)
{
if(game[qizi1][j2]!='@')
m=0;
}
if(m==1)
{
printf("黑棋获得胜利!\n");
return 1;
}
}
}
m=1;
//以下为竖向
if(qizi1>=4)//与横向相似
p2=qizi1-4;
else
p2=0;
for(j=p2; j<=qizi1+4; j++)
{
if(game[j][qizi2]=='@')
{
for(j2=j; j2<=j+4; j2++)
{
if(game[j2][qizi2]!='@')
m=0;
}
if(m==1)
{
printf("黑棋获得胜利!\n");
return 1;
}
}
}
m=1;
//一下为“/”向
p3=qizi1,p4=qizi2;//这里最好将qizi变量固定,因为\向一会还要用到,如果不变,将影响\向的判断
while(p4!=0&&p3!=N-1)//将落子的数值通过循环,变到/向的最左下角
{
p3++;
p4--;
}
j=p3;
while(p3!=0&&p4!=N-1)//从之前的左下角,遍历到右上角,检测是否有五子连珠
{
if(game[p3][p4]=='@')
{
q3=p3,q4=p4;
for(j2=j; j2<=j+4; q3--,q4++,j2++)
{
if(game[q3][q4]!='@')
m=0;
}
if(m==1)
{
printf("黑棋获得胜利!\n");
return 1;
}
}
j--;
p3--,p4++;
}
m=1;
//以下为“\”方向
while(qizi2!=N-1&&qizi1!=N-1)//思路同/向
{
qizi1++;
qizi2++;
}
j=qizi1;
while(qizi1!=0&&qizi2!=0)
{
if(game[qizi1][qizi2]=='@')
{
p3=qizi1,p4=qizi2;
for(j2=j; j2<=j+4; p3--,p4--,j2++)
{
if(game[p3][p4]!='@')
m=0;
}
if(m==1)
{
printf("黑棋获得胜利!\n");
return 1;
}
}
j--,qizi1--,qizi2--;
}
return 0;
}
//以下为白棋的判断函数,和黑棋几乎一样,相似度如此之高(只是‘@’变为‘O’),还是有改进的余地
int playWhile_wzq(int qizi1,int qizi2,char (*game)[N])
{
int j,j2,p1,p2,p3,p4,q3,q4,m=1;
//以下为横向
if(qizi2>=4)
p1=qizi2-4;
else
p1=0;
for(j=p1; j<=qizi2+4; j++)
{
if(game[qizi1][j]=='O')
{
for(j2=j; j2<=j+4; j2++)
{
if(game[qizi1][j2]!='O')
m=0;
}
if(m==1)
{
printf("白棋获得胜利!\n");
return 1;
}
}
}
m=1;
//以下为竖向
if(qizi1>=4)
p2=qizi1-4;
else
p2=0;
for(j=p2; j<=qizi1+4; j++)
{
if(game[j][qizi2]=='O')
{
for(j2=j; j2<=j+4; j2++)
{
if(game[j2][qizi2]!='O')
m=0;
}
if(m==1)
{
printf("白棋获得胜利!\n");
return 1;
}
}
}
m=1;
//一下为“/”向
p3=qizi1,p4=qizi2;
while(p4!=0&&p3!=N-1)
{
p3++;
p4--;
}
j=p3;
while(p3!=0&&p4!=N-1)
{
if(game[p3][p4]=='O')
{
q3=p3,q4=p4;
for(j2=j; j2<=j+4; q3--,q4++,j2++)
{
if(game[q3][q4]!='O')
m=0;
}
if(m==1)
{
printf("白棋获得胜利!\n");
return 1;
}
}
j--;
p3--,p4++;
}
m=1;
//以下为“\”方向
while(qizi2!=N-1&&qizi1!=N-1)
{
qizi1++;
qizi2++;
}
j=qizi1;
while(qizi1!=0&&qizi2!=0)
{
if(game[qizi1][qizi2]=='O')
{
p3=qizi1,p4=qizi2;
for(j2=j; j2<=j+4; p3--,p4--,j2++)
{
if(game[p3][p4]!='O')
m=0;
}
if(m==1)
{
printf("白棋获得胜利!\n");
return 1;
}
}
j--,qizi1--,qizi2--;
}
return 0;
}
int main()
{
char game[N][N];
int white1=0,white2=0;//白棋的坐标
int black1=0,black2=0;//黑棋的坐标
int judge=0;//判断输赢
int count=0;//判断落子
printf("简易(麻烦)五子棋,本棋盘黑棋先走\n");
init_wzq(game);
show_wzq(game);
while(1)
{
if(count==N*N)
{
printf("棋盘已满,平局!\n");
}
if(count%2==0)//count为0,2,4,等偶数时,黑棋落子
{
printf("请输入您要落子(黑子)的坐标(例如0 1或4 8,4 8为5行9列):");
scanf("%d %d",&black1,&black2);
while(black1>N-1||black2>N-1||black1<0||black2<0)
{
printf("落子出界,请重新输入!");
scanf("%d %d",&black1,&black2);
}
while(game[black1][black2]!='+')
{
printf("此处已经落过子,请重新落子:");
scanf("%d %d",&black1,&black2);
}
game[black1][black2]='@';//这行是参考别人的,感觉很巧妙,大神勿喷....
judge=playBlack_wzq(black1,black2,game);
if(judge==1)
{
show_wzq(game);
printf("程序结束\n");
return 0;
}
}
else//白棋
{
printf("请输入您要落子(白子)的坐标(例如0 1或4 8,4 8为5行9列):");
scanf("%d %d",&white1,&white2);
if(white1>N-1||white2>N-1||white1<0||white2<0)
{
printf("落子出界,请重新输入!\n");
while(white1<=N-1&&white2<=N-1)
{
scanf("%d %d",&white1,&white2);
}
}
while(game[white1][white2]!='+')
{
printf("此处已经落过子,请重新落子:");
scanf("%d %d",&white1,&white2);
}
game[white1][white2]='O';
judge=playWhile_wzq(white1,white2,game);
if(judge==1)
{
show_wzq(game);
printf("程序结束\n");
return 0;
}
}
count++;
show_wzq(game);
}
return 0;
}