小游戏:五子棋

一、数据分析

        定义15*15棋盘二维数组

        定义角色变量        '@'黑棋 '$' 白棋 '*'空

        定义变量 用于记录落子位置

二、逻辑分析

        考虑是否需要初始化棋盘

        for(;;)

        {

                1、清屏、打印棋盘

                2、落子

                        判断是否超范围 如果是则提示非法并重新落子‘;

                        判断是否已有棋子,如果是则提示并重新落子;

                        成功落子才继续。

                3、判断是否五子连珠

                        是:结束程序

                4、交换角色

}

三、代码实现

3.1 基础版

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
//定义棋盘
char arr[15][15];
//定义角色变量
char num='@';
//定义落子位置
int x=0,y=0;
//显示棋盘
void show(void);
//开始下棋
void begin(void);
//是否成功落子
bool is_down(void);
//是否五子连珠
bool is_end(void);
//横向连珠
bool x_row(void);
//纵向连珠
bool y_row(void);
//左斜连珠
bool l_xy(void);
//右斜连珠
bool r_xy(void);

int main()
{
	//初始化棋盘
	for(int i=0; i<15; i++)
	{
		for(int j=0; j<15; j++)
		{
			arr[i][j]='*';
		}
	}
	int flag=-1; //换人下棋标志位
	//下棋循环
	while(1)
	{
		//显示棋盘
		show();
		
		//开始下棋
		 begin();
		
		//五子连珠
		if(is_end())
		{
			show();
			printf("恭喜%c获胜!\n",num);
			return 0;
		}
		
		//换人下棋
		flag=-flag;
		if(flag>0)
		{
			num='$';
		}
		else
		{
			num='@';
		}
	}
}


//显示棋盘
void show(void)
{
	system("clear");
	printf("   ");
	for(int i=0; i<15; i++)
	{
		printf("%2d ",i);
	}
	printf("\n");
	for(int i=0; i<15; i++)
	{
		printf("%2d ",i);
		for(int j=0; j<15; j++)
		{
			printf("%2c ",arr[i][j]);
		}
		printf("\n");
	}
}
	
//开始下棋
void begin(void)
{
		printf("请%c输入棋子位置:",num);
		scanf("%d%d",&x,&y);
		while(!is_down())
		{
			printf("该位置有误,请%c重新输入:",num);
			scanf("%d%d",&x,&y);
		}
		arr[x][y]=num;

}
//是否成功落子
bool is_down(void)
{
	if(x<0||x>=15||y<0||y>=15)
	{
		return false;
	}
	if(arr[x][y]!='*')
	{
		return false;
	}
	return true;
}


//是否五子连珠
bool is_end(void)
{	
	if(x_row()||y_row()||l_xy()||r_xy())
	{
		return true;
	}
	else
	{
		return false;
	}

}

//横向连珠
bool x_row(void)
{
	int sum=0;
	for(int i=0;i<15;i++)
	{
		if(arr[x][i]==num)
		{
			sum++;
			if(sum==5)
			{
				return true;
			}
		}
		else
		{
			sum=0;
		}
	}
	return false;
}
//纵向连珠
bool y_row(void)
{
	int sum=0;
	for(int i=0;i<15;i++)
	{
		if(arr[i][y]==num)
		{
			sum++;
			if(sum==5)
			{
				return true;
			}
		}
		else
		{
			sum=0;
		}
	}
	return false;
}
//左斜连珠
bool l_xy(void)
{
	int sum=0;
	int x_i=x>y?x-y:0;
	int y_i=x<y?y-x:0;
	for(int i=x_i,j=y_i;i<15&&j<15;)
	{
		if(arr[i][j]==num)
		{
			sum++;
			if(sum==5)
			{
				return true;
			}
		}
		else
		{
			sum=0;
		}
		i++;
		j++;
	}
	return false;

}
//右斜连珠
bool r_xy(void)
{
	int sum=0;
	int x_i=14-x>=y?x+y:14;
	int y_i=14-x<=y?y-14+x:0;
	for(int i=x_i,j=y_i;i<15&&j<15;)
	{
		if(arr[i][j]==num)
		{
			sum++;
			if(sum==5)
			{
				return true;
			}
		}
		else
		{
			sum=0;
		}
		i--;j++;
	}
	return false;
}

