五子棋(C语言) 详细注释


/*编译成功需要graphics.h以及lib百度可以下到
vc6.0编译通过*/
#include <graphics.h>
#include <conio.h>
struct info{
int empty;				//判断当前位置是否为空 0为空 
int mark;				//记录当前位置的棋子颜色
}elem[10][10];

int d=1;				//判断本次所下棋子颜色

void initList()			// 初始换10*10 的每个数都为0
{
	for (int i=0;i<10;i++)
	{
		for (int j=0;j<10;j++)
		{
			elem[i][j].empty=0;
			elem[i][j].mark=0;
		 }
	}
}

void welcome()
{

/*
// 颜色
#define	BLACK			0
#define	BLUE			0xA80000
#define	GREEN			0x00A800
#define	CYAN			0xA8A800
#define	RED				0x0000A8
#define	MAGENTA			0xA800A8
#define	BROWN			0x0054A8
#define	LIGHTGRAY		0xA8A8A8
#define	DARKGRAY		0x545454
#define	LIGHTBLUE		0xFC5454
#define	LIGHTGREEN		0x54FC54
#define	LIGHTCYAN		0xFCFC54
#define	LIGHTRED		0x5454FC
#define	LIGHTMAGENTA	0xFC54FC
#define	YELLOW			0x54FCFC
#define	WHITE			0xFCFCFC
*/
	setcolor(RED);					// void setcolor(COLORREF color);		// 设置当前绘图前景色

	setfont(80,40,"Arial");			// 设置字体 高宽 字体
	outtextxy(210,150,"五子棋");	// 在指定位置输出文字
	setfont(40,20,"宋体");

	// kbhit() 检查当前是否有键盘输入,若有则返回一个非0值,否则返回0
	// MouseHit 检查是否存在鼠标消息 返回bool型

	while (!kbhit())
	{
	 setcolor(BLUE);	// 设置当前绘图前景色
	 outtextxy(150,300,"按任意键进入游戏");
	 Sleep(500);		// 停止0.5秒 继续执行
	 setcolor(BLACK);
	 outtextxy(150,300,"按任意键进入游戏");
	 Sleep(500);
	}
	getch();	// 接受按下的字符
	cleardevice(); // 清屏
}

void draw()
{
	setcolor(RED);		// 设置当前绘图前景色
	for (int i=0;i<10;i++)
	{
		line(140,60+40*i,500,60+40*i);  // 画线 左端(x,y) 右端(x,y)
	}
	for (int j=0;j<10;j++)
	{
		line(140+40*j,60,140+40*j,420); // 画线
	}
}

void drawcircle(int x,int y,int color)		// 画棋子
{
	for (int i=1;i<=12;i++)
	{
		setcolor(RGB(255,color,21*i));
		circle(x,y,i);		// 画圆
	}
}

int cx(int x)	// 鼠标x坐标
{
	if (x<510&&x>130)
	{
		if ((x-140)%40<10)		// 点之上 约小于1/4格 返回x坐标
		{
			return (x-140)/40;
		}
		if (40-(x-140)%40<10)	// 点之下 约小于1/4格 返回x坐标
		{
			return (x-140)/40+1;
		}

	}
	return -1;
}

int cy(int y)
{
	if (y<430&&y>50)
	{
		if ((y-60)%40<10)	// 点之右 约小于1/4格 返回y坐标
		{
			return (y-60)/40;
		}
		if (40-(y-60)%40<10)
		{
			return (y-60)/40+1;		// 点之左 约小于1/4格 返回y坐标
		}
	}
	return -1;
}

int judge(int x,int y)		//判断是否当前位置已下棋,空返回1
{
	if (elem[x][y].empty==0)
	{
		return 1;
	} 
	else
	{
		return 0;
	}
}

void list(int x,int y,int color)
{
	elem[x][y].mark=color;
	elem[x][y].empty=1;
}

