基于单片机的棋盘设计

消费电子   作者:王天睿(辽宁轨道交通职业学院,沈阳 110023) 时间:2021-03-01来源:电子产品世界

编者按:本文主要探讨了我国传统的象棋对弈与单片机技术相结合的方法,通过软件编程技术、电子技术与单片机应用技术的结合,可以更加方便有效的提升象棋对弈的乐趣和效率。


摘要:本文摒弃了诸多传统象棋的弊端,减轻了下棋人员的负担,增加了下棋的趣味性,实现自动采集对局信息发送到采集服务器进行处理的功能,具体包括语音提示,计着子数,自动计时,判断行棋是否符合规则等功能。

本系统是基于嵌入式单片机技术,利用相关光电检测等技术,自主实现棋盘的裁判功能,具有价格便宜,性价比高,制作简单,易于实现功能扩展等优点。文章重点对棋子编码及程序逻辑控制方面进行了探讨。

引言

笔者进行本文章研究的目的和意义体现在这些方面:将信息化技术引入到中国象棋这项运动中来,促进其参与品味的提升,在一定程度上解放棋手和裁判,使得中国象棋这项运动变得更加简单,进一步拓宽中国象棋运动的视野,吸引更多的人参与到此项运动中来。

文章的主要工作是如何在保持棋手对垒惯性思维的基础上,将先进的软硬件技术应用到象棋这一项传统运动及项目中来,利用信息技术完成记录、裁决等操作,充分发挥传感器、单片机等设备,以及C语言编程技术等电子信息专业的所学知识来完成计时、声音提示、判断行棋规则等重要功能。

此课题将改变老式象棋诸多弊端,提高比赛的品味和档次以及减轻棋手负担,提高对局质量,实现自动采集对局信息发送到采集服务器进行处理的功能,能够自动判断棋手下棋是否符合规则,做出判断,并且自动记录棋手步数。具体包括自动计时,语音报警,自动判断规则等功能。

中国象棋的每个棋子摆放的位置均为横纵交叉点上,而本次论文设计引用了文件[1-2]中的传感器技术,为每个交叉点上均采用一个光电传感器来接收棋子的移动或者变更信号,根据每个棋子的初始位置判断棋子种类,根据棋子的运动轨迹判断每个棋子是否符合行棋规则。弈棋交替进行,直到某一方的将或者帅被对方吃掉为止。

比赛时,双方轮流倒计时,即一方棋子落地开始为另一方倒计时,另一方的思考时间不能超过倒计时的时长。行棋前,智能棋盘会根据棋子所处的位置及其类型,对所有的棋子展开编码处理,任何棋手完成一步行棋后,棋盘都会再次进行扫描棋子的位置码和种类码并及时更新,直到本局对垒结束。

由于篇幅关系本文主要探讨棋盘的软件设计。

1   棋盘棋子编码

为了使棋盘设计更加人性化,更加方便选手完成比赛,也为了使棋盘更加的人性化,将棋盘及棋子根据其位置进行了编码,中国的象棋棋盘如图1所示,有横9,纵10,共计90个格,交叉点为90个。红黑双方交替行棋,每人轮流走一步,可走棋、可吃棋,将帅吃掉为赢。

image.png

图1 象棋初始棋盘

1.1 棋盘坐标编码

为了清楚知道下棋过程中,每个棋子行走的位置,先将棋盘的每个格进行编码,本着通俗易懂,易于理解的原则,将棋盘编码。

中国象棋中共有7种棋子,红黑双方棋子对称,这样将棋子按照种类进行编码,如表1所示,这样编码的好处就是,因为红黑双方棋子初始状态完全一样,只需判断正负符号就可以判断处棋子是哪一方的,0即为无棋子,空格。

表1 棋子种类编码

红帅

红车

红马

红炮

红相

红士

红兵

无棋子

1

2

3

4

5

6

7

0

黑将

黑车

黑马

黑炮

黑象

黑士

黑卒


-1

-2

-3

-4

-5

-6

-7


1.2 棋子个体编码

编码完棋盘、定义完棋子种类,则需要将棋盘坐标与棋子个体进行一一对应,先将棋子个体进行编码,如表2所示,注意“0”为无棋子,其中车、马、炮、士、象双方均为两个,故占用两个编码,兵双方各占用五个。

表2 棋子个体编码

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

无棋子

黑将

黑车

 

 

黑马

黑炮

黑士

黑象

黑兵


17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32


红帅

红车

红马

红炮

红士

红象

红卒

1.3 棋盘索引数组

棋盘索引数组是将棋子种类编码与棋盘坐标编码有机的结合在一起,能够完成根据棋手走的每步棋子进行调用修改,并储存到单片机程序当中去,这里的数组代表的是棋子的位置以及移动的位置,数组的编码即表示棋子的实际位置。

这里引用的为一维数组,此数组简单方便,运算较少、方便调用,并且比较直观。中国象棋的初始局面下,棋盘索引数组如下所示:

