复杂的界面,就去找MFC、QT吧
struct stu //定义位置记录结构体
{
int x
int y
}weizhi
int player=1
int Q[20][20]={0} //定义数组以记录落子情况
void drawqipan() //绘制棋盘及数据初始化
{
int i,j
system("cls") //清除屏幕
for(i=0i<20i++)
{
for(j=0j<20j++)
{
Q[i][j]=0
printf("十")
}
printf("\n")
}
weizhi.x=0weizhi.y=0 //程序数据初始化
gotoxy(0,0)
}
我浏览了一下你的代码,你对胜利的判断采用的是检查整个棋盘的方式,这样做的最大弊端自然是低效,而且在编写斜方向判断的时候比较复杂。我建议你采用下子后判断的方式,即玩家1下了一个字后,像该子周围8个方向检查是否存在5子的情况,只需要一个判断方法,而且较为简单。void chooseONE()
{
printf("第一玩家请选择下棋位置\n")
printf("第几个直的\n")
scanf("%d",&co)
printf("第几个横的\n")
scanf("%d",&ro)
while(arr[ro][co]==1||arr[ro][co]==2)
{
printf("重复了!!!\n")
printf("第几个直的\n")
scanf("%d",&co)
printf("第几个横的\n")
scanf("%d",&ro)
}
arr[ro][co]=1
//这里加判断代码,建议用一个判断函数,我给你写个吧
}
//我这里这个方法写了个大概,你看一下和你的代码结合一下就可以了,我用i和j作为for循环的变量,你用来做最大的长宽值,这些你都要改一下。
flag作为判断是否胜利的标志,playerNum是玩家的标志,分1和2,这个函数只写了左和左上的判断,其他方向楼主仿照着写
int win(int row, int col, int playerNum){
int i = 0,j = 0
int flag = 1
if(row - 4 >= 0){
flag = 1
for(i = rowi >= 0i--){
if(arr[i][j] != playerNum){
flag = 0
break
}
}
if(flag == 1){
return 1
}
}
if(row - 4 >= 0 &&col - 4 >= 0){
flag = 1
for(i = row ,j = col i >= 0&&j>=0i--,j--){
if(arr[i][j] != playerNum){
flag = 0
break
}
}
if(flag == 1){
return 1
}
}
}
#include <stdio.h>int a[16][16]={
{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
{-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
}
void banben()
{
printf(" ***************************************\n")
printf(" * 欢迎*\n")
printf(" * 五 子 棋*\n")
printf(" * 版本号:V2.0 正式版*\n")
printf(" * 更新:1.新增系统只能判断结果!*\n")
printf(" * 2.全面支持中文人名 *\n")
printf(" * 3.采用国际标准棋盘15*15 *\n")
printf(" ***************************************\n\n\n")
}
void guize()
{
printf(" 五子棋规则\n")
printf(" 五子棋比赛规则行棋顺序黑先、白后,从天元开始相\n")
printf(" 互顺序落子。判断胜负最先在棋盘横向、竖向、斜向\n")
printf(" 形成连续的相同色五个棋子的一方为胜。棋盘:15*15 \n")
printf(" 注意:输入姓名是一定是3个汉字!如果姓名为两个字\n")
printf(" 的话,请多打2个字符,以保证程序正常运行!谢谢!\n\n\n\n\n\n\n\n")
}
void printQP()
{
int x,y,k=1
printf(" 1 2 3 4 5 6 7 8 9 101112131415\n")
for (x=1x<=15x++)
{ if(k<=9 )
printf(" ")
printf("%d",k)
for(y=1y<=15y++)
{
if(a[x][y]==0)
printf("□")
if(a[x][y]==1)
printf("○")
if(a[x][y]==2)
printf("●")
}
printf("\n")
k++
}
}
int pd(int x,int y,int cc)
{int xt,yt,count
//横向
count=0
xt=xyt=y-1
while( yt>=1 &&yt<=15 &&xt<=15 &&xt>=1 && a[xt][yt]==cc)
{
count++
yt--
}
xt=xyt=y+1
while( yt>=1 &&yt<=15 &&xt<=15 &&xt>=1 && a[xt][yt]==cc)
{
count++
yt++
}
count++
if(count==5)
{
if(cc=1)
return 1
if(cc=2)
return 2
}
//纵向
count=0
xt=x-1yt=y
while( yt>=1 &&yt<=15 &&xt<=15 &&xt>=1 && a[xt][yt]==cc)
{
count++
xt--
}
xt=x+1yt=y
while( yt>=1 &&yt<=15 &&xt<=15 &&xt>=1 && a[xt][yt]==cc)
{
count++
xt++
}
count++
if(count==5)
{
if(cc=1)
return 1
if(cc=2)
return 2
}
//主对角线
count=0
xt=x-1yt=y+1
while( yt>=1 &&yt<=15 &&xt<=15 &&xt>=1 && a[xt][yt]==cc)
{
count++
xt--yt++
}
xt=x+1yt=y-1
while( yt>=1 &&yt<=15 &&xt<=15 &&xt>=1 && a[xt][yt]==cc)
{
count++
yt--xt++
}
count++
if(count==5)
{
if(cc=1)
return 1
if(cc=2)
return 2
}
//对角线
count=0
xt=x-1yt=y-1
while( yt>=1 &&yt<=15 &&xt<=15 &&xt>=1 && a[xt][yt]==cc)
{
count++
yt--xt--
}
xt=x+1yt=y+1
while( yt>=1 &&yt<=15 &&xt<=15 &&xt>=1 && a[xt][yt]==cc)
{
count++
yt++xt++
}
count++
if(count==5)
{
if(cc=1)
return 1
if(cc=2)
return 2
}
else
return 0
}
int hefa(int x,int y)
{
if( x>=1 &&y>=1 &&x<=15 &&y<=15 &&a[x][y]==0)
return 1
else
return 0
}
int main()
{
int xt,yt,x,y,cc,count,l=0,g=0
char e[7],f[7]
banben()
e[6]=1
f[6]=1
guize()
printf("请输入玩家一姓名(黑棋)支持中文:")
scanf("%s",e)
printf("请输入玩家二姓名(白棋)支持中文:")
scanf("%s",f)
printQP()
g=0
while(g==0)
{
kaishi:
cc=1
printf("%s下\n",e)
scanf("%d%d",&x,&y)
l=hefa(x,y)
if (l==1)
{
a[x][y]=1
}
else
{printf("棋子错误!\n")
goto kaishi
}
if (a[x][y]==1)
{
printQP()
}
g=0
g=pd(x,y,cc)
if(g==1)
{printf("s赢!\n",e)break}
if(g==2)
{printf("%s赢!\n",f)break}
///////////////////////////////////////////////////////
kaishi2:
cc=2
printf("%s下\n",f)
scanf("%d%d",&x,&y)
l=hefa(x,y)
if (l==1)
{
a[x][y]=2
}
else
{
printf("棋子错误!\n")
goto kaishi2
}
if (a[x][y]==2)
{
printQP()
}
g=0
g=pd(x,y,cc)
if(g==1)
{printf("%s赢!\n",e)break}
if(g==2)
{printf("%s赢!\n",f)break}
}
getchar()getchar()
return 0
}