c语言五子棋悔棋的代码(c#五子棋悔棋代码)

http://www.itjxue.com  2023-03-07 00:52  来源:未知  点击次数: 

c语言的五子棋代码(博弈算法)

#include?stdio.h

#include?bios.h

#include?ctype.h

#include?conio.h

#include?dos.h

#define?CROSSRU?????0xbf???/*右上角点*/

#define?CROSSLU?????0xda???/*左上角点*/

#define?CROSSLD?????0xc0???/*左下角点*/

#define?CROSSRD?????0xd9???/*右下角点*/

#define?CROSSL???????0xc3???/*左边*/

#define?CROSSR???????0xb4???/*右边*/

#define?CROSSU???????0xc2???/*上边*/

#define?CROSSD???????0xc1???/*下边*/

#define?CROSS???????0xc5???/*十字交叉点*/

/*定义棋盘左上角点在屏幕上的位置*/

#define?MAPXOFT?????5

#define?MAPYOFT?????2

/*定义1号玩家的操作键键码*/

#define?PLAY1UP?????0x1157/*上移--'W'*/

#define?PLAY1DOWN???0x1f53/*下移--'S'*/

#define?PLAY1LEFT???0x1e41/*左移--'A'*/

#define?PLAY1RIGHT???0x2044/*右移--'D'*/

#define?PLAY1DO?????0x3920/*落子--空格键*/

/*定义2号玩家的操作键键码*/

#define?PLAY2UP?????0x4800/*上移--方向键up*/

#define?PLAY2DOWN???0x5000/*下移--方向键down*/

#define?PLAY2LEFT???0x4b00/*左移--方向键left*/

#define?PLAY2RIGHT???0x4d00/*右移--方向键right*/

#define?PLAY2DO?????0x1c0d/*落子--回车键Enter*/

/*若想在游戏中途退出,?可按?Esc?键*/

#define?ESCAPE???????0x011b

/*定义棋盘上交叉点的状态,?即该点有无棋子?*/

/*若有棋子,?还应能指出是哪个玩家的棋子???*/

#define?CHESSNULL???0???/*没有棋子*/

#define?CHESS1???????'O'/*一号玩家的棋子*/

#define?CHESS2???????'X'/*二号玩家的棋子*/

/*定义按键类别*/

#define?KEYEX99v?????????0/*退出键*/

#define?KEYFALLCHESS???1/*落子键*/

#define?KEYMOVECURSOR???2/*光标移动键*/

#define?KEYINVALID?????3/*无效键*/

/*定义符号常量:?真,?假?---?真为1,?假为0?*/

#define?TRUE?????????1

#define?FALSE???????0

/**********************************************************/

/*?定义数据结构???????????????????????????????????????????*/

/*棋盘交叉点坐标的数据结构*/

struct?point

{

int?x,y;

};

或者下面这个:

#include?graphics.h

#include?stdlib.h

#include?stdio.h

#include?conio.h

#define?N?15

#define?B?7

#define?STOP?-10000

#define?OK?1

#define?NO?0

#define?UP?328

#define?DOWN?336

#define?LEFT?331

#define?RIGHT?333

int?a[N+1][N+1];

int?zx,zy;

int?write=1,biaoji=0;

struct?zn{

long?sum;

int?y;

int?x;

}w[N+1][N+1],max,max1;

void?cbar(int?i,int?x,int?y,int?r);

void?map(int?a[][]);

int?getkey();

int?key();

void?zuobiao(int?x,int?y,int?i);

int?tu(int?a[][],int?write);

int?wtu(int?a[][],int?write);

int?zhineng(int?a[][]);

int?zh5(int?y,int?x,int?a[][]);

long?zzh5(int?b[][],int?i);

main()

{

int?i,j;

int?gdriver=DETECT;

int?gmode;

initgraph(gdriver,gmode,"");

zx=(N+1)/2;

zy=(N+1)/2;

for(i=1;i=N;i++)

for(j=1;j=N;j++)

a[i][j]=0;

map(a);

i=1;

while(i)

{

int?k,n;

k=wtu(a,write);

if(k==STOP)?goto?end;

map(a);

n=zhineng(a);

if(n==STOP)?goto?end;

map(a);

}

end:

;

}

int?zhineng(int?a[N+1][N+1])

{

int?i,j;

int?k;

max.sum=-1;

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

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

{

w[i][j].sum=0;

w[i][j].x=i;

w[i][j].y=j;

}

for(i=1;i=N-4;i++)

for(j=1;j=N-4;j++)

{

k=zh5(i,j,a);

if(k==STOP)?return?(STOP);

}

for(i=1;i=N;i++)

for(j=1;j=N;j++)

{

if(max.sumw[i][j].sum)

{

max.sum=w[i][j].sum;

max.y=i;

max.x=j;

}

else?if(max.sum==w[i][j].sum)

{

if(((max.y-zy)*(max.y-zy)+(max.x-zx)*(max.x-zx))((i-zy)*(i-zy)+(j-zx)*(j-zx)))

max.sum=w[i][j].sum;

max.y=i;

max.x=j;

}

}

if(a[max.y][max.x]==0)

{

a[max.y][max.x]=-1;

zy=max.y;

zx=max.x;

}

}

int?zh5(int?y,int?x,int?a[N+1][N+1])

{

int?i,j;

int?b[6][6];

long?c[13];

long?d[6][6];

long?temp;

for(i=y;i=y+4;i++)

for(j=x;j=x+4;j++)

b[i+1-y][j+1-x]=a[i][j];

c[1]=b[1][1]+b[1][2]+b[1][3]+b[1][4]+b[1][5];

c[2]=b[2][1]+b[2][2]+b[2][3]+b[2][4]+b[2][5];

c[3]=b[3][1]+b[3][2]+b[3][3]+b[3][4]+b[3][5];

c[4]=b[4][1]+b[4][2]+b[4][3]+b[4][4]+b[4][5];

c[5]=b[5][1]+b[5][2]+b[5][3]+b[5][4]+b[5][5];

c[6]=b[1][1]+b[2][1]+b[3][1]+b[4][1]+b[5][1];

c[7]=b[1][2]+b[2][2]+b[3][2]+b[4][2]+b[5][2];

c[8]=b[1][3]+b[2][3]+b[3][3]+b[4][3]+b[5][3];

c[9]=b[1][4]+b[2][4]+b[3][4]+b[4][4]+b[5][4];

c[10]=b[1][5]+b[2][5]+b[3][5]+b[4][5]+b[5][5];

c[11]=b[1][1]+b[2][2]+b[3][3]+b[4][4]+b[5][5];

c[12]=b[1][5]+b[2][4]+b[3][3]+b[4][2]+b[5][1];

for(i=1;i=12;i++)

{

switch(c[i])

{

case?5:biaoji=1;return(STOP);

case?-5:biaoji=-1;return(STOP);

case?-4:c[i]=100000;break;

case?4:c[i]=100000;break;

case?-3:c[i]=150;break;

case?3:c[i]=150;break;

case?-2:c[i]=120;break;

case?2:c[i]=100;break;

case?-1:c[i]=1;break;

case?1:c[i]=1;break;

default:?c[i]=0;

}

}

for(i=1;i=12;i++)

{

if(c[i]==150)

c[i]+=zzh5(b,i);

}

for(i=1;i=5;i++)

for(j=1;j=5;j++)

d[i][j]=0;

for(i=1;i=5;i++)

for(j=1;j=5;j++)

{

if(i==j)?d[i][j]+=c[11];

if((i+j)==6)?d[i][j]+=c[12];

d[i][j]+=c[i]+c[j+5];

}

for(i=1;i=5;i++)

for(j=1;j=5;j++)

{

if(b[i][j]!=0)

d[i][j]=-2;

}

max1.sum=-1;

max1.y=0;

max1.x=0;

for(i=1;i=5;i++)

for(j=1;j=5;j++)

{

if(max1.sumd[i][j])

{

max1.sum=d[i][j];

max1.y=i;

max1.x=j;

w[i+y-1][j+x-1].sum+=max1.sum;

}

else?if(max1.sum==d[i][j])

{

if(((i+y-1-zy)*(i+y-1-zy)+(j+x-1-zx)*(j+x-1-zx))((max1.y+y-1-zy)*(max1.y+y-1-zy)+(max1.x+x-1-zx)*(max1.x+x-1-zx)))

{

max1.sum=d[i][j];

max1.y=i;

max1.x=j;

}

}

}

}

long?zzh5(int?b[6][6],int?n)

{

int?i,j,k,l,m;

switch(n)

{

case?1:i=b[1][1];j=b[1][2];k=b[1][3];l=b[1][4];m=b[1][5];break;

case?2:i=b[2][1];j=b[2][2];k=b[2][3];l=b[2][4];m=b[2][5];break;

case?3:i=b[3][1];j=b[3][2];k=b[3][3];l=b[3][4];m=b[3][5];break;

case?4:i=b[4][1];j=b[4][2];k=b[4][3];l=b[4][4];m=b[4][5];break;

case?5:i=b[5][1];j=b[5][2];k=b[5][3];l=b[5][4];m=b[5][5];break;

case?6:i=b[1][1];j=b[2][1];k=b[3][1];l=b[4][1];m=b[5][1];break;

case?7:i=b[1][2];j=b[2][2];k=b[3][2];l=b[4][2];m=b[5][2];break;

case?8:i=b[1][3];j=b[2][3];k=b[3][3];l=b[4][3];m=b[5][3];break;

case?9:i=b[1][4];j=b[2][4];k=b[3][4];l=b[4][4];m=b[5][4];break;

case?10:i=b[1][5];j=b[2][5];k=b[3][5];l=b[4][5];m=b[5][5];break;

case?11:i=b[1][1];j=b[2][2];k=b[3][3];l=b[4][4];m=b[5][5];break;

case?12:i=b[1][5];j=b[2][4];k=b[3][3];l=b[4][2];m=b[5][1];break;

}

if((i==0j==1k==1l==1m==0))

return?(900);

if((i==0j==-1k==-1l==-1m==0))

return(1000);

if((i==0j==0k==1l==1m==1)||(i==1j==1k==1l==0m==0))

return(20);

if((i==0j==0k==-1l==-1m==-1)||(i==-1j==-1k==-1l==0m==0))

return(20);

if((i==-1j==1k==1l==1m==1)||(i==1j==-1k==1l==1m==1)||(i==1j==1k==-1l==1m==1)||(i==1j==1k==1l==-1m==1)||(i==1j==1k==1l==1m==-1))

return(-60);

if((i==1j==-1k==-1l==-1m==-1)||(i==-1j==1k==-1l==-1m==-1)||(i==-1j==1k==-1l==-1m==-1)||(i==-1j==-1k==-1l==1m==-1)||(i==-1j==-1k==-1l==-1m==1))

return(-60);

}

int?wtu(int?a[N+1][N+1],int?write)

{

int?i=1;

map(a);

zuobiao(zx,zy,1);

while(i)

{

int?k;

k=tu(a,write);

if(k==OK)?i=0;

if(k==STOP)?return?(STOP);

}

}

int?getkey()

{

int?key,lo,hi;

key=bioskey(0);

lo=key0x00ff;

hi=(key0xff00)8;

return((lo==0)???hi+256:lo);

}

int?key()

{

int?k;

k=getkey();

switch(k)

{

case?27:?return?(STOP);

case?13:

case?'?':?return?(OK);

case?328:?return?(UP);

case?336:?return?(DOWN);

case?331:?return?(LEFT);

case?333:?return?(RIGHT);

default:?return?(NO);

}

}

void?zuobiao(int?x,int?y,int?i)

{

int?r;

if(i!=0)

{

setcolor(GREEN);

for(r=1;r=5;r++)

circle(75+25*x,25+25*y,r);

}

else

{

if(a[zy][zx]==1)

{

setcolor(8);

for(r=1;r=5;r++)

circle(75+25*x,25+25*y,r);

}

else?if(a[zy][zx]==-1)

{

setcolor(WHITE);

for(r=1;r=5;r++)

circle(75+25*x,25+25*y,r);

}

else

{

setcolor(B);

for(r=1;r=5;r++)

circle(75+25*x,25+25*y,r);

setcolor(RED);?line(75+25*zx-5,25+25*zy,75+25*x+5,25+25*zy);

line(75+25*zx,25+25*zy-5,75+25*zx,25+25*zy+5);

}

}

}

int?tu(int?a[N+1][N+1],int?write)

{

int?k;

re:

k=key();

if(k==OK)

{

if(a[zy][zx]==0)

{

a[zy][zx]=write;

}

else

goto?re;

}

if(k==STOP)?return(STOP);

if(k==NO)?goto?re;

if(k==UP)

{

int?i,j;

if(zy==1)?j=zy;

else?j=zy-1;

zuobiao(zx,zy,0);

zuobiao(zx,j,1);

zy=j;

goto?re;

}

if(k==DOWN)

{

int?i,j;

if(zy==N)?j=zy;

else?j=zy+1;

zuobiao(zx,zy,0);

zuobiao(zx,j,1);

zy=j;

goto?re;

}

if(k==LEFT)

{

int?i,j;

if(zx==1)?i=zx;

else?i=zx-1;

zuobiao(zx,zy,0);

zuobiao(i,zy,1);

zx=i;

goto?re;

}

if(k==RIGHT)

{

int?i,j;

if(zx==N)?i=zx;

else?i=zx+1;

zuobiao(zx,zy,0);

zuobiao(i,zy,1);

zx=i;

goto?re;

}

}

void?cbar(int?i,int?x,int?y,int?r)

{

if(i!=0)

{

if(i==1)

setcolor(8);

else?if(i==-1)

setcolor(WHITE);

for(i=1;i=r;i++)

{

circle(x,y,i);

}

}

}

void?map(int?a[N+1][N+1])

{

int?i,j;

cleardevice();

setbkcolor(B);

setcolor(RED);

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

{

line(100,50+25*i,75+N*25,50+25*i);

line(100+25*i,50,100+25*i,25+N*25);

}

for(i=1;i=N;i++)

for(j=1;j=N;j++)

cbar(a[i][j],75+25*j,25+25*i,10);

}

C语言/C++求五子棋的程序代码和流程图还有模块设计,求求求,三者都要有~~~求大神帮忙。

#include stdio.h

#include stdlib.h

#include conio.h

#include time.h

#include windows.h

#define TEXTS 7

#define CURSOR 48

#define CHESSBOARD 352

#define WHITECHESS 103

#define SELECTEDWHITE 55

#define BLACKCHESS 96

#define SELECTEDBLACK 48

#define qx1_num 27

#define qx2_num 26

typedef struct node

{

int step;

int color;

} NODE;

typedef struct point

{

int x;

int y;

}_POINT;

typedef struct qixing

{

char qx[8];

int value;

}QIXING;

HANDLE hOutput=GetStdHandle(STD_OUTPUT_HANDLE);

_POINT cursor;

int direction[8][2]={{0,-1},{0,1},{-1,0},{1,0},{-1,-1},{1,1},{-1,1},{1,-1}};

QIXING qx1[qx1_num]={{"x1111",200000},{"1x111",200000},{"11x11",200000},{"0x1110",6000},{"01x110",6000},{"101x101",6000},

{"0x111",1100},{"x0111",1100},{"0x1011",1100},{"0x1101",1100},{"01x11",1100},

{"011x1",1100},{"1x011",1100},{"10x11",1100},{"11x01",1100},{"1x101",1100},

{"x011102",250},{"0x110",250},{"01x10",250},{"0x01102",240},{"0x101",240},

{"0x112",20},{"01x12",10},{"011x2",20},{"1x12",10},{"0x10",20},{"0x010",5}};

QIXING qx2[qx2_num]={{"x1111",2000000},{"1x111",2000000},{"11x11",2000000},{"0x1110",24000},{"01x110",24000},{"101x101",24000},

{"0x111",2000},{"x0111",1900},{"0x1011",1900},{"0x1101",2000},{"01x11",2000},

{"011x1",2000},{"1x011",1900},{"10x11",2000},{"1x101",2000},{"x01112",2000},

{"0x110",850},{"01x10",850},{"0x0110",840},{"0x101",840},

{"0x112",125},{"01x12",125},{"011x2",115},{"1x12",115},{"0x10",125},{"0x010",110}};

//------------------------------------------------------------------------------------------------------

void textcolor(int color)

{

SetConsoleTextAttribute(hOutput, color);

}

void gotoxy(int x, int y)

{

COORD coordScreen={0,0};

coordScreen.X=x;

coordScreen.Y=y;

SetConsoleCursorPosition(hOutput,coordScreen);

}

void printnode(NODE chessboard[][15], int x, int y)

{

textcolor(CHESSBOARD);

if(chessboard[x][y].step==0)

{

if(x==cursor.xy==cursor.y)

textcolor(CURSOR);

switch(x)

{

case 0:

if(y==0)printf("┏");

else if(y==14)printf("┓");

else printf("┳");

break;

case 3:

if(y==0)printf("┣");

else if(y==3||y==11)printf("╬");

else if(y==14)printf("┫");

else printf("╋");

break;

case 7:

if(y==0)printf("┣");

else if(y==7)printf("╬");

else if(y==14)printf("┫");

else printf("╋");

break;

case 11:

if(y==0)printf("┣");

else if(y==3||y==11)printf("╬");

else if(y==14)printf("┫");

else printf("╋");

break;

case 14:

if(y==0)printf("┗");

else if(y==14)printf("┛");

else printf("┻");

break;

default:

if(y==0)printf("┣");

else if(y==14)printf("┫");

else printf("╋");

}

}

else if(chessboard[x][y].color==0)

{

if(x==cursor.xy==cursor.y)

textcolor(SELECTEDWHITE);

else textcolor(WHITECHESS);

printf("●");

}

else

{

if(x==cursor.xy==cursor.y)

textcolor(SELECTEDBLACK);

else textcolor(BLACKCHESS);

printf("●");

}

}

void printchessboard(NODE chessboard[][15])

{

int i,j;

char letter[]={" A B C D E F G H I J K L M N O\n"};

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

{

textcolor(TEXTS);

printf("%2d",15-i);

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

printnode(chessboard,i,j);

textcolor(TEXTS);

printf("\n");

}

textcolor(TEXTS);

printf("%s",letter);

printf("移动:方向键 下棋:ENTER 悔棋:U 退出:F12");

}

void renew(NODE chessboard[][15],int x,int y)

{

COORD coordScreen;

CONSOLE_SCREEN_BUFFER_INFO csbi;

if(x0||x14||y0||y14)

return;

if(!GetConsoleScreenBufferInfo(hOutput,csbi))

return;

coordScreen=csbi.dwCursorPosition;

gotoxy((y-1)*2+4,x+1);

printnode(chessboard,x,y);

SetConsoleCursorPosition(hOutput,coordScreen);

}

void showmenu()

{

textcolor(TEXTS);

system("cls");

printf("1.人机对战\n2.双人对战\n3.退出\n\n请选择[1~3]:");

}

void showsubmenu()

{

textcolor(TEXTS);

system("cls");

printf("1.你先手\n2.电脑先手\n3.返回上级菜单\n\n请选择[1~3]:");

}

int getchoose(int min, int max)

{

int choose;

do

{

choose=getch()-48;

}while(choosemin||choosemax);

printf("%d",choose);

return choose;

}

//-------------------------------------------------------------------------------------------------

bool quit;

bool regret;

bool getmove(NODE chessboard[][15])

{

char c;

for(;;)

{

c=getch();

if(c==-32)

switch(getch())

{

case 72:

cursor.x--;

if(cursor.x0)cursor.x=0;

renew(chessboard,cursor.x+1,cursor.y);

renew(chessboard,cursor.x,cursor.y);

break;

case 80:

cursor.x++;

if(cursor.x14)

cursor.x=14;

renew(chessboard,cursor.x-1,cursor.y);

renew(chessboard,cursor.x,cursor.y);

break;

case 75:

cursor.y--;

if(cursor.y0)cursor.y=0;

renew(chessboard,cursor.x,cursor.y+1);

renew(chessboard,cursor.x,cursor.y);

break;

case 77:

cursor.y++;

if(cursor.y14)cursor.y=14;

renew(chessboard,cursor.x,cursor.y-1);

renew(chessboard,cursor.x,cursor.y);

break;

case 134:

quit=true;

return true;

}

else if(c==13chessboard[cursor.x][cursor.y].step==0)

return true;

else if(c=='U'||c=='u')

{

regret=true;

return true;

}

}

}

void beback(NODE chessboard[][15], int step)

{

int i,j,tempx,tempy;

if(step==1)return;

if(step2)

{

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

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

{

if(chessboard[i][j].step==step-1)

{

chessboard[i][j].step=0;

renew(chessboard,i,j);

}

else if(chessboard[i][j].step==step-2)

{

chessboard[i][j].step=0;

tempx=cursor.x;

tempy=cursor.y;

cursor.x=i;

cursor.y=j;

renew(chessboard,i,j);

renew(chessboard,tempx,tempy);

}

}

}

else if(step==2)

{

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

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

if(chessboard[i][j].step==step-1)

{

chessboard[i][j].step=0;

renew(chessboard,i,j);

}

tempx=cursor.x;

tempy=cursor.y;

cursor.x=7;

cursor.y=7;

renew(chessboard,i,j);

renew(chessboard,tempx,tempy);

}

}

//-----------------------------------------------------------------------------------------

bool inside(int x,int y)

{

if(x0||x14||y0||y14)return false;

return true;

}

int line(NODE chessboard[][15],int dirt,int x,int y,int color)

{

int i;

for(i=0;chessboard[x+direction[dirt][0]][y+direction[dirt][1]].step0

chessboard[x+direction[dirt][0]][y+direction[dirt][1]].color==color;i++)

{

x=x+direction[dirt][0];

y=y+direction[dirt][1];

if(!inside(x,y))return i;

}

return i;

}

bool win(NODE chessboard[][15],int x,int y,int color)

{

if(line(chessboard,0,x,y,color)+line(chessboard,1,x,y,color)3)

return true;

if(line(chessboard,2,x,y,color)+line(chessboard,3,x,y,color)3)

return true;

if(line(chessboard,4,x,y,color)+line(chessboard,5,x,y,color)3)

return true;

if(line(chessboard,6,x,y,color)+line(chessboard,7,x,y,color)3)

return true;

return false;

}

//----------------------------------------------------------------------------------------------

int attacktrend,defenttrend;

bool macth1(NODE chessboard[][15],int x,int y,int dirt,int kind,int color)

{

int k;

char c;

char *p;

p=strchr(qx1[kind].qx,'x');

for(k=0;k=p-qx1[kind].qx;k++)

{

x-=direction[dirt][0];

y-=direction[dirt][1];

}

for(k=0;(unsigned)kstrlen(qx1[kind].qx);k++)

{

x+=direction[dirt][0];

y+=direction[dirt][1];

if(!inside(x,y))return(false);

if(chessboard[x][y].step0chessboard[x][y].color==color)c='2';

else if(chessboard[x][y].step0)c='1';

else c='0';

if(c=='0'qx1[kind].qx[k]=='x')continue;

if(c!=qx1[kind].qx[k])return(false);

}

return true;

}

int value_qx1(NODE chessboard[][15],int x,int y,int dirt, int color)

{

int i;

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

if(macth1(chessboard,x,y,dirt,i,color))

return qx1[i].value;

return 0;

}

bool macth2(NODE chessboard[][15],int x,int y,int dirt, int kind,int color)

{

int k;

char c;

char *p;

p=strchr(qx2[kind].qx,'x');

for(k=0;k=p-qx2[kind].qx;k++)

{

x-=direction[dirt][0];

y-=direction[dirt][1];

}

for(k=0;(unsigned)kstrlen(qx2[kind].qx);k++)

{

x+=direction[dirt][0];

y+=direction[dirt][1];

if(!inside(x,y))return false;

if(chessboard[x][y].step0chessboard[x][y].color==color)c='2';

else if(chessboard[x][y].step0)c='1';

else c='0';

if(c=='0'qx2[kind].qx[k]=='x')continue;

if(c!=qx2[kind].qx[k])return(false);

}

return true;

}

int value_qx2(NODE chessboard[][15],int x,int y,int dirt, int color)

{

int i;

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

if(macth2(chessboard,x,y,dirt,i,color))

return qx2[i].value;

return 0;

}

void AI(NODE chessboard[][15], int *x,int *y,int color)

{

int max=0;

int maxi,maxj;

int i,j,k;

int probability=1;

int value[15][15]={0};

int valueattack[15][15]={{0}};

int valuedefent[15][15]={{0}};

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

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

{

if(chessboard[i][j].step0)continue;

for(k=0;k8;k++)

valuedefent[i][j]+=value_qx1(chessboard,i,j,k,color);

if(maxivaluedefent[i][j])

maxi=valuedefent[i][j];

}

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

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

{

if(chessboard[i][j].step0)continue;

for(k=0;k8;k++)

valueattack[i][j]+=value_qx2(chessboard,i,j,k,color);

if(maxjvaluedefent[i][j])

maxj=valuedefent[i][j];

}

if(rand()%(maxi+maxj+1)maxi)

{

attacktrend=1;

defenttrend=1;

}

else

{

attacktrend=1;

defenttrend=2;

}

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

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

{

value[i][j]=valuedefent[i][j]*defenttrend+valueattack[i][j]*attacktrend;

if(maxvalue[i][j])

{

max=value[i][j];

maxi=i;

maxj=j;

probability=1;

}

else if(max==value[i][j])

{

if(rand()%(probability+1)probability)

probability++;

else

{

probability=1;

max=value[i][j];

maxi=i;

maxj=j;

}

}

}

*x=maxi;

*y=maxj;

}

//-------------------------------------------------------------------------------------------------

bool vshuman;

void Vs(bool human)

{

int i,j;

int color=1;

int lastx,lasty;

int computer;

NODE chessboard[15][15]={{0,0}};

if(!human)

{

showsubmenu();

switch(getchoose(1,3))

{

case 1:

computer=0;

attacktrend=1;

defenttrend=1;

break;

case 2:

computer=1;

attacktrend=1;

defenttrend=2;

break;

case 3:return;

}

}

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

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

chessboard[i][j].step=0;

cursor.x=7;

cursor.y=7;

quit=false;

system("cls");

printf("\n");

printchessboard(chessboard);

for(i=1;i=225;)

{

gotoxy(0,0);

textcolor(TEXTS);

printf(" 第%03d手, ",i);

if(color==1)printf("黑棋下");

else printf("白棋下");

regret=false;

if(i1)

{

if(color!=computer||human)getmove(chessboard);

else

{

lastx=cursor.x;

lasty=cursor.y;

AI(chessboard,cursor.x,cursor.y,color);

renew(chessboard,lastx,lasty);

}

}

if(quit)return;

if(regret)

{

beback(chessboard,i);

if(i2)i-=2;

else if(i==2)

{

i=1; color=(color+1)%2;

}

}

else

{

chessboard[cursor.x][cursor.y].step=i++;

chessboard[cursor.x][cursor.y].color=color;

renew(chessboard,cursor.x,cursor.y);

color=(color+1)%2;

}

if(win(chessboard,cursor.x,cursor.y,(color+1)%2)!regret)

{

textcolor(TEXTS);

gotoxy(0,0);

printf(" ");

gotoxy(0,0);

if(color==1)printf(" 白棋赢了!");

else printf(" 黑棋赢了!");

getch();

return;

}

}

gotoxy(0,0);

printf(" ");

gotoxy(0,0);

printf(" 平局!");

}

int main()

{

srand((unsigned)time(NULL));

for(;;)

{

showmenu();

switch(getchoose(1,3))

{

case 1:Vs(false);break;

case 2:Vs(true);break;

case 3:printf("\n");return 0;

}

}

return 0;

}

c语言五子棋代码,

package day17.gobang;

import java.util.Arrays;

public class GoBangGame {

public static final char BLANK='*';

public static final char BLACK='@';

public static final char WHITE='O';

public static final int MAX = 16;

private static final int COUNT = 5;

//棋盘

private char[][] board;

public GoBangGame() {

}

//开始游戏

public void start() {

board = new char[MAX][MAX];

//把二维数组都填充‘*’

for(char[] ary: board){

Arrays.fill(ary, BLANK);

}

}

public char[][] getChessBoard(){

return board;

}

public void addBlack(int x, int y) throws ChessExistException{

//@

//char blank = '*';

//System.out.println( x +"," + y + ":" + board[y][x] + "," + BLANK);

if(board[y][x] == BLANK){// x, y 位置上必须是空的才可以添棋子

board[y][x] = BLACK;

return;

}

throw new ChessExistException("已经有棋子了!");

}

public void addWhite(int x, int y)

throws ChessExistException{

if(board[y][x] == BLANK){// x, y 位置上必须是空的才可以添棋子

board[y][x] = WHITE;

return;

}

throw new ChessExistException("已经有棋子了!");

}

//chess 棋子:'@'/'O'

public boolean winOnY(char chess, int x, int y){

//先找到y方向第一个不是 blank的棋子

int top = y;

while(true){

if(y==0 || board[y-1][x]!=chess){

//如果y已经是棋盘的边缘, 或者的前一个不是chess

//就不再继续查找了

break;

}

y--;

top = y;

}

//向回统计所有chess的个数,如果是COUNT个就赢了

int count = 0;

y = top;

while(true){

if(y==MAX || board[y][x]!=chess){

//如果找到头 或者 下一个子不是chess 就不再继续统计了

break;

}

count++;

y++;

}

return count==COUNT;

}

//chess 棋子:'@'/'O'

public boolean winOnX(char chess, int x, int y){

//先找到x方向第一个不是 blank的棋子

int top = x;

while(true){

if(x==0 || board[y][x-1]!=chess){

//如果x已经是棋盘的边缘, 或者的前一个不是chess

//就不再继续查找了

break;

}

x--;

top = x;

}

//向回统计所有chess的个数,如果是COUNT个就赢了

int count = 0;

x = top;

while(true){

if(x==MAX || board[y][x]!=chess){

//如果找到头 或者 下一个子不是chess 就不再继续统计了

break;

}

count++;

x++;

}

return count==COUNT;

}

//chess 棋子:'@'/'O'

public boolean winOnXY(char chess, int x, int y){

//先找MAX向第一个不是 blank的棋子

int top = y;

int left = x;

while(true){

if(x==0 || y==0 || board[y-1][x-1]!=chess){

//如果x已经是棋盘的边缘, 或者的前一个不是chess

//就不再继续查找了

break;

}

x--;

y--;

top = y;

left=x;

}

//向回统计所有chess的个数,如果是COUNT个就赢了

int count = 0;

x = left;

y = top;

while(true){

if(x==MAX || y==MAX || board[y][x]!=chess){

//如果找到头 或者 下一个子不是chess 就不再继续统计了

break;

}

count++;

x++;

y++;

}

return count==COUNT;

}

//chess 棋子:'@'/'O'

public boolean winOnYX(char chess, int x, int y){

//先找到x方向第一个不是 blank的棋子

int top = y;

int left = x;

while(true){

if(x==MAX-1 || y==0 || board[y-1][x+1]!=chess){

//如果x已经是棋盘的边缘, 或者的前一个不是chess

//就不再继续查找了

break;

}

x++;

y--;

top = y;

left=x;

}

//向回统计所有chess的个数,如果是COUNT个就赢了

int count = 0;

x = left;

y = top;

while(true){

if(x==0 || y==MAX || board[y][x]!=chess){

//如果找到头 或者 下一个子不是chess 就不再继续统计了

break;

}

count++;

x--;

y++;

}

return count==COUNT;

}

public boolean whiteIsWin(int x, int y) {

//在任何一个方向上赢了,都算赢

return winOnY(WHITE, x, y) ||

winOnX(WHITE, x, y) ||

winOnXY(WHITE, x, y) ||

winOnYX(WHITE, x, y);

}

public boolean blackIsWin(int x, int y) {

return winOnY(BLACK, x, y) ||

winOnX(BLACK, x, y) ||

winOnXY(BLACK, x, y) ||

winOnYX(BLACK, x, y);

}

}

急~C语言五子棋 清屏.悔棋

1

头文件:includestdilb.h

命令: system("cly");

ps:你保存棋盘的数组有没有清空了?

2

你可以创建两个变量x,y保存上次落子的坐标。悔棋时把他清空就行了。具体的代码要结合你的源文件。就不多说了。而且思考不能代劳。

求一个c语言写的五子棋程序,要有人机对战和人人对战两种模式,可以选择棋盘大小,最好带禁手,和图形化

# includestdio.h

# includestring.h

# includestdlib.h

# define SPA 0

# define MAN 1

# define COM 2 /* 空位置设为0 ,玩家下的位置设为1 ,电脑下的位置设为2 */

int qipan[15][15]; /* 15*15的棋盘 */

int a,b,c,d,x; /* a b为玩家下子坐标 ,c d为电脑下子坐标 x为剩余空位置*/

void start(); /* 程序的主要控制函数 */

void draw(); /* 画棋盘 */

int win(int p,int q); /* 判断胜利 p q为判断点坐标 */

void AI(int *p,int *q); /* 电脑下子 p q返回下子坐标 */

int value(int p,int q); /* 计算空点p q的价值 */

int qixing(int n,int p,int q); /* 返回空点p q在n方向上的棋型 n为1-8方向 从右顺时针开始数 */

void yiwei(int n,int *i,int *j); /* 在n方向上对坐标 i j 移位 n为1-8方向 从右顺时针开始数 */

void main()

{

char k;

do{

x=225;

start();

printf("还要再来一把吗?输入y或n:"); getchar(); scanf("%c",k);

while(k!='y'k!='n'){

printf("输入错误,请重新输入\n"); scanf("%c",k); }

system("cls"); }while(k=='y'); printf("谢谢使用!\n");

}

void start()

{

int i,j,a1,b1,c1,d1,choice; /* a1 b1储存玩家上手坐标 c1 d1储存电脑上手坐标 */

char ch;

printf("\t╔══════════════════════════════╗\n"); printf("\t║ ║\n"); printf("\t║ 欢迎使用五子棋对战程序 祝您玩的愉快挑战无极限 ║\n"); printf("\t║ ║\n"); printf("\t║ ._______________________. ║\n"); printf("\t║ | _____________________ | ║\n"); printf("\t║ | I I | ║\n"); printf("\t║ | I 五 子 棋 I | ║\n"); printf("\t║ | I I | ║\n"); printf("\t║ | I made by 晓之蓬 I | ║\n"); printf("\t║ | I___________________I | ║\n"); printf("\t║ !_______________________! ║\n"); printf("\t║ ._[__________]_. ║\n"); printf("\t║ .___|_______________|___. ║\n"); printf("\t║ |::: ____ | ║\n"); printf("\t║ | ~~~~ [CD-ROM] | ║\n"); printf("\t║ !_____________________! ║\n"); printf("\t║ ║\n"); printf("\t║ ║\n"); printf("\t║ 寒 星 溪 月 疏 星 首,花 残 二 月 并 白 莲。 ║\n"); printf("\t║ 雨 月 金 星 追 黑 玉,松 丘 新 宵 瑞 山 腥。 ║\n"); printf("\t║ 星 月 长 峡 恒 水 流,白 莲 垂 俏 云 浦 岚。 ║\n"); printf("\t║ 黑 玉 银 月 倚 明 星,斜 月 明 月 堪 称 朋。 ║\n"); printf("\t║ 二 十 六 局 先 弃 二,直 指 游 星 斜 彗 星。 ║\n"); printf("\t║ ║\n"); printf("\t║ ║\n"); printf("\t║ 1.人机对战 2.人人对战 ║\n"); printf("\t║ ║\n"); printf("\t╚═══════════════════════════ ══╝\n"); printf("\t\t\t请输入1或2:");

scanf("%d",choice); /* 选择模式:人机或人人 */

while(choice!=1choice!=2) {

printf("输入错误,请重新输入:"); scanf("%d",choice); }

if(choice==1){ /* 人机模式 */

system("cls");

printf("欢迎使用五子棋人机对战!下子请输入坐标(如13 6)。悔棋请输入15 1 5。\n\n\n");

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

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

qipan[j][i]=SPA; /* 置棋盘全为空 */

draw();

printf("先下请按1,后下请按2:"); scanf("%d",i);

while(i!=1i!=2) { printf("输入错误,请重新输入:"); scanf("%d",i); }

if(i==1) { /* 如果玩家先手下子 */

printf("请下子:"); scanf("%d%d",a,b);

while((a0||a14)||(b0||b14)) {

printf("坐标错误!请重新输入:"); scanf("%d%d",a,b); }

a1=a; b1=b; x--; qipan[b][a]=MAN; system("cls"); draw();

}

while(x!=0){

if(x==225) {

c=7; d=7; qipan[d][c]=COM; x--; system("cls"); draw(); } /* 电脑先下就下在7 7 */

else { AI(c,d); qipan[d][c]=COM; x--; system("cls"); draw(); } /* 电脑下子 */

c1=c; d1=d; /* 储存电脑上手棋型 */

if(win(c,d)){ /* 电脑赢 */

printf("要悔棋吗?请输入y或n:"); getchar(); scanf("%c",ch);

while(ch!='y'ch!='n') { printf("输入错误,请重新输入:");

scanf("%c",ch); }

if(ch=='n') {

printf("下不过电脑很正常,请不要灰心!!!\n"); return; }

else { x+=2; qipan[d][c]=SPA; qipan[b1][a1]=SPA;

system("cls"); draw(); } /* 悔棋 */

}

printf("电脑下在%d %d\n请输入:",c,d);

scanf("%d%d",a,b); /* 玩家下子 */

if(a==15b==15) {

x+=2; qipan[d][c]=SPA; qipan[b1][a1]=SPA; system("cls"); draw();

printf("请输入:"); scanf("%d%d",a,b); } /* 悔棋 */

while((a0||a14)||(b0||b14)||qipan[b][a]!=SPA) {

printf("坐标错误或该位置已有子!请重新输入:");

scanf("%d%d",a,b); }

a1=a; b1=b; x--; qipan[b][a]=MAN; system("cls"); draw();

if(win(a,b)){ printf("电脑神马的都是浮云!!!\n");

return; } /* 玩家赢 */

}

printf("和局\n");

}

if(choice==2){

system("cls");

printf("欢迎使用五子棋人人对战!下子请输入坐标(如13 6)。悔棋请输入15 15。 \n\n\n");

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

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

qipan[j][i]=SPA; /* 置棋盘全为空 */

draw();

while(x!=0){

printf("1P请输入:"); scanf("%d%d",a,b);

if(a==15b==15) {

x+=2; qipan[d][c]=SPA; qipan[b1][a1]=SPA; system("cls");

draw(); printf("1P请输入:"); scanf("%d%d",a,b); }

while((a0||a14)||(b0||b14)||qipan[b][a]!=SPA) {

printf("坐标错误或该位置已有子!请重新输入:");

scanf("%d%d",a,b); }

a1=a; b1=b; x--; qipan[b][a]=MAN; system("cls"); draw();

printf("1P下在%d %d。\n",a,b);

if(win(a,b)){ printf("你真棒!!!\n"); return; } /* 玩家1赢 */

printf("2P请输入:"); scanf("%d%d",c,d);

if(c==15d==15) {

x+=2; qipan[b][a]=SPA; qipan[d1][c1]=SPA; system("cls"); draw();

printf("2P请输入:"); scanf("%d%d",c,d); }

while((c0||c14)||(d0||d14)||qipan[d][c]!=SPA) {

printf("坐标错误或该位置已有子!请重新输入:"); scanf("%d%d",c,d);

}

c1=c; d1=d; x--; qipan[d][c]=COM; system("cls"); draw();

printf("2P下在%d %d。\n",c,d);

if(win(c,d)){ printf("你真棒!!!\n"); return; } /* 玩家2赢 */

}

printf("和局\n");

}

}

void draw() /* 画棋盘 */

{

int i,j;

char p[15][15][4];

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

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

if(qipan[j][i]==SPA) strcpy(p[j][i]," \0");

if(qipan[j][i]==MAN) strcpy(p[j][i],"●\0");

if(qipan[j][i]==COM) strcpy(p[j][i],"◎\0"); }

printf(" 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 \n");

printf(" ┌—┬—┬—┬—┬—┬—┬—┬—┬—┬—┬—┬—┬—┬—┬—┐\n");

for(i=0,j=0;i14;i++,j++){

printf(" %2d│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%d\n",j,p[i][0],p[i][1],p[i][2],p[i][3],p[i][4],p[i][5],p[i][6],p[i][7],p[i][8],p[i][9],p[i][10],p[i][11],p[i][12],p[i][13],p[i][14],j);

printf(" ├—┼—┼—┼—┼—┼—┼—┼—┼—┼—┼—┼—┼—┼—┼—┤\n"); }

printf(" 14│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│0\n",p[14][0],p[14][1],p[14][2],p[14][3],p[14][4],p[14][5],p[14][6],p[14][7],p[14][8],p[14][9],p[14][10],p[14][11],p[14][12],p[14][13],p[14][14]);

printf(" └—┴—┴—┴—┴—┴—┴—┴—┴—┴—┴—┴—┴—┴—┴—┘\n");

printf(" 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 \n");

}

