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

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

国际象棋棋子代码

假设你在用 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 阅读 11617
  • 美女说下象棋啥意思怎么回答

    美女说下象棋啥意思怎么回答

    这个故事有个梗的哦,昨天一朋友带他女票去骑马,没骑多久,他女票就把马放走了,他一脸不解的问她:“怎么啦?”女票说:“你会下象棋嘛?”朋友答:“会啊?怎么了?”最后女票甩头回家了,到现在都没理他。你会下象棋吗?说实话普通人哪里能想到这有什么内涵意思啊,但是这个单独问出来了,安族小编掐指一算,自然是不一般的,那么女生问你会下象棋吗什么意思?

    销魂飞刀 2024-03-08 阅读 7013
  • 象棋洪智公开承认的老师

    洪智在直播中说过,他7岁开始学下棋,和哥哥都是受到父亲的影响而学棋,启蒙老师是父亲洪峰。年少时,杀遍武汉棋摊,在业余棋坛中成长起来。洪智,中国象棋男子特级大师,雅号 洪天王、乱战天王,全国象棋个人赛冠军。洪智的棋风泼辣刚猛,喜好攻杀,具有中局功力强大,尤其擅长搏杀。至于柳大华老师,洪智明确否认是其老师,当时在湖北队的时候,洪智已经成名,并未得到特别指导。

    销魂飞刀 2024-09-24 阅读 4663

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

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

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

    销魂飞刀 2023-11-04 阅读 4404
  • 象棋开局必胜的15种走法棋谱

    象棋开局必胜的15种走法棋谱

    开局第一步,就奠定了象棋全局的走法思路,因此,我们通常以走的第一步棋命名象棋的布局阵名。最常用的象棋开局阵法有以下几种:第一步进三兵或者七兵,称为仙人指路,由于早晚都要进三、七兵,所以起手进兵有试探的意图,先看对方出招,再用相应的克制招数进行布局,因此,用仙人指路的人一般都是高手,可以后发制人。试探式走法多在高手中使用,如悟此道,棋力定能上一个台阶,此是后话,关注莫愁象棋以后会进行讲解。

    销魂飞刀 2024-10-12 阅读 3711