国际象棋棋子代码(如何用代码创造出令人惊叹的国际象棋棋子)

使用位字段和掩码是不用数据结构组合数据的常用方法。

国际象棋棋子代码

假设你在用 c 语言写一个国际象棋游戏。追踪棋盘上棋子的一种方法是定义一个结构,该结构定义了棋盘上每个可能的棋子及其颜色,因此每个格子都包含该结构中的一个元素。例如,你可以将结构定义成下面这样:

struct chess_pc { int piece; int is_black;}

有了这个数据结构,你的程序就会知道每个格子里是什么棋子及棋子的颜色。你可以快速识别出棋子是兵、车、马、象、后还是王,以及棋子是黑还是白。但是,有一种更直接的方法来跟踪这些信息,同时只用更少的数据和内存。与为棋盘上的每个方格存储两个 int值的结构不同,我们可以存储单个int值,并使用二进制位字段和掩码来标识每个方格中的棋子和颜色。

比特和二进制

当使用位字段表示数据时,我们最好像计算机一样思考。让我们从列出可能的棋子开始,并为每个棋子分配一个数字。让我们进入下一个步骤,用二进制表示这个数字,也就是按照计算机追踪它的方式。记住,二进制数是由比特组成的,比特要么是 0,要么是 1。

  • 00000000:空(0)
  • 00000001:兵(1)
  • 00000010:车(2)
  • 00000011:马(3)
  • 00000100:象(4)
  • 00000101:后(5)
  • 00000110:王(6)

要列出一个棋盘上的所有棋子,我们只需要三个比特从右到左依次代表值 1、2 和 4。例如,数字 6 是二进制的 110。6 的二进制表示中的其他所有位都是 0。

一个聪明一点的方法:我们可以使用那些额外的总是为零的比特来跟踪一个棋子是黑还是白。我们可以使用数字 8(二进制 00001000)来表示棋子是否为黑色。如果这一位是 1,则代表该棋子是黑色;如果是 0,则代表该棋子是白色。这被称为位字段,稍后我们可以使用二进制掩码将其取出。

用位字段存储数据

要编写一个使用位字段和掩码的国际象棋程序,我们可以从以下定义开始:

/* 棋子 */define pawn 1 // 兵define knight 3 // 马define queen 5 // 后define black 8 // 黑define piece 7

当你为一个棋格赋值时,比如初始化棋盘,你可以赋一个 int类型的值来跟踪棋子及其颜色。例如,要在棋盘的0,0位置存储棋子黑车,你可以使用下面的代码:

 int board[8][8];.. board[0][0] = black | rook;

|是二进制“或”(or)操作符,这意味着计算机将合并两个数字的比特。对于每个比特的位置,如果任意一个数字的比特为 1,该位置比特的结果也是 1。black的值(8,即二进制下的00001000)和rook的值(2,即二进制下的00000010)的二进制或结果是二进制下的00001010,即 10:

 00001000 = 8 or 00000010 = 2 ________ 00001010 = 10

类似地,要在棋盘的 6,0位置存储一个白色兵,你可以这样做:

 board[6][0] = white | pawn;

这样存储的值就是 white(0)和pawn(1)的二进制或的结果,也即是 1。

 00000000 = 0 or 00000001 = 1 ________ 00000001 = 1

用掩码获取数据

在下棋过程中,程序需要知道棋格中的棋子和它的颜色。我们可以使用二进制掩码来分离这部分。

举个例子,程序可能需要知道棋局中棋盘上特定棋格的内容,例如位于 board[5][3]的数组元素。这个是什么棋子,是黑的还是白的?为了识别棋子,使用二进制“与”(and)操作符将元素的值与掩码piece结合起来:

 int board[8][8]; int piece;.. piece = board[5][3] piece;

二进制“与”(and)操作符()将两个二进制值结合,这样对于任意位,如果两个数字中的那个位都是1,那么结果也是 1。例如,如果board[5][3]的值是 11(二进制下的00001011),那么 11 和 掩码piece(7,二进制下的00000111)二进制与的结果为二进制下的00000011,也即 3。这代表马,马的值是 3。

 00001011 = 11and 00000111 = 7 ________ 00000011 = 3

解析棋子的颜色是一个简单的事情,只需要将棋子的值与 black位字段进行二进制与操作。比如,你可以写一个名为is_black的函数来确定棋子是黑还是白:

intis_black(int piece){ return (piece black);}

之所以可以这样,是因为 black的值为 8(二进制下的00001000)。在 c 语言中,任何非零值都被视为true,零总是false。所以如果5,3处的棋子是黑色的,则is_black(board[5][3])返回 true 值(8);如果是白色的,则返回 false 值(0)。

