求C语言编写的五子棋程序。

Python014

求C语言编写的五子棋程序。,第1张

#include<stdio.h>

#include<stdlib.h>

#include<graphics.h>

#include<bios.h>

#include<conio.h>

#define LEFT 0x4b00

#define RIGHT 0x4d00

#define DOWN 0x5000

#define UP 0x4800

#define ESC 0x011b

#define SPACE 0x3920

#define BILI 20

#define JZ 4

#define JS 3

#define N 19

int box[N][N]

int step_x,step_y

int key

int flag=1

void draw_box()

void draw_cicle(int x,int y,int color)

void change()

void judgewho(int x,int y)

void judgekey()

int judgeresult(int x,int y)

void attentoin()

void attention()

{

char ch

window(1,1,80,25)

textbackground(LIGHTBLUE)

textcolor(YELLOW)

clrscr()

gotoxy(15,2)

printf("游戏操作规则:")

gotoxy(15,4)

printf("Play Rules:")

gotoxy(15,6)

printf("1、按左右上下方向键移动棋子")

gotoxy(15,8)

printf("1. Press Left,Right,Up,Down Key to move Piece")

gotoxy(15,10)

printf("2、按空格确定落棋子")

gotoxy(15,12)

printf("2. Press Space to place the Piece")

gotoxy(15,14)

printf("3、禁止在棋盘外按空格")

gotoxy(15,16)

printf("3. DO NOT press Space outside of the chessboard")

gotoxy(15,18)

printf("你是否接受上述的游戏规则(Y/N)")

gotoxy(15,20)

printf("Do you accept the above Playing Rules? [Y/N]:")

while(1)

{

gotoxy(60,20)

ch=getche()

if(ch=='Y'||ch=='y')

break

else if(ch=='N'||ch=='n')

{

window(1,1,80,25)

textbackground(BLACK)

textcolor(LIGHTGRAY)

clrscr()

exit(0)

}

gotoxy(51,12)

printf(" ")

}

}

void draw_box()

{

int x1,x2,y1,y2

setbkcolor(LIGHTBLUE)

setcolor(YELLOW)

gotoxy(7,2)

printf("Left, Right, Up, Down KEY to move, Space to put, ESC-quit.")

for(x1=1,y1=1,y2=18x1<=18x1++)

line((x1+JZ)*BILI,(y1+JS)*BILI,(x1+JZ)*BILI,(y2+JS)*BILI)

for(x1=1,y1=1,x2=18y1<=18y1++)

line((x1+JZ)*BILI,(y1+JS)*BILI,(x2+JZ)*BILI,(y1+JS)*BILI)

for(x1=1x1<=18x1++)

for(y1=1y1<=18y1++)

box[x1][y1]=0

}

void draw_circle(int x,int y,int color)

{

setcolor(color)

setlinestyle(SOLID_LINE,0,1)

x=(x+JZ)*BILI

y=(y+JS)*BILI

circle(x,y,8)

}

void judgekey()

