国际象棋棋子代码(如何用代码创造出令人惊叹的国际象棋棋子)
使用位字段和掩码是不用数据结构组合数据的常用方法。

假设你在用 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
【温馨提示】如果文章内容有帮助到您,别忘动动小手指分享给好友哦!
相关文章
-
java的中国象棋小游戏的代码
本文实例为大家分享了java实现象棋小游戏的具体代码具体内容如下 *中国象棋Java版V3.0 *定义中国象棋规则的类 //大于起点、小于终点的坐标就可以知道中间是否有棋子 //大于起点、小于终点的坐标就可以知道中间是否有棋子 //大于起点、小于终点的坐标就可以知道中间是否有棋子 //大于起点、小于终点的坐标就可以知道中间是否有棋子...
2024-03-06 阅读 (261) -
象棋的编程代码公开
这篇文章主要为大家详细介绍了C语言实现——《中国象棋项目》,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下!中国象棋是由两人轮流走子,在战法上遵循古代孙子兵法中的“不战而屈人之兵,善之善者也”的作战思想,以“将死”或“困毙”对方将(帅)为胜的一种二人对抗性游戏。对局时,由执红棋的一方先走,双方轮流各走一招,直至分出胜、负、和,对局即终了。
2025-01-24 阅读 (234) -
象棋代码Java炮的走法
但是我选择背道而行,不是因为别的,是为了更好的去让初学者理解,我们把原本的x坐标看成数组的列(col),把y坐标看成我们数组的行(row),这样是不是更好理解一点呢,当然了我就是这么理解的,哈哈,接下来的游戏代码编程我们会把横坐标用y*width,纵坐标用x*height你们应该就能理解为什么了,因为x是数组的行,也就是坐标纵坐标(y)的体现,同理数组中的y也是如此。
2025-02-07 阅读 (194) -
中国象棋代码如何编scratch
include include #includeint x,y,i,j,k,p,q, num = 1, round; //象棋游戏的全局变量int place_x1 = 0,place_y1 = 0,place_x2 = 0,place_y2 = 0;int check_x,check_y,check_turn; //基本参数char ch, turn = 'O',turn1 = 'N',temp,temp1;char check_1 ={"车","马","象","士","将","炮","兵...
2024-10-16 阅读 (179) -
ubb代码链接怎么使用
注意:动态棋局中可以导出适用于各类论坛、博客、网站的代码,如UBB代码、frame代码、QQ空间代码等,但经过测试,本站只支持与新浪网易博客相类似的代码,所以导出时务必导出第三行的第一个链接的“新浪网易”!②修改棋局的名称,棋局的名称默认情况下是原使用的棋局的名称,需要改成你自己的棋局的名称,修改代码[DhtmlXQ_title]和[/DhtmlXQ_title]之间的文字,例如[DhtmlXQ_title]您的棋局名称[/DhtmlXQ_title],请务必修改棋局名称,因为此名称会出现在发表后的棋局的
2024-03-11 阅读 (168) -
人机对战象棋代码(谁将成为棋盘上的霸主?人机对战象棋代码大揭秘!)
中国象棋软件的发展和成熟,比国际象棋软件要晚一些。象棋软件的发明大概是2001年前后。最早成型的象棋软件,是中山大学的研究生涂志坚研发的“纵马奔流(zmbl)”象棋软件。发明者涂志坚拿着原创去参加第8届电脑奥林匹克大赛,以6胜2和的绝对优势轻松夺冠,据说此软件已经达到了普通象棋大师的水准。有了“纵马奔流(zmbl)”开的先河,后面的象棋软件像潮水开了闸般涌来:象棋世家、棋隐、象棋奇兵、棋天大圣、旋风、名手、天机、小虫等等,层出不穷,几乎每隔一段时间就会有新的软件版本面世。
2023-10-16 阅读 (166) -
ubb代码用什么软件下(寻找最佳工具,让 ubb 代码编辑更轻松)
使用windows的所有人相信都用过系统自带的记事本工具,通常情况下使用它进行简单的文字编辑记录保存,或者是直接用来打开txt文本文档。但是系统记事本功能实在是太基础了,很难满足稍高需求用户。我今天就向大家推荐一款完美替换系统记事本的软件——notepad3,体积小、内存占用小,支持行标记、自动补全、自定义外观方案、正则表达式等等功能,建议大家把notepad3作为win系统的装机必备记事本软件
2023-11-12 阅读 (161) -
象棋的编程代码公开(如何编写一款智能象棋 AI,实现人机对战)
摘要:2016 年,alphago 一连战胜多位人类职业围棋选手,从此一炮而红,各种下棋机器人近几年也层出不穷。那么,你是否想过要自己做一个呢?链接:serge zaitsev在这篇文章中,我们来尝试将国际象棋引擎sunfish(https://github.com/thomasahle/sunfish)
2023-09-26 阅读 (113) -
象棋代码HTML+js加入人机(如何打造一款让人惊艳的象棋 AI,与 HTML+js 共战棋盘)
2022年10月22日,商汤科技“元萝卜senserobot”ai下棋机器人与中国象棋特级大师、有着“东方电脑”之称的柳大华,以及中国象棋大师曹岩磊,在深圳湾科技生态园上演了一场“楚汉之争”。南都湾财社记者在现场获悉,对决最终以一场奕和、一场ai机器人获胜告终。6年前,备受瞩目的阿尔法围棋与李世石的“人机大战”,把人工智能技术和围棋双双推上全球热点,如今,“人机大战”来到“楚河汉界” 。
2023-09-10 阅读 (92) -
java制作简易计算器代码(如何用 Java 编写一个简单易用的计算器)
哈喽大家好,这里是java小白成长记!在今天的内容开始之前,先和大家聊几句。很感谢大家看了我的内容发表的评论,我说过评论我会回复,可是没想到新人没有回复的权限!真的太不好意思了,不过大家的评论我都看了,谢谢大家的指责与鼓励,我会继续努力的,争取给大家带来更好的文章。我在这里分享java,可是我却是个java小白,我的初心也不是来这里教学java,只是想分享自己学到的一些小知识,以及作为新手遇到的一些问题,如果内容有不合适的地方,欢迎大佬前来指教,我一定虚心接受。
2023-11-03 阅读 (89)