Boardlndex[90]={-2,-3,-6,-5,-1,-5,-6,-3,-2

0, 0, 0, 0, 0, 0, 0, 0, 0,

0,-4, 0, 0, 0, 0, 0, -4, 0,

-7,0, -7, 0, -7,0, -7, 0, -7,

 0, 0, 0, 0, 0, 0, 0, 0, 0,

0, 0, 0, 0, 0, 0, 0, 0, 0,

7, 0, 7, 0, 7, 0, 7, 0, 7,

0, 4, 0, 0, 0, 0, 0, 4, 0,

0, 0, 0, 0, 0, 0, 0, 0, 0,

2 3 6 5 1 5 6 3 2,}

棋盘使用之前还要经过下面三个步骤[3]。

1)使用前先将所有棋子初始化:

void Initchessman();//初始化所有棋子,以及坐标

2)然后定义象棋棋子的结构体

struct Chessman

{

char name[10];

ID3DXMesh*mesh;

D3DXVECTOR3 pos;

Bool Alive;

IDirect3DTexture9*texture;

POINT coord;

};

Coored为棋子在数组中的坐标,数组Chessman*ary[10][9]为相应棋盘所在的位置,pos为空间位移,alive是棋子存活,mesh为每个棋子指向的指针,name是名字;其他除了chessman指针以外的部分为空格null。

3)规则设定绘制

在使用时,为了正确的选取棋子,让棋子能够按照规则正确的行走,调取了如下函数:

①RayGetPickRay(int,int);//获得选取射线;

②void InitChessman();//初始化所有棋子,以及坐标,

③bool IsMovingOk(int,int);//是否能行走到某一个点上;

④bool GetPlanePickPoint(D3DXVECTOR3,D3DXVECTOR3,Ray);//通过拾取射线与棋盘,从而得到拾取点;

⑤bool PickChessman(Ray);//是否拾取棋子;

2 下棋子程序设计

当棋手开始下棋时,下棋使用的程序共分为:走棋程序、吃棋程序、行棋规则。三种程序同时调用,下面以我方走马和走车分别为例进行说明。

2.1 帅行棋设计

帅的行棋规则实现方法与前面车和马类似。首先是否符合行棋规则,行棋范围为九宫格内部,帅每步只能走一步,可上可下可左可右。然后判断走棋还是吃棋,中间出现不符合行棋规则的地方则报警,如图2所示。

image.png

图2 帅行棋图

帅与将行棋规则一样编程原理如图3所示。

image.png

图3 将和相行棋程序框图

程序如下:

if(toY>2||toX<3||toX>5){//出了九宫格

Return false;

}

if((Math.abs(fromY-toY)+Math.abs(toX-fromX))>1){//只能走一步

return false;

}

2.2 象行棋规则

象的行棋规则与士和马类似,象不能过河,存在蹩象眼的情况,象行走田字,即象只能够跨格走斜线,象只能走到田字格对角线三个位置上,而不能走到其他位置[4-5]。当棋手走象时,步骤如下。

1)根据是否仅有一个子动作判断调用走棋程序还是吃棋程序。

2)若仅有一个子动作则调用走棋程序。

3)再根据行棋规则判断是否符合象的行棋规则,判断方法为横纵坐标中横和纵向分别移动两格,如不符合则报警。

4)如果没有犯规记录则自动将象的程序编码及移动位置进行储存。

5)若有两个棋子位置发生改变,则判定调用吃棋程序,当棋手吃完棋后,再根据行棋规则判断是否符合,如若不符合则自动报警。

6)如果没有犯规记录则自动将象的程序编码及移动位置进行储存。

7)同时要注意根据事先设定的程序,吃棋时需要先拿起自己的子再去拿对方的子。

所以其程序如下所示:

if(toY>4){//不能过河

return false;

}

if((Math.abs(fromX-toY)!=2||Math.abs(fromY-toY)!=2){//象走田字

return false;

}

if(qizi[(fromY+toY)/2][(fromX+toX)/2]!=0){

return false;//象眼处有棋子

}

2.3 兵行棋规则

兵的行棋规则比较简单,与帅类似,每次只能走一步。同时也要判断行棋还是吃棋。行走范围不同:过河之前只能直走,而过河之后可以走到任意一格。过河之前只能向前走,过河之后可以向左右前三个方向行走,不过不可回头。

兵与卒行棋规则相同,不再累述。

3   结语

本次智能棋盘设计,可在硬件上选用较为常见的单片机进行配置,并且性能稳定,操作简单,方便,整体电路搭配较为完善。

由于篇幅的限制笔者并没有给出所有棋子的编译程序和逻辑图,仅列出了帅士相三种棋子的行棋程序,本论文作为一项智能系统的研究的理论与尝试,想投入实际的应用还有一些技术难点。随着软件设计技术,微电子技术,和相关技术的发展。此课题还会不断完善,不断改进,最终实现功能上的不断更新。

参考文献

[1] 孙传友,等.感测技术与系统设计.北京:科学出版社,2004.

[2] 浦昭邦.光电测试技术.北京:机械工业出版,2004.

[3] 秦维佳,侯春光,等.C/C++程序设计教程.北京:机械工业出版社,2007.

[4] 向红.51系列单片机应用与实践教程.北京:北京航空航天大学出版社,2008.

[5] BARRY B B. The Intel Microprocessors.6th ed.2005.

(本文来源于《电子产品世界》杂志社2021年2月期)

关键词: 中国象棋 单片机 智能系统 程序编码 202102

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW

或用微信扫描左侧二维码

相关文章


用户评论

请文明上网,做现代文明人
验证码:
查看电脑版