int win(int p,int q) /* 判断胜利 p q为判断点坐标,胜利返回1,否则返回0 */

{

int k,n=1,m,P,Q; /* k储存判断点p q的状态COM或MAN。P Q储存判断点坐标。n为判断方向。m为个数。 */

P=p; Q=q; k=qipan[q][p];

while(n!=5){

m=0;

while(k==qipan[q][p]){

m++; if(m==5) return 1;

yiwei(n,p,q); if(p0||p14||q0||q14) break;

}

n+=4; m-=1; p=P; q=Q; /* 转向判断 */

while(k==qipan[q][p]){

m++;

if(m==5) return 1;

yiwei(n,p,q); if(p0||p14||q0||q14) break;

}

n-=3; p=P; q=Q; /* 不成功则判断下一组方向 */

}

return 0;

}

void AI(int *p,int *q) /* 电脑下子 *p *q返回下子坐标 */

{

int i,j,k,max=0,I,J; /* I J为下点坐标 */

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

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

if(qipan[j][i]==SPA){ /* 历遍棋盘,遇到空点则计算价值,取最大价值点下子。 */

k=value(i,j); if(k=max) { I=i; J=j; max=k; }

}

*p=I; *q=J;

}

int value(int p,int q) /* 计算空点p q的价值 以k返回 */