{

int i

int j

switch(key)

{

case LEFT :

if(step_x-1<0)

break

else

{

for(i=step_x-1,j=step_yi>=1i--)

if(box[i][j]==0)

{

draw_circle(step_x,step_y,LIGHTBLUE)

break

}

if(i<1)break

step_x=i

judgewho(step_x,step_y)

break

}

case RIGHT :

if(step_x+1>18)

break

else

{

for(i=step_x+1,j=step_yi<=18i++)

if(box[i][j]==0)

{

draw_circle(step_x,step_y,LIGHTBLUE)

break

}

if(i>18)break

step_x=i

judgewho(step_x,step_y)

break

}

case DOWN :

if((step_y+1)>18)

break

else

{

for(i=step_x,j=step_y+1j<=18j++)

if(box[i][j]==0)

{

draw_circle(step_x,step_y,LIGHTBLUE)

break

}

if(j>18)break

step_y=j

judgewho(step_x,step_y)

break

}

case UP :

if((step_y-1)<0)

break

else

{

for(i=step_x,j=step_y-1j>=1j--)

if(box[i][j]==0)

{

draw_circle(step_x,step_y,LIGHTBLUE)

break

}

if(j<1)break

step_y=j

judgewho(step_x,step_y)

break

}

case ESC :

break

case SPACE :

if(step_x>=1&&step_x<=18&&step_y>=1&&step_y<=18)

{

if(box[step_x][step_y]==0)

{

box[step_x][step_y]=flag

if(judgeresult(step_x,step_y)==1)

{

sound(1000)

delay(1000)

nosound()

gotoxy(30,4)

if(flag==1)

{

setbkcolor(BLUE)

cleardevice()

setviewport(100,100,540,380,1)

/*定义一个图形窗口*/

setfillstyle(1,2)

/*绿色以实填充*/

setcolor(YELLOW)

rectangle(0,0,439,279)

floodfill(50,50,14)

setcolor(12)

settextstyle(1,0,5)

/*三重笔划字体, 水平放?5倍*/

outtextxy(20,20,"The White Win !")

setcolor(15)

settextstyle(3,0,5)

/*无衬笔划字体, 水平放大5倍*/

outtextxy(120,120,"The White Win !")

setcolor(14)

settextstyle(2,0,8)

getch()

closegraph()

exit(0)

}

if(flag==2)

{

setbkcolor(BLUE)

cleardevice()

setviewport(100,100,540,380,1)

/*定义一个图形窗口*/

setfillstyle(1,2)

/*绿色以实填充*/

setcolor(YELLOW)

rectangle(0,0,439,279)

floodfill(50,50,14)

setcolor(12)

settextstyle(1,0,8)

/*三重笔划字体, 水平放大8倍*/

outtextxy(20,20,"The Red Win !")

setcolor(15)

settextstyle(3,0,5)

/*无衬笔划字体, 水平放大5倍*/

outtextxy(120,120,"The Red Win !")

setcolor(14)

settextstyle(2,0,8)

getch()

closegraph()

exit(0)

}

}

change()

break

}

}

else

break

}

}

void change()

{

if(flag==1)

flag=2

else

flag=1

}

void judgewho(int x,int y)

{

if(flag==1)

draw_circle(x,y,15)

if(flag==2)

draw_circle(x,y,4)

}

int judgeresult(int x,int y)

{

int j,k,n1,n2

while(1)

{

n1=0

n2=0

/*水平向左数*/

for(j=x,k=yj>=1j--)

{

if(box[j][k]==flag)

n1++

else

break

}

/*水平向右数*/

for(j=x,k=yj<=18j++)

{

if(box[j][k]==flag)

n2++

else

break

}

if(n1+n2-1>=5)

{

return(1)

break

}

/*垂直向上数*/

n1=0

n2=0

for(j=x,k=yk>=1k--)

{

if(box[j][k]==flag)

n1++

else

break

}

/*垂直向下数*/

for(j=x,k=yk<=18k++)

{

if(box[j][k]==flag)

n2++

else

break

}

if(n1+n2-1>=5)

{

return(1)

break

}

/*向左上方数*/

n1=0

n2=0

for(j=x,k=yj>=1,k>=1j--,k--)

{

if(box[j][k]==flag)

n1++

else

break

}

/*向右下方数*/

for(j=x,k=yj<=18,k<=18j++,k++)

{

if(box[j][k]==flag)

n2++

else

break

}

if(n1+n2-1>=5)

{

return(1)

break

}

/*向右上方数*/

n1=0

n2=0

for(j=x,k=yj<=18,k>=1j++,k--)

{

if(box[j][k]==flag)

n1++

else

break

}

/*向左下方数*/

for(j=x,k=yj>=1,k<=18j--,k++)

{

if(box[j][k]==flag)

n2++

else

break

}

if(n1+n2-1>=5)

{

return(1)

break

}

return(0)

break

}

}

void main()

{

int gdriver=VGA,gmode=VGAHI

clrscr()

attention()

initgraph(&gdriver,&gmode,"c:\\tc")

/* setwritemode(XOR_PUT)*/

flag=1

draw_box()

do

{

step_x=0

step_y=0

/*draw_circle(step_x,step_y,8)*/

judgewho(step_x-1,step_y-1)

do

{

while(bioskey(1)==0)

key=bioskey(0)

judgekey()

}

while(key!=SPACE&&key!=ESC)

}

while(key!=ESC)

closegraph()

}

五子棋胜负的判定,一般有一下两种算法:

