您的位置:

四子棋智能下棋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;

}

}