{

int n=1,k=0,k1,k2,K1,K2,X1,Y1,Z1,X2,Y2,Z2,temp;

int a[2][4][4]={40,400,3000,10000,6,10,600,10000,20,120,200,0,6,10,500,0,30,300,2500,5000,2,8,300,8000,26,160,0,0,4,20,300,0}; /* 数组a中储存己方和对方共32种棋型的值 己方0对方1 活0冲1空活2空冲3 子数0-3(0表示1个子,3表示4个子) */

while(n!=5){

k1=qixing(n,p,q); n+=4; /* k1,k2为2个反方向的棋型编号 */

k2=qixing(n,p,q); n-=3;

if(k1k2) { temp=k1; k1=k2; k2=temp; } /* 使编号小的为k1,大的为k2 */

K1=k1; K2=k2; /* K1 K2储存k1 k2的编号 */

Z1=k1%10; Z2=k2%10; k1/=10; k2/=10; Y1=k1%10; Y2=k2%10; k1/=10; k2/=10;

X1=k1%10; X2=k2%10; /* X Y Z分别表示 己方0对方1 活0冲1空活2空冲3 子数0-3(0表示1个子,3表示4个子) */

if(K1==-1) {

if(K20) { k+=0; continue; } else k+=a[X2][Y2][Z2]+5; continue; }; /* 空棋型and其他 */

if(K1==-2) { if(K20) { k+=0; continue; }

else k+=a[X2][Y2][Z2]/2; continue; }; /* 边界冲棋型and其他 */

if(K1==-3) { if(K20) { k+=0; continue; }

else k+=a[X2][Y2][Z2]/3; continue; }; /* 边界空冲棋型and其他 */

if(((K1-1K14)((K2-1K24)||(K29K214)))||((K199K1104)((K299K2104)||(K2109K2114)))){

/* 己活己活 己活己冲 对活对活 对活对冲 的棋型赋值*/

if(Z1+Z2=2) { k+=a[X2][Y2][3]; continue; }

else { k+=a[X2][Y2][Z1+Z2+1]; continue; }

}

if(((K19K114)(K29K214))||((K1109K1114)(K2109K2114))){

/* 己冲己冲 对冲对冲 的棋型赋值*/

if(Z1+Z2=2) { k+=10000; continue; }

else { k+=0; continue; }

}

if(((K1-1K14)((K299K2104)||(K2109K2114)))||((K19K114)((K299K2104)||(K2109K2114)))){

/* 己活对活 己活对冲 己冲对活 己冲对冲 的棋型赋值*/

if(Z1==3||Z2==3) { k+=10000; continue; }

else { k+=a[X2][Y2][Z2]+a[X1][Y1][Z1]/4; continue; }

}

else

{ k+=a[X1][Y1][Z1]+a[X2][Y2][Z2]; continue; } /* 其他棋型的赋值 */

}

return k;

}

