python - 以位存储扑克牌的更有效方法?

标签 python bit-shift playing-cards

我目前正在帮助教授计算机编程类(class)。 (我在高中高年级,为我的计算机编程老师助教。)现在学生们正在学习按位运算符,但一些更高级的学生正在问我如何使用位和按位运算来将数据存储在位中。到目前为止,我们所做的非常简单,但有效地提供了 50%(给予或采取 5%)的压缩率。我们拿我们的扑克牌(假设是方 block 八)将其转换为 7 位值 0b1011000。这适用于所有通用扑克牌 Ace - King 以及所有花色,您只需将位(或整数)放入函数中,您就会得到一张扑克牌。

这是他们迄今为止的成果。

0b1 SS VVVV

0b1 使所有“扑克牌翻转位”保持一致的长度。

SS是花色值

VVVV是卡值

这是他们如何形成自己的位

suits = ['Hearts','Diamonds','Spades','Clubs']
ranks = ['Ace','Two','Three','Four','Five','Six','Seven','Eight','Nine','Ten','Jack','Queen','King']

为此,让我们使用钻石 jack

第 1 步:分离套装并转换为 bis。 “花色位”等于二进制花色的索引号,因此方 block 将是 0b01 或 0b1

第 2 步:将你的花色位左移 4 位。 0b01 -> 0b010000

第 3 步:分离 Rank 并转换为位。 “排名位”等于二进制中花色编号的索引,因此 Jack (11) 将是 0b1011

第 4 步:将您的等级位添加到您的花色位中。 0b010000 + 0b1011 = 0b011011

步骤 5. 将组合的排名\套装位添加到 0b10000000,以使所有值的长度保持一致。 0b011011 + 0b1000000 = 0b1011011

在一副完整的牌中(所有 52 张牌,没有 clown ),牌名中有 741 个字符。 转换为位的整副牌以 364 位存储,压缩率为 49%,同时仍保留 100% 的数据。

我想知道是否有更有效的方法来存储这些数据。我才学计算机编程二年级,而且只有高中学历,所以我自己对这方面不太了解。

这是他们的代码 http://repl.it/BA56

最佳答案

另一种方法是为每张卡指定一个从 1 到 52 的数字

定义颜色顺序(例如 Belote 纸牌游戏中定义的颜色顺序)可能会很有趣。

所以: 0 = 1 俱乐部 1 = 2 俱乐部 ... 12 = 俱乐部之王 13 = 1 颗钻石 ... 等等。

通过颜色顺序可以轻松地将 1 到 52 之间的任何数字映射到卡片上。

最后你只需要从 1 到 52 的数字来代表整个纸牌游戏。即从“000000”到“110001”的数字,卡上只有 6 位。

就大小而言,它与您使用的系统相当,并且我认为您无法通过卡将其减少超过6位。

关于python - 以位存储扑克牌的更有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31852353/

相关文章:

c - 为什么位移运算符使我的哈希函数如此快?

c++ - 使用 C++ AI 引擎和 ASP.NET C# 页面的纸牌游戏

c++ - 用于防止重复和语法错误问题的 boolean 数组?

python - 不需要输入的字典中的所有键

python - 分配到列表列表中的位置

java - 如何简化这个二进制到java类型的代码?

c - 为什么先左移然后右移,而不是 AND 运算?

python - Django:如何为 MySQL 数据库设置正确的位置

python - 如何使用FixedLengthRecordReader读取Tensorflow中的自定义数据格式?

python - 如何解决在 python 中使用 unicode 打印扑克牌的问题?