绘制棋盘

Ways49

制作美观的棋盘

象棋棋盘,是界面的主体部分之一。除了十条横线和九条纵线以外,九宫格内还各自有两条斜线,以及河界之间是没有竖线的。

不妨再看看之前引言第三节《开始走入新的世界》中,棋盘的成品样貌。

选择图形库

界面主要是用来观察程序行为和去除代码漏洞,图形库应以简便易用为主。

在此推荐Easyx图形库,主要原因是比较容易上手,而且在网络上,Easyx其实是有象棋棋盘绘制的现成程序的,只不过还是得自己写一写。否则,你会不太理解原作者是如何描述棋盘中棋子位置的。

重要的函数

其实很简单,无非以下几个部分:

[1] 画直线

[2] 输出汉字

[3] 更改字体颜色和大小

具体的函数和用法,其实在下文已经给出了。

初始化图形界面

	// BLOCK_SIZE (== 55) -> 每个正方格的像素宽度
  void Start(void) {
	  initgraph(BLOCK_SIZE * COLNum, BLOCK_SIZE * RowNum);
	  HWND HD = GetHWnd();
	  SetWindowText(HD, "天衍四九");
	  setbkcolor(RGB(221, 200, 157));
	  setlinestyle(PS_SOLID, 2);
	  cleardevice();
	  BeginBatchDraw();
}

INFO

一点解释

[1] initgraph(界面宽度,界面高度) -> 初始化对应尺寸的图形窗口

[2] HWND HD = GetHWnd() -> 获取图形窗口的句柄,用来更改窗口的样式

[3] SetWindowText(图形窗口句柄,被设定的名称) -> 修改图形界面名称

[4] setbkcolor(某种颜色) -> 设定窗口背景颜色为三原色:RGB(221, 200, 157)

[5] setlinestyle(PS_SOLID, 2) -> 设置线条的粗细(实线)

[6] cleardevice -> 清空屏幕

[7] BeginBatchDraw -> 批量绘图

INFO

绘制需要在循环中不断进行,否则界面不会刷新!

绘制棋盘格线

其实,界面坐标系的原点(0,0),就在窗口的最左上

  // 绘制棋盘
	setlinecolor(BLACK); // 线条颜色为黑色
	setfillcolor(RGB(221, 200, 157)); // 更改填充图形的颜色(木棕色为宜)
	for (int i = 0; i < RowNum - 2; i++) { // 每一行
		for (int j = 0; j < COLNum - 2; j++) { // 每一列
			if (i != 4) {
          fillrectangle(
            (j + 1) * BLOCK_SIZE, (i + 1) * BLOCK_SIZE,
            (j + 2) * BLOCK_SIZE, (i + 2) * BLOCK_SIZE);
			}
		}
	}

  // line(起点坐标,终点坐标)

	// 画楚河汉界外的两笔(最左和最右的竖边线)
	line(1 * BLOCK_SIZE, 5 * BLOCK_SIZE, BLOCK_SIZE, 6 * BLOCK_SIZE);
	line(9 * BLOCK_SIZE, 5 * BLOCK_SIZE, 9 * BLOCK_SIZE, 6 * BLOCK_SIZE);

	// 画两个九宫格(共计四条斜线)
	line(4 * BLOCK_SIZE, 1 * BLOCK_SIZE, 6 * BLOCK_SIZE, 3 * BLOCK_SIZE);
	line(6 * BLOCK_SIZE, 1 * BLOCK_SIZE, 4 * BLOCK_SIZE, 3 * BLOCK_SIZE);
	line(4 * BLOCK_SIZE,10 * BLOCK_SIZE, 6 * BLOCK_SIZE, 8 * BLOCK_SIZE);
	line(4 * BLOCK_SIZE, 8 * BLOCK_SIZE, 6 * BLOCK_SIZE, 0 * BLOCK_SIZE);

绘制“楚河/汉界”

  // 调整输出样式和内容
	TCHAR s[20];
	setbkmode(TRANSPARENT);
	settextcolor(BLACK);
	settextstyle(55, 0, _T("华文行楷"));
	_stprintf_s(s, _T("楚河"));
	
  // 向界面的固定座标处,绘制"楚河"
  outtextxy(2 * BLOCK_SIZE, 5 * BLOCK_SIZE, s);

  // 更改“汉界”的字体为红色
	settextcolor(RED);
	_stprintf_s(s, _T("汉界"));

  // 同理,向界面绘制"汉界"
	outtextxy(6 * BLOCK_SIZE, 5 * BLOCK_SIZE, s);

一点叮嘱

如果想要熟练掌握它,希望读者能自行查阅资料并着手尝试,不用担心,Easyx库的用法介绍,网络上还是非常多的。我并不想把所有的代码都贴出来,如果只是粘贴复制,那没有什么意义可言,也学不到什么有价值的知识。而且,欣赏爱学习的群体,显然也是我的个人偏好。

最后更新时间 8/15/2023, 2:42:36 AM