int qixing(int n,int p,int q) /* 返回空点p q在n方向上的棋型号 n为1-8方向 从右顺时针开始数 */

{

int k,m=0; /* 棋型号注解: 己活000-003 己冲010-013 对活100-103 对冲110-113 己空活020-023 己空冲030-033 对空活120-123 对空冲130-133 空-1 边界冲-2 边界空冲-3*/

yiwei(n,p,q);

if(p0||p14||q0||q14) k=-2; /* 边界冲棋型 */

switch(qipan[q][p]){

case COM:{

m++; yiwei(n,p,q);

if(p0||p14||q0||q14) { k=m+9; return k; }

while(qipan[q][p]==COM) {

m++; yiwei(n,p,q); if(p0||p14||q0||q14) { k=m+9; return k; }

}

if(qipan[q][p]==SPA) k=m-1; /* 己方活棋型 */

else k=m+9; /* 己方冲棋型 */

}break;

case MAN:{

m++; yiwei(n,p,q);

if(p0||p14||q0||q14) { k=m+109; return k; }

while(qipan[q][p]==MAN) {

m++; yiwei(n,p,q); if(p0||p14||q0||q14) { k=m+109; return k; }

}

if(qipan[q][p]==SPA) k=m+99; /* 对方活棋型 */

else k=m+109; /* 对方冲棋型 */

}break;

case SPA:{

yiwei(n,p,q);

if(p0||p14||q0||q14) { k=-3; return k; } /* 边界空冲棋型 */

switch(qipan[q][p]){

case COM:{

m++; yiwei(n,p,q);

if(p0||p14||q0||q14) { k=m+29; return k; }

while(qipan[q][p]==COM) {

m++; yiwei(n,p,q);

if(p0||p14||q0||q14) { k=m+29; return k; }

}

if(qipan[q][p]==SPA) k=m+19; /* 己方空活棋型 */

else k=m+29; /* 己方空冲棋型 */

}break;

case MAN:{

m++; yiwei(n,p,q);

if(p0||p14||q0||q14) { k=m+129; return k; }

while(qipan[q][p]==MAN) {

m++; yiwei(n,p,q);

if(p0||p14||q0||q14) { k=m+129; return k; }

}

if(qipan[q][p]==SPA) k=m+119; /* 对方空活棋型 */

else k=m+129; /* 对方空冲棋型 */

}break;

case SPA: k=-1; break; /* 空棋型 */

}

}break;

}

return k;

}

