#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include <graphics.h>
#include <conio.h>
#define NUM 15
#define WIN_NUM 5
int pieceArr[NUM][NUM] = { 0 };//定义一个全局二维数组,用来存放棋子,0表示没有棋子,
//1表示黑子,2表示白子
void Draw_line()//画线函数
{
setlinecolor(BLACK);
for (int x = 20; x < 600; x += 40)
line(x, 20, x, 580);
for (int y = 20; y < 600; y += 40)
line(20, y, 580, y);
}
void Draw_point()//画点函数
{
setfillcolor(BLACK);
fillcircle(140, 140, 4);
fillcircle(460, 140, 4);
fillcircle(140, 460, 4);
fillcircle(460, 460, 4);
fillcircle(300, 300, 4);
}
void Draw_piece(bool black,int x,int y)//画棋子函数
{
int i = x / 40;//换算坐标
int j = y / 40;
if (black)//黑子
{
setfillcolor(BLACK);
pieceArr[i][j] = 1;//把这个信息保存在数字中
}
else//白子
{
setfillcolor(WHITE);
pieceArr[i][j] = 2;
}
fillcircle(20 + i * 40, 20 + j * 40, 15);//边界问题
}
bool NicePos(int x, int y)//判断这个位置是否能继续下棋,需要计算棋盘坐标,因为二维数组
//就是用坐标定义的,所以需要转换。如果返回类型为真,代表此处没有棋子,可以下。
{
x = x / 40;
y = y / 40;
return pieceArr[x][y] == 0;
}
int GameOver(int x, int y)//判断游戏输赢的函数,返回0,代表游戏继续;返回1,代表黑子
//赢;返回2,代表白子赢。在该函数中,要判断五种情况
{
x = x / 40;//换算下标
y = y / 40;
int count = 0;//计数器,看相同颜色的棋子是否能连成5个
int n = pieceArr[x][y];//看是黑子还是白子或者没有棋子
if (n == 0)
return 0;
int i;
int j;
//同行的棋子
for (i = x; i >= 0 && pieceArr[i][y] == n; i--)//统计同行前面的
count++;
for (i = x+1; i < NUM && pieceArr[i][y] == n; i++)//统计同行后面的
count++;
if (count >= WIN_NUM)
return n;
//同列的棋子
count = 0;//一定要给计数器重新清零
for (j = y; j >= 0 && pieceArr[x][i] == n; j--)//统计同列上面的
count++;
for (j = y+1; j < NUM && pieceArr[x][i] == n; j++)//统计同列下面的
count++;
if (count >= WIN_NUM)
return n;
//45°斜线
count = 0;
for (i = x, j = y; i < NUM && j >= 0 && pieceArr[i][j] == n; i++, j--)
count++;//统计右上方
for (i = x - 1, j = y + 1; i >= 0 && j < NUM && pieceArr[i][j] == n; i--, j++)
count++;//统计左下方
if (count >= WIN_NUM)
return n;
//135°斜线
count = 0;
for (i = x, j = y; i >= 0 && j >= 0 && pieceArr[i][j] == n; i--, j--)
count++;//统计左上方
for (i = x, j = y; i < NUM && j < NUM && pieceArr[i][j] == n; i++, j++)
count++;//统计右下方
if (count >= WIN_NUM)
return n;
return 0;//如果都没有,就代表游戏继续,所以返回值为0
}
// 主函数
int main()
{
initgraph(600, 600);
loadimage(NULL, _T("wzq1.png"));
Draw_line();//画线
Draw_point();//画点
ExMessage m;//定义一个变量用来接收鼠标消息
bool black = true;//表示黑子先下
while (1)
{
m = getmessage(EX_MOUSE);
if (m.message == WM_LBUTTONDOWN)
{
if (NicePos(m.x,m.y))
{
Draw_piece(black, m.x, m.y);
int n = GameOver(m.x, m.y);
if (n == 1)
{
settextcolor(RED);
settextstyle(36, 0, _T("Consolas"));//设置样式
outtextxy(260, 0, _T("黑棋赢了"));//输出字符串
break;
}
else if (n == 2)
{
settextcolor(RED);
settextstyle(36, 0, _T("Consolas"));
outtextxy(260, 0, _T("白棋赢了"));
break;
}
black = !black;
}
}
}
_getch();
closegraph();
return 0;
}
运行结果如下: