软件工程系开发项目:基于C语言开发的五子棋小游戏

项目概括(完整代码在末尾链接)

开发者前言

本系统是一个简易的五子棋系统,是我在大一学期C语言入门时进行编写的。本系统完全使用C语言进行开发,系统中分为人人对战和人机对战。人人对战时黑棋白棋都需要人工通过输入坐标确定位置。人机对战每一回合电脑会自动生成一个棋子。本系统的开发运用了模块化思想,不同的功能通过不同的函数封装,在主函数中调用即可。
本系统适合C语言初学者练习开发,运用的是较简单的语句,运行逻辑比较好理解,我将在文章末尾分析源代码。

开发技术

Microsoft Visual Studio 2010
C语言

项目功能

实现人人对战
实现人机对战(自动生成棋子)
判断5字连线输赢

项目效果

项目效果

项目开发思路

  1. 棋盘的绘制:对于棋盘的绘制,我首先会初始化一个二维数组矩阵。在没有棋子的时候全部初始化为0,若为黑旗子则在相应位置设为1,为白棋子在相应位置设为2。在绘制棋盘的函数中,为0时将绘制棋盘边框,为1,2时则绘制棋子。
  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

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TY是只ITMonkey

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值