void yiwei(int n,int *i,int *j) /* 在n方向上对坐标 i j 移位 n为1-8方向 从右顺时针开始数 */

{

switch(n){

case 1: *i+=1; break;

case 2: *i+=1; *j+=1; break;

case 3: *j+=1; break;

case 4: *i-=1; *j+=1; break;

case 5: *i-=1; break;

case 6: *i-=1; *j-=1; break;

case 7: *j-=1; break;

case 8: *i+=1; *j-=1; break;

}

}

c语言基础,求五子棋详细代码

/*一个月就想做五子棋,有点难啊,希望你能看懂,这是代码*/

#include?stdlib.h

#include?stdio.h

#include?conio.h

#include?string.h

#define?MAXIMUS?15?//定义棋盘大小

int?p[MAXIMUS][MAXIMUS];//存储对局信息

char?buff[MAXIMUS*2+1][MAXIMUS*4+3];//输出缓冲器

int?Cx,Cy;//当前光标位置

int?Now;//当前走子的玩家,1代表黑,2代表白

int?wl,wp;//当前写入缓冲器的列数和行数位置

char*?showText;//在棋盘中央显示的文字信息

int?count;//回合数

char*?Copy(char*?strDest,const?char*?strSrc)//修改过的字符串复制函数,会忽略末端的\0

