1.头文件
2.在画图软件里画一个自己喜欢的棋盘背景,截图并将它保存在D盘里(如果发给其他用户打开运行程序会加载不出图片,因为对方电脑里没有此图片)或者将其放在和代码同一个文件夹里,通过easy x库的帮助手册用相关函数代码将棋盘背景展示在界面(下面关于图形的函数都可以参考帮助手册),尺寸需要根据自己所截的图计算,这里使用600*600
运行:
3.画格子,棋盘格子为15*15,写一个画线函数,15条线,580/14=40,左右上下各空20cm,一个格子长度为40,每隔40画一条,并在主函数里调用
4.画点,五子棋盘原始的五个小黑点,通过坐标计算圆心坐标,半径,并在主函数里调用
5.画棋子,定义一个全局变量num=1作为标志,让其变为1和-1来交替下黑棋和白棋,定义一个二维数组14行*14列并初始化为0,计算鼠标点击下棋的范围,在主函数里写鼠标事件并调用画棋子函数
6.写到这里我们目前只能交替下黑白棋子,但下过的位置再次点击还会继续下下一个棋子,黑棋子会变白,白棋子也会变黑,下来我们就解决此问题
通过二维数组值的变化来判断此位置是否下过棋,并在画棋子函数里调用
7.接下来我们就要判断是否五子连珠,通过二维数组的坐标来判断,表示出坐标即可
8.现在我们需要在五子连珠的时候设置提示并结束游戏,定义一个全局变量q,用来保存五子连珠时棋子的类型
9.在主函数里调用
全部代码
# define _CRT_SECURE_NO_WARNINGS
#include <conio.h>
#include <stdio.h>
#include <graphics.h> // 引用图形库头文件
#include <stdlib.h>
int q;
int num = 1;
int arr[14][14] = { 0 };
void Line()
{
setlinecolor(BLACK);//画竖线
for (int x = 20; x < 600; x += 40)
line(x, 20, x, 580);//起始x,起始y,终点x,终点y
for (int y = 20; y < 600; y += 40)//画横线
line(20,y,580,y);
}
void point()
{
setfillcolor(BLACK);
fillcircle(20 + 3* 40, 20 + 3* 40, 5);//圆心坐标(,,半径)
fillcircle(20 + 11* 40, 20 + 3 * 40, 5);
fillcircle(20 + 3 * 40, 20 + 11* 40, 5);
fillcircle(20 + 11 * 40, 20 + 11 * 40, 5);
fillcircle(20 + 7 * 40, 20 + 7 * 40, 5);
}
int check_qizi(int x, int y)//检查棋子是否下过
{
if (arr[x][y] != 0)//因为初始化为0,若不等于0,则此位置已经下过,返回结束
return 0;
else
arr[x][y] = num;//若不等于0,则此位置未下过,按照num交替下棋
return 1;
}
void draw_qizi(int m, int n)//画棋子,(m,n)为鼠标所点的坐标
{
if (num == -1)
{
setfillcolor(WHITE);//下白棋
}
else if (num == 1)
{
setfillcolor(BLACK);//下黑棋
}
int x, y;
x = m / 40;//二维数组的横坐标
y = n / 40;//二维数组的纵坐标
if (check_qizi(x, y) == 0)//等于0表示下过棋,直接return
return;
fillcircle(x * 40 + 20, y * 40 + 20, 18);//棋子大小坐标
num *= -1;//黑白交替
}
int check_five(int x, int y)//检查一个下过棋的坐标相邻五个是否一样
{
if(arr[x][y]==arr[x-1][y]&&arr[x][y]==arr[x-2][y]&&arr[x][y]==arr[x+1][y] &&arr[x][y]==arr[x+2][y])//横向相邻
return 1;
if (arr[x][y] == arr[x][y - 1] && arr[x][y] == arr[x][y - 2] && arr[x][y] == arr[x][y + 1] && arr[x][y] == arr[x][y + 2])//纵向相邻
return 1;
if (arr[x][y] == arr[x - 1][y - 1] && arr[x][y] == arr[x - 2][y - 2] && arr[x][y] == arr[x + 1][y + 1] && arr[x][y] == arr[x + 2][y + 2])
return 1;//主对角线
if (arr[x][y] == arr[x - 1][y + 1] && arr[x][y] == arr[x + 2][y - 2] && arr[x][y] == arr[x + 1][y - 1] && arr[x][y] == arr[x - 2][y + 2])
return 1;//副对角线
else
return 0;//相同返回1,不同返回0
}
int check_over()//判断输赢
{
for (int x = 0; x < 15; x++)
{
for (int y = 0; y < 15; y++)
{
if (arr[x][y] == 0)//未下过棋的位置直接跳过
continue;
else if (check_five(x, y) == 1)
{
q = arr[x][y];//当前获胜方棋子类型
return 1;
}
}
}
return 0;
}
int main()
{
IMAGE img;
initgraph(600, 600);//展示窗口的大小
loadimage(NULL, _T("D:\\1.png"));
//加载图片
putimage(600, 600, &img); // 显示图片
Line();
point();
MOUSEMSG m;//保存鼠标消息
while (1)//防止闪退
{
m = GetMouseMsg();//获取一个鼠标消息
if (m.uMsg == WM_LBUTTONDOWN)//按下鼠标左键
{
draw_qizi(m.x, m.y);
check_over();
if (check_over() == 1)
{
if (q == 1)
{
settextstyle(50, 0, _T("楷体"));
outtextxy(200, 250, "黑棋获胜");
}
else
{
settextstyle(50, 0, _T("楷体"));
outtextxy(200, 250, "白棋获胜");
}
break;
}
}
}
_getch();
closegraph();
return 0;
}