voidJudgePlayer(intx,inty);*对不同的行棋方画不同颜色的圆函数*
voidDone();*执行下棋函数*
intResultCheck(intx,inty);*判断当前行棋方是否获胜函数*
voidWelcomeInfo();*显示欢迎信息函数*
voidShowMessage();*显示行棋方函数*
*定义函数*
*显示欢迎信息函数*
voidWelcomeInfo()
{
charch;*定义显示欢迎函数数组*
*移动光标到指定位置*
gotoxy(12,4);*将当前字符屏幕的光标位置移动到x,y坐标位置*
*显示欢迎信息*
printf("Welcomeyoutowuziqiword!
");
gotoxy(12,6);
printf("1.up,down,leftandrightkeytomove,");
gotoxy(12,8);
printf("Spacekeytomove!
");
gotoxy(12,10);
printf("2.Esckeytoexit!
");
gotoxy(12,12);
printf("3.Donnotmovethepiecesoutofthechessboard!
");
gotoxy(12,14);
printf("continue?
(YN)");
ch=getchar();*从标准输入流读取一个字符并回显,读到回车符时退出*
*判断程序是否要继续进行,按n表示退出,y表示继续玩游戏*
if(ch=='n'||ch=='N')
*如果不继续进行,则推出程序*
exit(0);*程序中止执行,返回调用过程*
}
*画棋盘函数,用来画棋盘的格子和棋子,这里棋子用带某一颜色的圆圈表示*
voidDrawBoard()
{
intx1,x2;
inty1,y2;
*设置背景色*
setbkcolor
(2);
*设置线条颜色*
setcolor(14);*设置前景颜色,颜色值含义如下:
*
*0-BLACK黑深色0-7*
*1-BLUE兰2-GREEN绿*
*3-CYAN青4-RED红*
*5-MAGENTA洋红6-BROWN棕*
*7-LIGHTGRAY淡灰8-DARKGRAY深灰淡色8-15*
*9-LIGHTBLUE淡兰10-LIGHTGREEN淡绿*
*11-LIGHTCYAN淡青12-LIGHTRED淡红*
*13-LIGHTMAGENTA淡洋红14-YELLOW黄*
*15-WHITE白*
*设置线条风格、宽度*
setlinestyle(DOTTED_LINE,3,1);*设置画线模式,linestyle画线风格,取值和含义如下*
*SOLID_LINE=0实线DOTTED_LINE=1点线*
*CENTER_LINE=2中心线DASHED_LINE=3虚线*
*USERBIT_LINE=4用户自定义模式*
*upattern在linestyle=USERBIT_LINE时,表示自定义的线型thickness线宽,有2个取值;*
*NORM_WIDTH=11个象素宽度THICK_WIDTH=33个象素宽度*
*按照预设的偏移量开始画棋盘*
for(x1=1,y1=1,y2=18;x1<=18;x1++)*line用于画直线,x1,y1,x2,y2直线的起点和终点坐标*
line((x1+OFFSET_x)*OFFSET,(y1+OFFSET_y)*OFFSET,(x1+OFFSET_x)*OFFSET,(y2+OFFSET_y)*OFFSET);
for(x1=1,y1=1,x2=18;y1<=18;y1++)
line((x1+OFFSET_x)*OFFSET,(y1+OFFSET_y)*OFFSET,(x2+OFFSET_x)*OFFSET,(y1+OFFSET_y)*OFFSET);
*将各个点的状态设置为0*
for(x1=1;x1<=18;x1++)
for(y1=1;y1<=18;y1++)
status[x1][y1]=0;
*显示帮助信息*
setcolor(150);
*设置字体、大小*
settextstyle(1,0,4);*设置图形模式下字符显示底字体、方向和大小*
*font显示字体,取值如下:
*
*DEFAULT_FONT=08x8点阵*
*TRIPLEX_FONT=1三倍笔划*
*SMALL_FONT=2小号字体*
*SANS_SERIF_FONT=3无衬线字体*
*GOTHIC_FONT=4哥特字体*
*directiom显示方向,取值如下:
*
*HORIZ_DIR=0水平显示*
*VERT_DIR=1垂直显示*
*charsize字体放大倍数,取值为0-10*
outtextxy((19+OFFSET_x)*OFFSET,(2+OFFSET_y)*OFFSET,"Playerkey:
");*图形模式下在x,y坐标位置显示一行字符串*
setcolor(9);
settextstyle(3,0,1);
outtextxy((19+OFFSET_x)*OFFSET,(4+OFFSET_y)*OFFSET,"UP--up");
outtextxy((19+OFFSET_x)*OFFSET,(6+OFFSET_y)*OFFSET,"DOWN--down");
outtextxy((19+OFFSET_x)*OFFSET,(8+OFFSET_y)*OFFSET,"LEFT--left");
outtextxy((19+OFFSET_x)*OFFSET,(10+OFFSET_y)*OFFSET,"RIGHT--right");
outtextxy((19+OFFSET_x)*OFFSET,(12+OFFSET_y)*OFFSET,"ENTER--space");
setcolor(14);
settextstyle(1,0,1);
outtextxy((19+OFFSET_x)*OFFSET,(14+OFFSET_y)*OFFSET,"Exit:
");
setcolor(9);
settextstyle(3,0,1);
outtextxy((19+OFFSET_x)*OFFSET,(16+OFFSET_y)*OFFSET,"ESC");
}
*画圆函数,用来表示玩家的棋子*
voidDrawCircle(intx,inty,intcolor)
{
setcolor(color);
*设置画圆线条的风格,宽度,这里设置为虚线*
setlinestyle(SOLID_LINE,0,5);
x=(x+OFFSET_x)*OFFSET;
y=(y+OFFSET_y)*OFFSET;
*以(x,y)为圆心,8为半径画圆*
circle(x,y,8);
}
*交换行棋方函数,即让玩家轮流下棋*
voidAlternation()
{
if(flag==1)
flag=2;*如果此时为玩家1落棋,则下回换为玩家2落棋*
else
flag=1;*如果此时为玩家2落棋,则下回换为玩家1落棋*
}
*对不同的行棋方画不同颜色的圆函数,用于区分不同玩家的棋子*
voidJudgePlayer(intx,inty)
{
if(flag==1)
DrawCircle(x,y,15);
if(flag==2)
DrawCircle(x,y,4);
}
*判断当前行棋方是否获胜函数,即判断是否有五个相同颜色的棋子已连成一条线*
intResultCheck(intx,inty)
{
intj,k;
intn1,n2;
while
(1)
{
*对水平方向进行判断是否有5个同色的圆*
n1=0;
n2=0;
*水平向左数*
for(j=x,k=y;j>=1;j--)
{
if(status[j][k]==flag)
n1++;
else
break;
}
*水平向右数*
for(j=x,k=y;j<=18;j++)
{
if(status[j][k]==flag)
n2++;
else
break;
}
if(n1+n2-1>=5)
{
return
(1);
}
*对垂直方向进行判断是否有5个同色的圆*
n1=0;
n2=0;
*垂直向上数*
for(j=x,k=y;k>=1;k--)
{
if(status[j][k]==flag)
n1++;
else
break;
}
*垂直向下数*
for(j=x,k=y;k<=18;k++)
{
if(status[j][k]==flag)
n2++;
else
break;
}
if(n1+n2-1>=5)
{
return
(1);
}
*从左上方到右下方进行判断是否有5个同色的圆*
n1=0;
n2=0;
*向左上方数*
for(j=x,k=y;(j>=1)&&(k>=1);j--,k--)
{
if(status[j][k]==flag)
n1++;
else
break;
}
*向右下方数*
for(j=x,k=y;(j<=18)&&(k<=18);j++,k++)
{
if(status[j][k]==flag)
n2++;
else
break;
}
if(n1+n2-1>=5)
{
return
(1);
}
*从右上方到左下方进行判断是否有5个同色的圆*
n1=0;
n2=0;
*向右上方数*
for(j=x,k=y;(j<=18)&&(k>=1);j++,k--)
{
if(status[j][k]==flag)
n1++;
else
break;
}
*向左下方数*
for(j=x,k=y;(j>=1)&&(k<=18);j--,k++)
{
if(status[j][k]==flag)
n2++;
else
break;
}
if(n1+n2-1>=5)
{
return
(1);
}
return(0);
}
}
*执行下棋函数*
voidDone()
{
inti;
intj;
*根据不同的key值进行不同的操作*
switch(key)
{
*如果是向左移动的*
caseLEFT:
*如果下一步超出棋盘左边界则什么也不作*
if(step_x-1<0)
break;
else
{
for(i=step_x-1,j=step_y;i>=1;i--)
if(status[i][j]==0)
{
DrawCircle(step_x,step_y,2);
break;
}
if(i<1)
break;
step_x=i;
JudgePlayer(step_x,step_y);
break;
}
*如果是向右移动的*
caseRIGHT:
*如果下一步超出棋盘右边界则什么也不作*
if(step_x+1>18)
break;
else
{
for(i=step_x+1,j=step_y;i<=18;i++)
if(status[i][j]==0)
{
*每移动一步画一个圆,显示移动的过程*
DrawCircle(step_x,step_y,2);
break;
}
if(i>18)break;
step_x=i;
*根据不同的行棋者画不同颜色的圆*
JudgePlayer(step_x,step_y);
*显示行棋一方是谁*
break;
}
*如果是向下移动的*
caseDOWN:
*如果下一步超出棋盘下边界则什么也不作*
if((step_y+1)>18)
break;
else
{
for(i=step_x,j=step_y+1;j<=18;j++)
if(status[i][j]==0)
{
DrawCircle(step_x,step_y,2);
break;
}
if(j>18)break;
step_y=j;
JudgePlayer(step_x,step_y);
break;
}
*如果是向上移动的*
caseUP:
*如果下一步超出棋盘上边界则什么也不作*
if((step_y-1)<0)
break;
else
{
for(i=step_x,j=step_y-1;j>=1;j--)
if(status[i][j]==0)
{
DrawCircle(step_x,step_y,2);
break;
}
if(j<1)break;
step_y=j;
JudgePlayer(step_x,step_y);
break;
}
*如果是退出键*
caseESC:
break;
*如果是确定键*
caseSPACE:
*如果操作是在棋盘之内*
if(step_x>=1&&step_x<=18&&step_y>=1&&step_y<=18)
{
*按下确定键后,如果棋子当前位置的状态为0*
if(status[step_x][step_y]==0)
{
*则更改棋子当前位置的状态在flag,表示是哪个行棋者行的棋*
status[step_x][step_y]=flag;
*如果判断当前行棋者获胜*
if(ResultCheck(step_x,step_y)==1)
{
*以指定频率打开PC扬声器*
sound(1000);
*扬声器的发生时间,为1秒钟*
delay(1000);
nosound();
gotoxy(30,4);
setbkcolor(BLUE);
*清除图形屏幕*
cleardevice();*清除屏幕显示,仅用于图形工作方式*
*为图形输出设置当前视口*
setviewport(380,1);*设置图形模式下图形函数操作的窗口大小*
*left,top,right,bottom窗口大小坐标clip是否剪切*
*1表示对超出设置图形窗口大小的操作不显示*
*0表示超出的内容也显示。
*
*绿色实填充*
setfillstyle(1,2);*设置填充模式和填充颜色*
*color填充颜色pattern填充模式,共13种,具体如下:
*
*EMPTY_FILL背景色填充SOLID_FILL实填充*
*LINE_FILL---线填充LTSLASH_FILL斜线填充*
*SLASH_FILL粗斜线填充*
*BKSLASH_FILL反粗斜线填充LTBKSLASH_FILL反斜线填充*
*HATCH_FILL网格填充XHATCH_FILL斜网格填充*
*INTERLEAVE_FILL间隔点线填充WIDE_DOT_FILL稀疏点填充*
*CLOSE_DOT_FILL密集点填充USER_FILL用户自定义填充*
setcolor(YELLOW);
rectangle();*图形方式下,在屏幕上画一个矩形*
floodfill();*填充一个有边界的区域,x,y要填充区域内的任意一点坐标*
*border填充区域边界的颜色*
setcolor(12);
settextstyle(1,0,5);
*三重笔划字体,