3.2改进版

        由于基础版的设计需要用户输入坐标,非常不方便,因此寻思考虑使用方向键,直接到达下棋位置,按下回车即可下棋。注意:该代码运行仅使用在linux系统下,getch.h头文件内容可前往此处查看。

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <getch.h>
//定义棋盘
char arr[15][15];
//定义角色变量
char num='@';
//定义落子位置
int x=0,y=0;
//换人下棋标志位
int flag=-1; 
//显示棋盘
void show(void);
//是否成功落子
bool is_down(void);
//是否五子连珠
bool is_end(void);
//横向连珠
bool x_row(void);
//纵向连珠
bool y_row(void);
//左斜连珠
bool l_xy(void);
//右斜连珠
bool r_xy(void);

int main()
{
	//初始化棋盘
	for(int i=0; i<15; i++)
	{
		for(int j=0; j<15; j++)
		{
			arr[i][j]='*';
		}
	}
	//显示棋盘
	show();
	//下棋循环
	while(1)
	{
		//开始下棋
		printf("\33[%d;%dH",x+1,(y+1)*2);
		switch(getch())
		{
			case 183:x>0 && x--;break;
			case 184:x<14 && x++;break;
			case 186:y>0 && y--;break;
			case 185:y<14 && y++;break;
			case 10:
					printf("%c",num);
					arr[x][y]=num;
                    //五子连珠
                    if(is_end())
                    {
                        printf("\33[16;0H");
                        printf("恭喜%c获胜!\n",num);
                        return 0;
                    }
                    flag=-flag;
                    //换人下棋
                    if(flag>0)
                    {
                        num='$';
                    }
                    else
                    {
                        num='@';
                    }
		}
	}
}

//显示棋盘
void show(void)
{
	system("clear");
	for(int i=0; i<15; i++)
	{
		for(int j=0; j<15; j++)
		{
			printf(" %c",arr[i][j]);
		}
		printf("\n");
	}
}
	
//是否成功落子
bool is_down(void)
{
	if(x<0||x>=15||y<0||y>=15)
	{
		return false;
	}
	if(arr[x][y]!='*')
	{
		return false;
	}
	return true;
}
//是否五子连珠
bool is_end(void)
{	
	if(x_row()||y_row()||l_xy()||r_xy())
	{
		return true;
	}
	else
	{
		return false;
	}

}
//横向连珠
bool x_row(void)
{
	int sum=0;
	for(int i=0;i<15;i++)
	{
		if(arr[x][i]==num)
		{
			sum++;
			if(sum==5)
			{
				return true;
			}
		}
		else
		{
			sum=0;
		}
	}
	return false;
}
//纵向连珠
bool y_row(void)
{
	int sum=0;
	for(int i=0;i<15;i++)
	{
		if(arr[i][y]==num)
		{
			sum++;
			if(sum==5)
			{
				return true;
			}
		}
		else
		{
			sum=0;
		}
	}
	return false;
}
//左斜连珠
bool l_xy(void)
{
	int sum=0;
	int x_i=x>y?x-y:0;
	int y_i=x<y?y-x:0;
	for(int i=x_i,j=y_i;i<15&&j<15;)
	{
		if(arr[i][j]==num)
		{
			sum++;
			if(sum==5)
			{
				return true;
			}
		}
		else
		{
			sum=0;
		}
		i++;
		j++;
	}
	return false;

}
//右斜连珠
bool r_xy(void)
{
	int sum=0;
	int x_i=14-x>=y?x+y:14;
	int y_i=14-x<=y?y-14+x:0;
	for(int i=x_i,j=y_i;i<15&&j<15;)
	{
		if(arr[i][j]==num)
		{
			sum++;
			if(sum==5)
			{
				return true;
			}
		}
		else
		{
			sum=0;
		}
		i--;j++;
	}
	return false;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

就酱77叭

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

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

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

打赏作者

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

抵扣说明:

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

余额充值