#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)
}