{

????char*?strDestCopy?=?strDest;

????while?(*strSrc!='\0')

????{

????????*strDest++=*strSrc++;

????}

????return?strDestCopy;

}

void?Initialize()//初始化一个对局函数

{

????int?i,j;//循环变量

????showText="";//重置显示信息

????count=0;//回合数归零

????for(i=0;iMAXIMUS;i++)//重置对局数据

????{

????????for(j=0;jMAXIMUS;j++)

????????{

????????????p[i][j]=0;

????????}

????}

????Cx=Cy=MAXIMUS/2;//重置光标到中央

????Now=1;//重置当前为黑方

}

char*?getStyle(int?i,int?j)//获得棋盘中指定坐标交点位置的字符,通过制表符拼成棋盘

{

????if(p[i][j]==1)//1为黑子

????????return?"●";

????else?if(p[i][j]==2)//2为白子

????????return?"○";

????else?if(i==0j==0)//以下为边缘棋盘样式

????????return?"┏";

????else?if(i==MAXIMUS-1j==0)

????????return?"┓";

????else?if(i==MAXIMUS-1j==MAXIMUS-1)

????????return?"┛";

????else?if(i==0j==MAXIMUS-1)

????????return?"┗";

????else?if(i==0)

????????return?"┠";

????else?if(i==MAXIMUS-1)

????????return?"┨";

????else?if(j==0)

????????return?"┯";

????else?if(j==MAXIMUS-1)

????????return?"┷";

????return?"┼";//中间的空位

}

