五子棋c语言最简单代码(五子棋算法程序 c语言)

http://www.itjxue.com  2023-03-18 02:14  来源:未知  点击次数: 

C语言编五子棋(二维数组),很简单

#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=1;x=15;x++)

{ if(k=9 )

printf(" ");

printf("%d",k);

for(y=1;y=15;y++)

{

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=x;yt=y-1;

while( yt=1 yt=15 xt=15 xt=1 a[xt][yt]==cc)

{

count++;

yt--;

}

xt=x;yt=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-1;yt=y;

while( yt=1 yt=15 xt=15 xt=1 a[xt][yt]==cc)

{

count++;

xt--;

}

xt=x+1;yt=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-1;yt=y+1;

while( yt=1 yt=15 xt=15 xt=1 a[xt][yt]==cc)

{

count++;

xt--;yt++;

}

xt=x+1;yt=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-1;yt=y-1;

while( yt=1 yt=15 xt=15 xt=1 a[xt][yt]==cc)

{

count++;

yt--;xt--;

}

xt=x+1;yt=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;

}

人人对弈的简单五子棋程序 c语言 棋盘是点 语言200行左右

五子棋程序:

#includeiostream

using namespace std;

int Hsheng(char a[][15]);//判断o子是否获胜的函数

int Bsheng(char a[][15]);//判断x子是否获胜的函数

int he(char a[][15]);//判断是否平局(也就是棋盘下满了)的函数

void qipan(char a[15][15])//执行输出棋盘命令

{ for(int i=0;i15;i++) //打印棋盘

{ for(int j=0;j15;j++)

couta[i][j];

coutendl; } }

int main()

{ char a[15][15]; int x,y;

for(int i=0;i15;i++)

for(int j=0;j15;j++)

a[i][j]=' '; qipan(a);

while(1)//用循环语句执行o,x交替下子,这些while语句看起来似乎是个死循环~实际上都会经过break结束

{ int a1=1;

while(1)

{ for(;a1;)

{ cout"请输入o子下的位置:"; //输入o子的位置

cinxy; if(a[x][y]=='o'||a[x][y]=='x')//判断是否已有子

{cout"已有子请重下"",";continue;}

else if(x=15||y=15){cout"输入错误请重输"",";continue;}

else { a[x][y]='o'; a1=0;}

} break;}

qipan(a);//下好o子后将棋盘显示

if(Hsheng(a))//判断o子是否已经获胜

{ cout"o子获胜"endl; break; }

while(1)//下x子

{ cout"请输入x子下的位置:";

cinxy;

if(a[x][y]=='o'||a[x][y]=='x'||x=15||y=15)

{ for( ; a[x][y]=='o'||a[x][y]=='x'; )

{ cout"已有子请重下";

cout"请输入x子下的位置:";

cinxy;continue; }

for ( ; x=15||y=15||x; )

{ cout"输入错误请重输"","; //判断输入棋子位置是否正确

cout"请输入x子下的位置:";

cinxy;continue ;}

a[x][y]='x';break; }

else

{ a[x][y]='x'; break; } }

qipan(a);//再一次输出棋盘

if(Bsheng(a))//判断x子是否已经获胜

{ cout"x子获胜"endl; break; }

if(he(a))//判断是否平局

{ cout"平局"endl; break; } }

return 0; }

int Hsheng(char a[][15])

{ int i,j;//判断横着的5个是否都相等

for(i=0;i15;i++)

for(j=0;j15;j++)

if(a[i][j]=='o'a[i][j+1]=='o'a[i][j+2]=='o'a[i][j+3]=='o'a[i][j+4]=='o')

return 1;

for(j=0;j15;j++)//判断竖着的5个是否都相等

for(i=0;i15;i++)

if(a[i][j]=='o'a[i+1][j]=='o'a[i+2][j]=='o'a[i+3][j]=='o'a[i+4][j]=='o')

return 1;

for(i=0;i15;i++)//判断左斜5个

for(j=0;j15;j++)

if(a[i][j]=='o'a[i+1][j+1]=='o'a[i+2][j+2]=='o'a[i+3][j+3]=='o'a[i+4][j+4]=='o')

return 1;

for(i=0;i15;i++)//右斜5个

for(j=14;j3;j--)

if(a[i][j]=='H'a[i+1][j-1]=='o'a[i+2][j-2]=='o'a[i+3][j-3]=='o'a[i+4][j-4]=='o')

return 1;

return 0; }

int Bsheng(char a[][15])//同o,只是改字符

{ int i,j;

for(i=0;i15;i++)

for(j=0;j15;j++)

if(a[i][j]=='x'a[i][j+1]=='x'a[i][j+2]=='x'a[i][j+3]=='x'a[i][j+4]=='x')

return 1;

for(j=0;j15;j++)

for(i=0;i15;i++)

if(a[i][j]=='x'a[i+1][j]=='x'a[i+2][j]=='x'a[i+3][j]=='x'a[i+4][j]=='x')

return 1;

for(i=0;i15;i++)

for(j=0;j15;j++)

if(a[i][j]=='x'a[i+1][j+1]=='x'a[i+2][j+2]=='x'a[i+3][j+3]=='x'a[i+4][j+4]=='x')

return 1;

for(i=0;i15;i++)

for(j=14;j3;j--)

if(a[i][j]=='x'a[i+1][j-1]=='x'a[i+2][j-2]=='x'a[i+3][j-3]=='x'a[i+4][j-4]=='x')

return 1;

return 0; }

int he(char a[][15])

{ for(int i=0;i15;i++)

for(int j=0;j15;j++)

{ if(a[i][j]==' ')//当棋盘全部子都不是' '时才能return 1,即棋盘已下满

return 0;

}

return 1;

}

希望能帮到你!!

怎样用C语言编一个简单的五子棋游戏?

#include graphics.h

#include stdio.h

#include MATH.H

IMAGE* IMG;

IMAGE* IMG2;

IMAGE* IMG3;

IMAGE* whole;

bool mark = false;

int x = 0, y = 0;

int flag[15][15];

void show()

{

outtextxy(550, 100, "白方:");

outtextxy(550, 150, " 箭头移动");

outtextxy(550, 200, " 回车键落子");

outtextxy(550, 250, "黑方:");

outtextxy(550, 300, " ADWS移动");

outtextxy(550, 350, " 空格键落子");

}

int success1(int dir1, int dir2)

{

int number = 0;

int temp_x = x, temp_y = y;

while (((temp_x / 35 + dir1) = 0 (temp_x / 35 + dir1) 15) ((temp_y / 35 + dir2) = 0 (temp_y / 35 + dir2) 15) (flag[(temp_x / 35 + dir1)][(temp_y / 35 + dir2)] == 1))

{

temp_x = temp_x + dir1 * 35;

temp_y = temp_y + dir2 * 35;

++number;

}

return number;

}

int success2(int dir1, int dir2)

{

int number = 0;

int temp_x = x, temp_y = y;

while (((temp_x / 35 + dir1) = 0 (temp_x / 35 + dir1) 15) ((temp_y / 35 + dir2) = 0 (temp_y / 35 + dir2) 15) (flag[(temp_x / 35 + dir1)][(temp_y / 35 + dir2)] == 2))

{

temp_x = temp_x + dir1 * 35;

temp_y = temp_y + dir2 * 35;

++number;

}

return number;

}

int success1()

{

int number = 0;

number = success1(0, -1) + success1(0, 1);//上下

if (number 4)

{

number = success1(-1, 0) + success1(1, 0);//左右

if (number 4)

{

number = success1(-1, -1) + success1(1, 1);//左上右下

if (number 4)

{

number = success1(-1, 1) + success1(1, -1);//左下右上

}

}

}

return number;

}

int success2()

{

int number = 0;

number = success2(0, -1) + success2(0, 1);//上下

if (number 4)

{

number = success2(-1, 0) + success2(1, 0);//左右

if (number 4)

{

number = success2(-1, -1) + success2(1, 1);//左上右下

if (number 4)

{

number = success2(-1, 1) + success2(1, -1);//左下右上

}

}

}

return number;

}

void control()

{

char key = 0;

while (key != 27)

{

Sleep(10);

if (kbhit())

{

key = getch();

switch (key)

{

case VK_LEFT:

if (mark)

break;

if (x 0)

x = x - 35;

break;

case 'a':

case 'A':

if (!mark)

break;

if (x 0)

x = x - 35;

break;

case VK_RIGHT:

if (mark)

break;

if (x 490)

x = x + 35;

break;

case 'd':

case 'D':

if (!mark)

break;

if (x 490)

x = x + 35;

break;

case VK_UP:

if (mark)

break;

if (y 0)

y = y - 35;

break;

case 'w':

case 'W':

if (!mark)

break;

if (y 0)

y = y - 35;

break;

case VK_DOWN:

if (mark)

break;

if (y 490)

y = y + 35;

break;

case 's':

case 'S':

if (!mark)

break;

if (y 490)

y = y + 35;

break;

case VK_RETURN:

if (mark)

break;

if (flag[x / 35][y / 35] == 0)

{

putimage(whole, x + 6, y + 6, 31, 32, IMG2, 0, 0);

flag[x / 35][y / 35] = 1;

if (success1() = 4)

{

outtextxy(600, 50, "黑方 胜!");

key = 27;

}

mark = true;

}

break;

case VK_SPACE:

if (!mark)

break;

if (flag[x / 35][y / 35] == 0)

{

putimage(whole, x + 6, y + 6, 31, 31, IMG3, 0, 0);

flag[x / 35][y / 35] = 2;

if (success2() = 4)

{

outtextxy(600, 50, "白方 胜!");

key = 27;

}

mark = false;

}

break;

default:

break;

}

putimage(0, 0, whole);

putimage_transparent(NULL, IMG, x + 20, y + 20, 0x0, 0, 0, 20, 20);

}

}

}

void main()

{

setinitmode(0);

initgraph(800, 538);

SetWindowText(GetHWnd(), "五子棋20110327");

setcolor(0xffffff);

setfont(36, 0, "楷体_GB2312");

IMAGE* IMG1 = new IMAGE;

getimage(IMG1, "JPG", MAKEINTRESOURCE(102));//棋盘

putimage(0, 0, IMG1);

IMG2 = new IMAGE;

getimage(IMG2, "JPG", MAKEINTRESOURCE(103));//黑棋

IMG3 = new IMAGE;

getimage(IMG3, "JPG", MAKEINTRESOURCE(104));//白棋

IMG = new IMAGE;

getimage(IMG, "GIF", MAKEINTRESOURCE(101));//手形

whole = new IMAGE;

getimage(whole, 0, 0, 537, 537);

putimage_transparent(NULL, IMG, x + 20, y + 20, 0x0, 0, 0, 20, 20);

show();

control();

delete IMG1;

delete IMG2;

delete IMG3;

delete whole;

getch();

getch();

closegraph();

}

C语言五子棋

我浏览了一下你的代码,你对胜利的判断采用的是检查整个棋盘的方式,这样做的最大弊端自然是低效,而且在编写斜方向判断的时候比较复杂。我建议你采用下子后判断的方式,即玩家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 = row; i = 0; i--){

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 = 0j=0; i--,j--){

if(arr[i][j] != playerNum){

flag = 0;

break;

}

}

if(flag == 1){

return 1;

}

}

}

(责任编辑:IT教学网)

更多

推荐数据库文章