一:功能模块设计
1.初始化模块。本模块主要是用于初始化屏幕信息,包括显示欢迎信息、操作方法和初始化棋盘。
2.功能控制模块。本模块是各个功能函数的集合,主要是被其它模块调用,包括画棋子、胜负判断和行棋转换等功能。
3.下棋操作模块。人机交互。
4.帮助模块。教用户如何操作,提示办到哪方下棋。
二:数据结构设计
1.定义数组:
status[19][19],存棋盘坐标的状态,每个坐对应着一个状态,可以是0、1、2。‘0’表示当前位置无棋子,‘1’表示Player1在这里放了一个棋子,‘2’表示Player2在这里放了棋子。
2.全局变量:
1.step_x和step_y是两个整型变量,分别表示x,y的坐标。
2.Key也是整型变量,存储bioskey()函数返回的键值。UP,DOWN,LEFT,RIGHT的值都是由bioskey()返回,无需死记硬背。
3.Flag表示是哪个玩家,1表示Player1,2表示player2;
4.Offset_x,offset_y,offset分别表示x、y坐标的偏移量和放大倍数。
三:函数功能描述
1.drawboard()函数用于画棋盘,棋盘由18条横线和18条竖线交叉组成,函数主要由画线函数voidline(intx0,inty0,intx1,inty1)实现的。
2.drawCircle()画棋子,函数主要由画圆函数voidcircle(intx,inty,intr)实现的。
3.Alternation()用于交换下顺序,实现轮流下棋的功能,用全局变量flag标识。
4.judgePlayer()根据不用的棋方画不同颜色的棋子,也是根据全局变量flag进行判断的。
5.Down()完成下棋的操作过程,根据bioskey()返回的键值判断该如何操作,详见代码;
6.resultCheck(intx,inty)判断当前下棋的人否获胜,其中x,y表示下棋都最后落子坐标,判断横纵斜方向是否有五个相同棋子(颜色相同)。
7.welcomeInfo()用于输出欢迎信息,和提示性信息,如按键操作等。
8.showMassage()显示当前轮到哪一方下棋。
编译环境:Win-Tc
注意:请在Win-Tc安装目录下编译,否则可能初始化图形界面失败
本人C文件路径作参考:C:\Win-Tc\projects\noname.c
代码:
#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 0x11b
#define space 0x3920
#define offset 20
#define offset_x 4
#define offset_y 3
#define n 19
int status[n][n];
int step_x,step_y;
int key;
int flag;
void drawBoard();
void drawCircle(int x,int y,int color);
void alternation();
void judgePlayer(int x,int y);
void done();
int resultCheck(int x,int y);
void welcomeInfo();
void showMassage();
int main()
{
int gdriver;
int gmode;
int errorcode;
clrscr();
welcomeInfo();
gdriver=DETECT;
gmode=0;
initgraph(&gdriver,&gmode,"C:\\Win-TC");
errorcode=graphresult();
if(errorcode!=grOk)
{
printf("\nNotice:Error occured when graphics initializetion:%s",grapherrormsg(errorcode));
printf("Press any key to quit!\n");
getch();
exit(1);
}
flag=1;
drawBoard();
showMassage();
do
{
step_x=0;
step_y=0;
judgePlayer(step_x-1,step_y-1);
do
{
while(bioskey(1)==0);
key=bioskey(0);
done();
}
while(key!=space&&key!=esc);
}
while(key!=esc);
closegraph();
return 0;
}
void welcomeInfo()
{
char ch;
gotoxy(12,4);
printf("Welcome you to gobang world!");
gotoxy(12,6);
printf("1.You can use the up,down,left and right key to move the chessman,");
gotoxy(12,8);
printf(" and you can press Space key to enter after you move it !");
gotoxy(12,10);
printf("2.You can use Esc key to exit the game to!");
gotoxy(12,12);
printf("3.Do not move the pieces out of the chessboard!");
gotoxy(12,14);
printf("Do you want to continue?(Y/N)");
ch=getchar();
if(ch=='n'||ch=='N')exit (0);
}
void drawBoard()
{
int x1,x2,y1,y2;
setbkcolor(2);
setcolor(1) ;
setlinestyle(DOTTED_LINE,1,1);
for(x1=1,y1=1,y2=18;x1<=18;x1++)
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);
for(x1=1;x1<=18;x1++)
for(y1=1;y1<=18;y1++)
status[x1][y1]=0;
setcolor(14);
settextstyle(1,0,1);
outtextxy((19+offset_x)*offset,(2+offset_y)*offset,"Player key:");
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");
}
void drawCircle(int x,int y,int color)
{
setcolor(color);
setlinestyle(SOLID_LINE,0,1);
x=(offset_x+x)*offset;
y=(y+offset_y)*offset;
circle(x,y,6);
}
void alternation()
{
flag=flag==1?2:1;
}
void judgePlayer(int x,int y)
{
if(flag==1)
drawCircle(x,y,15);
if(flag==2)
drawCircle(x,y,4);
}
int resultCheck(int x,int y)
{
int j,k;
int n1,n2;
while(1)
{
n1=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;
n1=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;
n1=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;k++,j++)
{
if(status[j][k]==flag)
n2++;
else break;
}
if(n1+n2-1>=5)return 1;
n1=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>=5)return 1;
return 0;
}
}
void done()
{
int i,j;
switch(key)
{
case left:
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;
}
case right:
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;
}
case down:
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;
}
case up:
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;
}
case esc:break;
case space:
if(status[step_x][step_y]==0)
{
status[step_x][step_y]=flag;
if(resultCheck(step_x,step_y)==1)
{
sound(1000);
delay(1000);
nosound();
gotoxy(30,4);
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);
outtextxy(20,20,"CONGRATULATION!");
setcolor(15);
settextstyle(3,0,4);
if(flag==1)
{
outtextxy(20,120,"Player 1 win the game!!");
}
if(flag==2)
{
outtextxy(20,120,"Player 2 win the game!!");
}
setcolor(14);
settextstyle(2,0,8);
getch();
exit(0);
}
alternation();
showMassage();
break;
}
else break;
}
}
void showMassage()
{
if(flag==1)
{
setcolor(2);
settextstyle(1,0,1);
gotoxy(100,30);
outtextxy(100,30,"It's turn to Player2 !");
setcolor(12);
settextstyle(1,0,1);
outtextxy(100,30,"It's turn to Player1 !");
}
if(flag==2)
{
setcolor(2);
settextstyle(1,0,1);
outtextxy(100,30,"It's turn to Player1 !");
setcolor(12);
settextstyle(1,0,1);
outtextxy(100,30,"It's turn to Player2 !");
}
}