1.扫描整个棋盘,分别扫描四个方向是否有5个连子。网上找了很多五子棋源码都是用此算法,这意味着每下一个棋子都要扫描一遍19×19的棋盘,复杂而且低效,代码略。

2.每下一字,从该子开始扫描其四个方向(例如:从该子的(x-4,y)坐标开始扫描横向)是否存在5个连子。此算法较为常用,而且不涉及更为复杂的数据结构。

另外,为解决扫描越界的问题,在声明棋盘棋子位置时,可声明一个(4+19+4)×(4+19+4)的棋盘,而让棋子偏移(4,4)个坐标。

算法2源代码如下:

?123456789101112131415161718192021static void IfWin(int x,int y,int color){TCHAR win[20] int a,b if(stone[x][y]==1)wcscpy_s(win,_T("黑棋胜利!")) elsewcscpy_s(win,_T("白棋胜利!")) for(a=x-4a<=x+4a++)//判断横if(stone[a][y]==color&&stone[a+1][y]==color&&stone[a+2][y]==color&&stone[a+3][y]==color&&stone[a+4][y]==color){MessageBoxW(Xqwl.hWnd,win,TEXT(""),MB_OK)return}for(b=y-4b<=y+4b++)//判断竖if(stone[x][b]==color&&stone[x][b+1]==color&&stone[x][b+2]==color&&stone[x][b+3]==color&&stone[x][b+4]==color){MessageBoxW(Xqwl.hWnd,win,TEXT(""),MB_OK)return}for(a=x-4,b=y-4a<=x+4a++,b++)//判断右斜if(stone[a][b]==color&&stone[a+1][b+1]==color&&stone[a+2][b+2]==color&&stone[a+3][b+3]==color&&stone[a+4][b+4]==color){MessageBoxW(Xqwl.hWnd,win,TEXT(""),MB_OK)return}for(a=x-4,b=y+4a<=x+4a++,b--)//判断左斜if(stone[a][b]==color&&stone[a+1][b-1]==color&&stone[a+2][b-2]==color&&stone[a+3][b-3]==color&&stone[a+4][b-4]==color){MessageBoxW(Xqwl.hWnd,win,TEXT(""),MB_OK)return}}

五子棋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=1i<=Ni++)

for(j=1j<=Nj++)

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=0i<=Ni++)

for(j=0j<+Nj++)

{

w[i][j].sum=0

w[i][j].x=i

w[i][j].y=j

}

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

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

{

k=zh5(i,j,a)

if(k==STOP) return (STOP)

}

for(i=1i<=Ni++)

for(j=1j<=Nj++)

{

if(max.sum<w[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=yi<=y+4i++)

for(j=xj<=x+4j++)

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=1i<=12i++)

{

switch(c[i])

{

case 5:biaoji=1return(STOP)

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

case -4:c[i]=100000break

case 4:c[i]=100000break

case -3:c[i]=150break

case 3:c[i]=150break

case -2:c[i]=120break

case 2:c[i]=100break

case -1:c[i]=1break

case 1:c[i]=1break

default: c[i]=0

}

}

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

{

if(c[i]==150)

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

}

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

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

d[i][j]=0

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

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

{

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=1i<=5i++)

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

{

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

d[i][j]=-2

}

max1.sum=-1

max1.y=0

max1.x=0

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

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

{

if(max1.sum<d[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==0&&j==1&&k==1&&l==1&&m==0))

return (900)

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

return(1000)

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

return(20)

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

return(20)

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

return(-60)

if((i==1&&j==-1&&k==-1&&l==-1&&m==-1)||(i==-1&&j==1&&k==-1&&l==-1&&m==-1)||(i==-1&&j==1&&k==-1&&l==-1&&m==-1)||(i==-1&&j==-1&&k==-1&&l==1&&m==-1)||(i==-1&&j==-1&&k==-1&&l==-1&&m==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=key&0x00ff

hi=(key&0xff00)>>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=1r<=5r++)

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

}

else

{

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

{

setcolor(8)

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

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

}

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

{

setcolor(WHITE)

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

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

}

else

{

setcolor(B)

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

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=1i<=ri++)

{

circle(x,y,i)

}

}

}

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

{

int i,j

cleardevice()

setbkcolor(B)

setcolor(RED)

for(i=0i<Ni++)

{

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

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

}

for(i=1i<=Ni++)

for(j=1j<=Nj++)

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

}