int winh(int x,int y,int color)		// 棋子横向的左边,右边
{
	int i,j,countl=0,countr=0;
	i=x-1;
	j=y;
	while (elem[i][j].mark==color&&i>=0)	// 左边
	{
		countl++;
		i--;
	}
	i=x+1;	// 初始化之右的第一个棋子的坐标
	j=y;
	while (elem[i][j].mark==color&&i<10)	// 右边
	{
		countr++;
		i++;
	}
	if (countl+countr==4)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

int winv(int x,int y,int color)		// 棋子纵向的上边,下边
{
	int i,j,countt=0,countb=0;
	i=x;
	j=y-1;
	while (elem[i][j].mark==color&&j>=0)	// 上边
	{
		countt++;
		j--;
	}
	i=x;
	j=y+1;
	while (elem[i][j].mark==color&&j<10)	// 下边
	{
		countb++;
		j++;
	}
	if (countt+countb==4)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

int winlx(int x,int y,int color) // 棋子的西南 东北 
{
	int i,j,countlt=0,countlb=0;
	i=x-1;
	j=y-1;
	while (elem[i][j].mark==color&&i>=0&&j>=0)		// 西南
	{
		countlt++;
		i--;
		j--;
	}
	i=x+1;
	j=y+1;
	while (elem[i][j].mark==color&&i<10&&j<10)		// 东北
	{
		countlb++;
		i++;
		j++;
	}
	if (countlt+countlb==4)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

int winrx(int x,int y,int color)	// 棋子的西北 东南
{
	int i,j,countlt=0,countlb=0;
	i=x-1;
	j=y+1;
	while (elem[i][j].mark==color&&i>=0&&j<10)	// 西北
	{
		countlt++;
		i--;
		j++;
	}
	i=x+1;
	j=y-1;
	while (elem[i][j].mark==color&&i<10&&j>=0)	// 东南
	{
		countlb++;
		i++;
		j--;
	}
	if (countlt+countlb==4)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

int win(int x,int y,int color)
{
	// 四个方向做判断
	if (winh(x,y,color)||winv(x,y,color)||winlx(x,y,color)||winrx(x,y,color))
	{
		return 1;
	} 
	else
	{
		return 0;
	}
}

int pos(int x,int y)		// 鼠标按下位置
{
	int posx;
	int posy;
	posx=cx(x);			// 棋子落下的x坐标(交点格数)
	posy=cy(y);			// 棋子落下的y坐标(交点格数)
	if (posx!=-1&&posy!=-1)		// 在棋盘之内
	{
		if (d==1&&judge(posx,posy))		// 棋子颜色为1 && 未下棋
		{
			list(posx,posy,d);		// 保存位置和棋子颜色
			drawcircle(posx*40+140,posy*40+60,1);		// 画棋子

			if (win(posx,posy,d))
			{
				drawcircle(280,30,1);
				outtextxy(300,10,"方胜");
				return 1;
			}

			d=-d;		// 颜色置反 另一方下棋
		}

		if (d==-1&&judge(posx,posy))
		{
			list(posx,posy,d);
			drawcircle(posx*40+140,posy*40+60,255);
			if (win(posx,posy,d))
			{
				drawcircle(280,30,255);
				outtextxy(300,10,"方胜");
				return 1;
			}
			d=-d;
		}
	}
	return 0;
}

void opeator()
{
/*
struct MOUSEMSG
{
	UINT uMsg;			// 当前鼠标消息
	bool mkCtrl;		// Ctrl 键是否按下
	bool mkShift;		// Shift 键是否按下
	bool mkLButton;		// 鼠标左键是否按下
	bool mkMButton;		// 鼠标中键是否按下
	bool mkRButton;		// 鼠标右键是否按下
	int x;				// 当前鼠标 x 坐标
	int y;				// 当前鼠标 y 坐标
	int wheel;			// 鼠标滚轮滚动值(120的倍数)
};

// 鼠标消息
// 支持如下消息:
//		WM_MOUSEMOVE		鼠标移动
//		WM_MOUSEWHEEL		鼠标滚轮拨动
//		WM_LBUTTONDOWN		左键按下
//		WM_LBUTTONUP		左键弹起
//		WM_LBUTTONDBLCLK	左键双击
//		WM_MBUTTONDOWN		中键按下
//		WM_MBUTTONUP		中键弹起
//		WM_MBUTTONDBLCLK	中键双击
//		WM_RBUTTONDOWN		右键按下
//		WM_RBUTTONUP		右键弹起
//		WM_RBUTTONDBLCLK	右键双击
*/
	MOUSEMSG m;
	while (1)
	{
		m=GetMouseMsg();  // 获取一个鼠标消息。如果没有,就等待
		switch (m.uMsg)
		{
			case WM_LBUTTONDOWN:	//左键安下
			if (pos(m.x,m.y))
			{
				return;
			}
			break;
		default:
			break;
		}
	}
}

void main()
{
	initgraph(640,480);		// 原型: void initgraph(int Width, int Height, int Flag = NULL);	// 初始化图形环境
	welcome();				// 初始界面
	draw();					// 画格子
	initList();				// 初始化 10*10 的每个元素都为0
	opeator();				// operator下棋
	getch();				// 暂停下
	closegraph();			// 关闭图形环境
}


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值