位字段

使用位字段和掩码是不使用结构组合数据的常用方法。它们值得被程序员收藏到“工具包”中。虽然数据结构对于需要跟踪相关数据的有序编程是一种有价值的工具,但是使用单独的元素来跟踪单个的开或闭值(例如棋子的颜色)的效率较低。在这些情况下,可以考虑使用位字段和掩码来更高效地组合数据。

via: https://opensource.com/article/21/8/binary-bit-fields-masks

【温馨提示】如果文章内容有帮助到您,别忘动动小手指分享给好友哦!

相关文章

  • 象棋美女唐丹和谁结婚了(唐丹这位象棋美女与谁共筑棋盘人生)

    象棋美女唐丹和谁结婚了(唐丹这位象棋美女与谁共筑棋盘人生)

    大家知道象棋界唯一的特级大师夫妻是谁吗?很多人可能第一想到的是吕钦、许银川等大佬。实际是另一对来自广东的情侣,他们就是许国义、陈丽淳。本篇的主人公女子棋后陈丽淳,一直有唐丹克星之称。在陈丽淳还没有夺得全国冠军之前,对上唐丹就特别来劲,86年出生的她,多次在唐丹的手下,拿下各种胜利。印象最深的有一次,陈丽淳马炮卒竟然击败了唐丹的马炮双兵,也是厉害了。

    销魂飞刀 2023-11-17 阅读 6691
  • 老梁说象棋名家各自特点(老梁揭秘,象棋名家们独特的棋艺风格,你了解多少)

    老梁说象棋名家各自特点(老梁揭秘,象棋名家们独特的棋艺风格,你了解多少)

    洪智胡荣华蒋川刘锦祺(左)霍文会(右)这位就是柳大华 当年的象棋五冠军广东名将吕钦孙勇证陶汉明等级分第一的王天一谢靖徐天红许银川特大张强特大张强许银川赵鑫鑫特大郑惟桐庄玉庭也许大家没见过这位,下面简单介绍一下这位就是《棋艺》杂志编辑部主编张志强老师。《棋艺杂志》是梁宏达老梁创办的。经过几经发展,现在已经风风火火。

    销魂飞刀 2023-11-04 阅读 3512
  • 中国象棋棋力最强的软件是什么(探寻中国象棋软件之巅——谁才是棋力最强的霸主)

    中国象棋棋力最强的软件是什么(探寻中国象棋软件之巅——谁才是棋力最强的霸主)

    本文从以下6个部分来全方位介绍中国象棋软件的来龙去脉:第一,中国象棋软件的发展简史第二,中国象棋软件的地球排名第三,人类与象棋软件实力差距第四,中国象棋软件展望和弱点第五,理性看待纯人和棋软下棋第六,如何分辨象棋软件主播第一部分:中国象棋软件的发展简史90年代中期,已经有中国象棋软件,此时的象棋软件非常粗糙,比如电脑的大局观差、开局不行、喜欢吃子、弃子取势分不清等等,县市级的棋手都可以轻松胜之。

    销魂飞刀 2023-11-16 阅读 1876
  • 中国象棋2017打不开(无法打开2017年的中国象棋)

    中国象棋2017打不开(无法打开2017年的中国象棋)

    天天象棋是一款多人在线的手机象棋游戏。那么电脑如何安装天天象棋呢?有两种方法可以让你在电脑上玩天天象棋。天天象棋方法一:如果电脑上有安装电脑管家1、打开电脑管家电脑管家2、打开软件管理,搜索:天天象棋搜索天天象棋3,点击安装。因为天天象棋是手机软件游戏,所以自动安装时会安装腾讯手游助手,所有功能与手机版天天象棋无二,但对于对电脑不太熟悉的朋友,可能有些麻烦。

    销魂飞刀 2023-11-13 阅读 1789
  • 山东象棋大师名单(山东象棋大师名单,谁是全国最强的山东象棋大师)

    山东象棋大师名单(山东象棋大师名单,谁是全国最强的山东象棋大师)

    今年,象棋的大战举办的较少,受到多重因素的影响,鲜有大的赛会。这不,在山东棋界,举行一项红强杯的大战,不限制参赛的棋手属地和人数,报名参战的棋手众多,多位大师、名手都齐聚于此。比赛奖金数万元,众多的棋坛特级大师、国家大师,以及业余杀手,省市冠军,全力拼杀,采取七轮积分制,单日内赛罢,闪电对决。结果经过激烈的比拼,来自山东的象棋省冠级好手赵勇霖扮演黑马角色,他以七战4胜3平积13分的战绩勇夺桂冠,称霸群雄。

    销魂飞刀 2023-11-13 阅读 1428