本文目录一览:
- 1、求四子棋C语言的编程
- 2、求C语言四子棋程序
- 3、C语言编程立体四子棋
求四子棋C语言的编程
专门给你写的楼主,满意的话补分哦~
发现问题给我发消息,我修正
有简单的ai,最好是两个人玩或者左右互搏
开始的有说明菜单
代码的第三行WIN改成几就是几子棋
#include stdio.h
#include conio.h
#include stdlib.h
#include string.h
#define WIN 5
char *view[19][19];
char *const BLACK="○",*const WHITE="●",*const POS="¤";
char *const LT="┌",*const TOP="┬",*const RT="┐";
char *const LEFT="├",*const CENTER="┼",*const RIGHT="┤";
char *const LF="└",*const FOOT="┴",*const RF="┘";
int step[4][2]={1,1,1,-1,1,0,0,1};
int pro;
int side;
int px,py;
int end;
int pvc;
int pside;
int dpx,dpy;
int round;
int style;
void show(int x,int y)
{
int i,j;
printf("\t\t%d子棋\n第%d手\n",WIN,round);
for(i=0;i19;i++)
{
for(j=0;j19;j++)
if(i==xj==y)
printf("%s",POS);
else
printf("%s",view[i][j]);
puts("");
}
if(side)
printf("\n%s黑方回合",BLACK);
else
printf("\n%s白方回合",WHITE);
}
void login()
{
char sel;
getch();
puts("*操作说明*\n");
puts("方向↑ : W键 或者 小键盘8");
puts("方向↓ : S键 或者 小键盘5");
puts("方向← : A键 或者 小键盘4");
puts("方向→ : D键 或者 小键盘6");
puts("落子 : 其他任意键\n");
system("pause");
system("cls");
puts("*请选择模式*\n");
pvc=0;
do
{
pvc=!pvc;
if(pvc)
printf("\r单人游戏");
else
printf("\r双人游戏");
sel=getch();
}while(sel!='\r');
puts("\n");
if(pvc)
{
pside=1;
do
{
pside=!pside;
if(pside)
printf("\r选择黑棋(先行)");
else
printf("\r选择白棋(后行)");
sel=getch();
}while(sel!='\r');
puts("\n");
style=1;
do
{
style=!style;
if(style)
printf("\r电脑风格进攻");
else
printf("\r电脑风格防守");
sel=getch();
}while(sel!='\r');
}
system("cls");
}
void initial()
{
int i,j;
srand(time(NULL));
view[0][0]=LT;
for(i=1;i18;i++)
view[0][i]=TOP;
view[0][18]=RT;
for(i=1;i18;i++)
{
view[i][0]=LEFT;
for(j=1;j18;j++)
view[i][j]=CENTER;
view[i][18]=RIGHT;
}
view[18][0]=LF;
for(i=1;i18;i++)
view[18][i]=FOOT;
view[18][18]=RF;
px=9,py=9;
end=0;
side=1;
pro=1;
for(i=0;iWIN;i++)
pro*=WIN;
show(px,py);
}
int final(int base,int direction)
{
return
direction==1?18:direction==0?-1:0;
}
int judge(int x,int y)
{
int i,j,num,t;
for(t=0;t4;t++)
{
i=x,j=y,num=1;
while(i!=final(i,-step[t][0])
j!=final(j,-step[t][1])
view[i-step[t][0]][j-step[t][1]]==view[x][y])
i-=step[t][0],j-=step[t][1],num++;
i=x,j=y;
while(i!=final(i,step[t][0])
j!=final(j,step[t][1])
view[i+step[t][0]][j+step[t][1]]==view[x][y])
i+=step[t][0],j+=step[t][1],num++;
if(num=WIN)
return 1;
}
return 0;
}
void move()
{
char cmd=getch();
switch(cmd)
{
case 119:case 56:
if(!px)
px=18;
else
px--;break;
case 115:case 53:
if(px==18)
px=0;
else
px++;break;
case 97: case 52:
if(!py)
py=18;
else
py--;break;
case 100:case 54:
if(py==18)
py=0;
else
py++;break;
default:
if(view[px][py]!=BLACK
view[px][py]!=WHITE)
{
if(side)
view[px][py]=BLACK;
else
view[px][py]=WHITE;
side=!side;
if(judge(px,py))
end=1;
}
}
}
void win()
{
if(side)
puts("\r白方胜! ");
else
puts("\r黑方胜! ");
}
int uabs(int i)
{
return i0?-i:i;
}
int cml(int i)
{
return i0?i-19:19+i;
}
void AI_move(int ai_side,int dis)
{
int i,j;
char *AI_SIDE=ai_side?BLACK:WHITE;
i=dpx-px;
j=dpy-py;
if(uabs(i)9)
i=cml(i);
if(uabs(j)9)
j=cml(j);
while(i||j)
{
if(i)
{
i0?(i--,px++):(i++,px--);
if(px0||px18)
px=cml(px);
}
if(j)
{
j0?(j--,py++):(j++,py--);
if(py0||py18)
py=cml(py);
}
if(dis)
{
system("cls");
show(px,py);
}
}
view[px][py]=AI_SIDE;
if(judge(px,py))
end=1;
side=!side;
}
void computer_attack(int ai_side)
{
int fx,fy,i,j,same,len,tlen,t,tsame,maxscore=0,score,u;
char *AI_SIDE=ai_side?BLACK:WHITE;
char *P_SIDE=AI_SIDE==WHITE?BLACK:WHITE;
for(fx=0;fx19;fx++)
for(fy=0;fy19;fy++)
{
if(view[fx][fy]==BLACK||view[fx][fy]==WHITE)
continue;
same=0,len=0;
for(t=0;t4;t++)
{
i=fx,j=fy,tlen=1,tsame=0,u=pro;
while(i!=final(i,-step[t][0])
j!=final(j,-step[t][1])
view[i-step[t][0]][j-step[t][1]]!=P_SIDE
(fx-i!=WIN*step[t][0]|| fy-j!=WIN*step[t][1]))
{
if(view[i-step[t][0]][j-step[t][1]]==AI_SIDE)
tsame+=u,u*=WIN;
else
u/=WIN;
i-=step[t][0],j-=step[t][1],tlen++;
}
i=fx,j=fy,u=pro;
while(i!=final(i,step[t][0])
j!=final(j,step[t][1])
view[i+step[t][0]][j+step[t][1]]!=P_SIDE
(i-fx!=WIN*step[t][0]|| j-fy!=WIN*step[t][1]))
{
if(view[i+step[t][0]][j+step[t][1]]==AI_SIDE)
tsame+=u,u*=WIN;
else
u/=WIN;
i+=step[t][0],j+=step[t][1],tlen++;
}
if(tlen=WIN)
same+=tsame,len+=tlen;
}
score=same+len;
if(scoremaxscore)
{
maxscore=score;
dpx=fx,dpy=fy;
}
}
}
void first_round()
{
if(round==1)
{
dpx=rand()%10+5,dpy=rand()%10+5;
}
if(round==2)
{
dpx=px+rand()%3-1,dpy=py+rand()%3-1;
dpx==-1?dpx+=2:0;
dpx==19?dpx-=2:0;
dpy==-1?dpy+=2:0;
dpy==19?dpy-=2:0;
}
}
void AI_think(int def)
{
int tpx=px,tpy=py,tside=side;
char *tview[19][19];
if(round3)
{
first_round();
return;
}
memcpy(tview,view,19*19*sizeof(char*));
while(!end)
{
if(side==tside)
{
computer_attack(!pside);
AI_move(!pside,0);
}
else
{
computer_attack(pside);
AI_move(pside,0);
}
}
memcpy(view,tview,19*19*sizeof(char*));
px=tpx,py=tpy;
end=0;
if(side!=tside)
{
side=tside;
computer_attack(!pside);
return ;
}
else
{
while(def--0)
{
computer_attack(pside);
AI_move(pside,0);
}
memcpy(view,tview,19*19*sizeof(char*));
px=tpx,py=tpy;
side=tside;
if(end)
computer_attack(pside);
else
computer_attack(!pside);
end=0;
}
}
void turn()
{
int tside=side;
round++;
if(pvcside!=pside)
{
AI_think(style?2:WIN);
AI_move(!pside,1);
}
else
{
while(tside==side)
{
move();
system("cls");
show(px,py);
}
}
}
int main()
{
login();
initial();
while(!end)
turn();
win();
system("pause");
}
求C语言四子棋程序
这个很简单,首先双循环打印棋盘15*15大小,然后设置键盘输入,已棋盘左下角为左边,输入左边在相应的位置打印一个黑点就行了
C语言编程立体四子棋
给个判断胜利的算法你,具体自己完善。
//一个立四方体用不同的面进行切割可切割成12个不重复的面,对每个面调用isWin()函数,以下是伪代码
void main()
{
int board[4][4][4]={1,1,2,2...1,2,1}
int cube[][];
for(i=0;i4;i++)
{
cube[][]=board[i][][];
if(isWin(cube))
{
printf("win");
return;
}
cube[][]=board[][i][]
if(isWin(cube))
{
printf("win");
return;
}
cube[][]=board[][][i]
if(isWin(cube))
{
printf("win");
return;
}
}
//判断一个面是否构成四连
int isWin(int cube[][])
{
//判断所有行的四个棋子是否一样
for(i=0;i4;i++)
if(cube[i][0]==cube[i][1]==cube[i][2]==cube[i][3])
return true;
//判断所有列的四个棋子是否一样
for(i=0;i4;i++)
if(cube[0][i]==cube[1][i]==cube[2][i]==cube[3][i])
return true;
//判断对角线的四个棋子是否一样
if(cube[0][0]==cube[1][1]==cube[2][2]==cube[3][3])
return true;
if(cube[0][3]==cube[1][2]==cube[2][1]==cube[3][0])
return true;
return false;
}
}