char*?getCurse(int?i,int?j)//获得指定坐标交点位置左上格的样式,通过制表符来模拟光标的显示

{

????if(i==Cx)

????{

????????if(j==Cy)

????????????return?"┏";

????????else?if?(j==Cy+1)

????????????return?"┗";

????}

????else?if(i==Cx+1)

????{

????????if(j==Cy)

????????????return?"┓";

????????else?if?(j==Cy+1)

????????????return?"┛";

????}

????return?" ";//如果不在光标附近则为空

}

void?write(char*?c)//向缓冲器写入字符串

{

????Copy(buff[wl]+wp,c);

????wp+=strlen(c);

}

void?ln()//缓冲器写入位置提行

{

????wl+=1;

????wp=0;

}

void?Display()//将缓冲器内容输出到屏幕

{

????int?i,l=strlen(showText);//循环变量,中间文字信息的长度

????int?Offset=MAXIMUS*2+2-l/2;//算出中间文字信息居中显示所在的横坐标位置

????if(Offset%2==1)//如果位置为奇数,则移动到偶数,避免混乱

????{

????????Offset--;

????}

????Copy(buff[MAXIMUS]+Offset,showText);//讲中间文字信息复制到缓冲器

????if(l%2==1)//如果中间文字长度为半角奇数,则补上空格,避免混乱

????{

????????*(buff[MAXIMUS]+Offset+l)=0x20;

????}

????system("cls");//清理屏幕,准备写入

????for(i=0;iMAXIMUS*2+1;i++)//循环写入每一行

????{

????????printf("%s",buff[i]);

????????if(iMAXIMUS*2)//写入完每一行需要换行

????????????printf("\n");

????}

}

