怎样用c语言编写五子棋的棋盘

Python09

怎样用c语言编写五子棋的棋盘,第1张

    棋盘如果没有界面,那种有线和框的,就用0放在每个位置,当作一个位置,玩家1如果放下子的话,就将0变成1,玩家2放下棋子,0变成2

    复杂的界面,就去找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

}