项目概括(完整代码在末尾链接)
开发者前言
本系统是一个简易的五子棋系统,是我在大一学期C语言入门时进行编写的。本系统完全使用C语言进行开发,系统中分为人人对战和人机对战。人人对战时黑棋白棋都需要人工通过输入坐标确定位置。人机对战每一回合电脑会自动生成一个棋子。本系统的开发运用了模块化思想,不同的功能通过不同的函数封装,在主函数中调用即可。
本系统适合C语言初学者练习开发,运用的是较简单的语句,运行逻辑比较好理解,我将在文章末尾分析源代码。
开发技术
Microsoft Visual Studio 2010
C语言
项目功能
实现人人对战
实现人机对战(自动生成棋子)
判断5字连线输赢
项目效果
项目开发思路
- 棋盘的绘制:对于棋盘的绘制,我首先会初始化一个二维数组矩阵。在没有棋子的时候全部初始化为0,若为黑旗子则在相应位置设为1,为白棋子在相应位置设为2。在绘制棋盘的函数中,为0时将绘制棋盘边框,为1,2时则绘制棋子。
- 判断输赢的实现逻辑:棋盘每次增加一个棋子时都会进行三次遍历,当检测到第一个棋子时就将初始化一个Flag值,在上下左右斜向每发现一个相同棋子就将Flag值加1,当Flag==5时,则判断为有一方已经胜利。
核心代码函数
void Menu()//绘制UI主界面
void DrawQiPan(int QiPan[Row][Col])//棋盘绘制函数
void DrawQiZi(int type,char *tableline)//棋子绘制函数
void IsFull(int QiPan[Row][Col])//判断棋盘是否全满
void RandomCreatXY(int *point_x,int *point_y)//自动生成棋子坐标
void JudgeWin(int qipan[Row][Col])//判断输赢函数
void Person_Person()//人人对战函数
void Person_Computer()//人机对战函数
int main()//主函数
重点代码块介绍
棋盘绘制函数
void DrawQiPan(int QiPan[Row][Col])
{
int i,j;
for(i=0;i<Row;i++)
{
if(i==0)
{
for(j=0;j<Col;j++)
{
if(j==0)
{
DrawQiZi(QiPan[i][j],"┌ ");
}
if(j>0 && j<Col-1)
{
DrawQiZi(QiPan[i][j],"┬ ");
}
if(j==Col-1)
{
DrawQiZi(QiPan[i][j],"┐ ");
}
}
}
if(i>0&&i<Row-1)
{
for(j=0;j<Col;j++)
{
if(j==0)
{
DrawQiZi(QiPan[i][j],"├ ");
}
if(j>0 && j<Col-1)
{
DrawQiZi(QiPan[i][j],"┼ ");
}
if(j==Col-1)
{
DrawQiZi(QiPan[i][j],"┤ ");
}
}
}
if(i==Row-1)
{
for(j=0;j<Col;j++)
{
if(j==0)
{
DrawQiZi(QiPan[i][j],"└ ");
}
if(j>0 && j<Col-1)
{
DrawQiZi(QiPan[i][j],"┴ ");
}
if(j==Col-1)
{
DrawQiZi(QiPan[i][j],"┘ ");
}
}
}
printf("\n");
}
}
void DrawQiZi(int type,char *tableline)
{
if(type==0)
printf("●");
if(type==1)
printf("○");
if(type==2)
printf("%s",tableline);
}
通过检索二维数组的值的变化来绘制棋盘与棋子
判断输赢函数
void JudgeWin(int qipan[Row][Col])
{
int i,j;
int Flag,count,iTemp,jTemp;
for(i=0;i<20;i++)
{
for(j=0;j<20;j++)
{
if(qipan[i][j]!=2 )
{
Flag = qipan[i][j];
count= 1;iTemp = i;jTemp = j;
while((++jTemp<20)&&(count!=5))
{
if(Flag==qipan[i][jTemp])
{
count++;
if(count==5)
{
if(Flag==0)
{
printf("黑棋赢了!\n");
}
else if(Flag==1)
{
printf("白棋赢了!\n");
}
}
}
else
{
count=0;break;
}
}
iTemp=i;jTemp=j;count=1;
while((++iTemp<20 )&&(5!=count))
{
if(Flag==qipan[iTemp][j])
{
count++;
if(count==5)
{
if(Flag==0)
{
printf("黑棋赢了!\n");
}
else if(Flag==1)
{
printf("白棋赢了!\n");
}
}
}
else
{
count=0;break;
}
}
iTemp=i;jTemp=j;count=1;
while((++iTemp<20 )&&(++jTemp<20 )&&(count=5))
{
if(Flag == qipan[iTemp][jTemp])
{
count++;
if(count==5)
{
if(Flag==0)
{
printf("黑棋赢了!\n");
}
else if(Flag==1)
{
printf("白棋赢了!\n");
}
}
}
else
{
count=0;
break;
}
}
iTemp=i;jTemp=j;count=1;
while((--iTemp>=0 )&&(--jTemp>=0)&&(count!=5))
{
if(Flag==qipan[iTemp][jTemp])
{
count++;
if(count==5)
{
if(Flag==0)
{
printf("黑棋赢了!\n");
}
else if(Flag==1)
{
printf("白棋赢了!\n");
}
}
}
else
{
count=0;break;
}
}
}
}
}
}
函数的重点在分别进行的左右,上下以及斜向三次遍历。
电脑随机生成棋子函数
void RandomCreatXY(int *point_x,int *point_y)
{
*point_x=rand()%Row;
*point_y=rand()%Col;
}
在棋盘限度内每次随机生成两个坐标,传值给棋盘绘制函数。
项目源代码下载
exe文件可以直接点击运行程序
链接:https://pan.baidu.com/s/1vfXrhCpvYcojhk3FhfctJQ
提取码:brsu