五子棋c语言最简单代码(五子棋算法程序 c语言)
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;
}
}
}