void?Print()//将整个棋盘算出并储存到缓冲器,然后调用Display函数显示出来

{

????int?i,j;//循环变量

????wl=0;

????wp=0;

????for(j=0;j=MAXIMUS;j++)//写入出交点左上角的字符,因为需要打印棋盘右下角,所以很以横纵各多一次循环

????{

????????for(i=0;i=MAXIMUS;i++)

????????{

????????????write(getCurse(i,j));//写入左上角字符

????????????if(j==0||j==MAXIMUS)//如果是棋上下盘边缘则没有连接的竖线,用空格填充位置

????????????{

????????????????if(i!=MAXIMUS)

????????????????????write(" ");

????????????}

????????????else//如果在棋盘中间则用竖线承接上下

????????????{

????????????????if(i==0||i==MAXIMUS-1)//左右边缘的竖线更粗

????????????????????write("┃");

????????????????else?if(i!=MAXIMUS)//中间的竖线

????????????????????write("│");

????????????}

????????}

????????if(j==MAXIMUS)//如果是最后一次循环,则只需要处理边侧字符,交点要少一排

????????{

????????????break;

????????}

????????ln();//提行开始打印交点内容

????????write(" ");//用空位补齐位置

????????for(i=0;iMAXIMUS;i++)//按横坐标循环正常的次数

????????{

????????????write(getStyle(i,j));//写入交点字符

????????????if(i!=MAXIMUS-1)//如果不在最右侧则补充一个横线承接左右

????????????{

????????????????if(j==0||j==MAXIMUS-1)

????????????????{

????????????????????write("━");//上下边缘的横线更粗

????????????????}

????????????????else

????????????????{

????????????????????write("—");//中间的横线

????????????????}

????????????}

????????}

????????ln();//写完一行后提行

????}

????Display();//将缓冲器内容输出到屏幕

}

int?Put()//在当前光标位置走子,如果非空,则返回0表示失败

{

????if(p[Cx][Cy]==0)

????{

????????p[Cx][Cy]=Now;//改变该位置数据

????????return?1;//返回1表示成功

????}

????else

????{

????????return?0;

????}

}

int?Check()//胜负检查,即判断当前走子位置有没有造成五连珠的情况

{

????int?w=1,x=1,y=1,z=1,i;//累计横竖正斜反邪四个方向的连续相同棋子数目

????for(i=1;i5;i++)//向下检查

????????if(Cy+iMAXIMUSp[Cx][Cy+i]==Now)

????????????w++;

????????else?

????????????break;

????for(i=1;i5;i++)//向上检查

????????if(Cy-i0p[Cx][Cy-i]==Now)

????????????w++;

????????else?

????????????break;

????if(w=5)//若果达到5个则判断当前走子玩家为赢家

????????return?Now;

????for(i=1;i5;i++)//向右检查

????????if(Cx+iMAXIMUSp[Cx+i][Cy]==Now)

????????????x++;

????????else?

????????????break;

????for(i=1;i5;i++)//向左检查

????????if(Cx-i0p[Cx-i][Cy]==Now)

????????????x++;

????????else?

????????????break;

????if(x=5)//若果达到5个则判断当前走子玩家为赢家

????????return?Now;

????for(i=1;i5;i++)//向右下检查

????????if(Cx+iMAXIMUSCy+iMAXIMUSp[Cx+i][Cy+i]==Now)

????????????y++;

????????else?

????????????break;

????for(i=1;i5;i++)//向左上检查

????????if(Cx-i0Cy-i0p[Cx-i][Cy-i]==Now)

????????????y++;

????????else?

????????????break;

????if(y=5)//若果达到5个则判断当前走子玩家为赢家

????????return?Now;

????for(i=1;i5;i++)//向右上检查

????????if(Cx+iMAXIMUSCy-i0p[Cx+i][Cy-i]==Now)

????????????z++;

????????else?

????????????break;

????for(i=1;i5;i++)//向左下检查

????????if(Cx-i0Cy+iMAXIMUSp[Cx-i][Cy+i]==Now)

????????????z++;

????????else?

????????????break;

????if(z=5)//若果达到5个则判断当前走子玩家为赢家

????????return?Now;

????return?0;//若没有检查到五连珠,则返回0表示还没有玩家达成胜利

}

int?RunGame()//进行整个对局,返回赢家信息(虽然有用上)

{

????int?input;//输入变量

????int?victor;//赢家信息

????Initialize();//初始化对局

????while(1)//开始无限回合的死循环,直到出现胜利跳出

????{

????????Print();//打印棋盘

????????input=getch();//等待键盘按下一个字符

????????if(input==27)//如果是ESC则退出程序

????????{

????????????exit(0);

????????}

????????else?if(input==0x20)//如果是空格则开始走子

????????{

????????????if(Put())//如果走子成功则判断胜负

????????????{

????????????????victor=Check();

????????????????Now=3-Now;//轮换当前走子玩家

????????????????count++;

????????????????if(victor==1)//如果黑方达到胜利,显示提示文字并等待一次按键,返回胜利信息

????????????????{

????????????????????showText="黑方获得了胜利!";

????????????????????Print();

????????????????????if(getch()==0xE0)

????????????????????{

????????????????????????getch();

????????????????????}

????????????????????return?Now;

????????????????}

????????????????else?if(victor==2)//如果白方达到胜利,显示提示文字并等待一次按键,返回胜利信息

????????????????{

????????????????????showText="白方获得了胜利!";

????????????????????Display();

????????????????????if(getch()==0xE0)

????????????????????{

????????????????????getch();

????????????????????}

????????????????????return?Now;

????????????????}

????????????????else?if(count==MAXIMUS*MAXIMUS)//如果回合数达到了棋盘总量,即棋盘充满,即为平局

????????????????{

????????????????????showText="平局!";

????????????????????Display();

????????????????????if(getch()==0xE0)

????????????????????{

????????????????????????getch();

????????????????????}

????????????????????return?0;

????????????????}

????????????}

????????}

????????else?if(input==0xE0)//如果按下的是方向键,会填充两次输入,第一次为0xE0表示按下的是控制键

????????{

????????????input=getch();//获得第二次输入信息

????????????switch(input)//判断方向键方向并移动光标位置

????????????{

????????????????case?0x4B:

????????????????Cx--;

????????????????break;

????????????????case?0x48:

????????????????Cy--;

????????????????break;

????????????????case?0x4D:

????????????????Cx++;

????????????????break;

????????????????case?0x50:

????????????????Cy++;

????????????????break;

????????????}

????????????if(Cx0)//如果光标位置越界则移动到对侧

????????????????Cx=MAXIMUS-1;

????????????if(Cy0)

????????????????Cy=MAXIMUS-1;

????????????if(CxMAXIMUS-1)

????????????????Cx=0;

????????????if(CyMAXIMUS-1)

????????????????Cy=0;

????????}

????}

}

int?main()//主函数

{

????system("title?简易五子棋?——Etsnarl制作");//设置标题

????system("mode?con?cols=63?lines=32");//设置窗口大小

????system("color?E0");//设置颜色

????while(1)//循环执行游戏

????{

????????RunGame();

????}

????return?0;

}

(责任编辑:IT教学网)

更多

推荐Access文章