C实现的五子棋

点击下载代码压缩包
#include<stdio.h>
#include<graphics.h>
#include<conio.h>
#define color_bk RGB(179,109,65) //背景颜色(土色)
#define color_bo RGB(137,106,69)//棋盘线条颜色
#define COUNT 15 //棋盘的大小
#define MARGIN 40 //边距的宽度
#define SIZE 24 //棋子的大小
#define CELL 30 //格子的大小
#define gap (CELL-SIZE)/2

IMAGE image;
int board[COUNT][COUNT]={0};//当数值为1是白字,2为黑子
int sign=0; //标记轮流下棋方0为白方1为黑子
bool check(int left ,int top,int value)
{
		int account=0;
		for(int i=0;i<COUNT;i++)
		{
			if(board[i][top]==value)
			{
				account++;
				if(account==5)
				return true;
			}
			else account=0;
		}
		account=0;
		for(i=0;i<COUNT;i++)
		{
			if(board[left][i]==value)
			{
				account++;
				if(account==5)
				return true;
			}
			else account=0;
		}
		account=0;
		for(i=0;i<left+top;i++)
		{
			if(board[i][left+top-i]==value)
			{
				account++;
				if(account==5)
				return true;
			}
			else account=0;
		}
		account=0;
		int number=(left>top)?COUNT-(left-top):COUNT-(top-left);
		for(i=0;i<number;i++)
		{
			if(left>top)
			{
				if(board[left-top+i][i]==value)
				{
					account++;
					if(account==5)
					return true;
				}
				else account=0;
			}
			else
			{
				if(board[i][top-left+i]==value)
				{
					account++;
					if(account==5)
					return true;
				}
				else account=0;
			}
		}
		return false;
}
bool takeit(int x,int y)
{
	int i=(x-MARGIN)/CELL;
	int j=(y-MARGIN)/CELL;
	if(board[i][j]!=0) return false;
	if(sign==0)//白子
	{
		loadimage(&image,"ui\\white.jpg");
		putimage(i*CELL+MARGIN+gap,j*CELL+MARGIN+gap,&image);
		board[i][j]=1;
		sign=1;
		if(check(i,j,1))
		return true;
		return false;
	}
	else if(sign==1)
	{
		loadimage(&image,"ui\\black.jpg");
		putimage(i*CELL+MARGIN+gap,j*CELL+MARGIN+gap,&image);
		board[i][j]=2;
		sign=0;
		if(check(i,j,2))
		return true;
		return false;
	}
	return false;
}

void main()
{
	initgraph(530,530);
	loadimage(NULL,"ui\\bk.jpg");
	MOUSEMSG m;
	int x,y;
	while(true)
	{
		if(MouseHit())
		{
			m= GetMouseMsg();
			if(m.uMsg==WM_LBUTTONDOWN)
			{
				x=m.x;
				y=m.y;
				if(!(x>MARGIN&&y>MARGIN&&x<(MARGIN+COUNT*CELL)&&y<(MARGIN+COUNT*CELL)))
				{
					continue;
				}
				else
				{
					if(takeit(x,y))
					{
						if(sign==0)
							outtextxy(40,20,_T("此局黑子获胜!"));
						else
							outtextxy(40,20,_T("此局白子获胜!"));
						break;
					}
				}
			}
		}
	}
	closegraph();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值