foboy 发表于 2011-2-4 02:06:42

公布3个牌类游戏常用的内存表示方式 顺便出个小题

本帖最后由 foboy 于 2011-2-4 02:09 编辑

首先声明:本文每个字都是用键盘敲打出来的。
做了一段时间的棋牌类辅助程序,到目前为止,所有接触过的内存中表示游戏牌面的方式不外乎以下三种:
1. 16进制高位代表花色,低位代表数值。例如:
方框的13张牌在内存中是: 0x01 0X02 0X03 0X04......0X0D
黑桃的13张牌在内存中是: 0X11 0X12 0X13 0X14......0X1D
红桃:0X21 0X22 0X23 0X24....0X2D
梅花:0X31 0X32 0X33 0X34....0X3D
采用这种方式 的游戏内存地址比较容易找,根据每次出牌的差值搜索即可。
2. 与第一种方式相反,低位代表花色,高位代表数值。例如:
方框的13张牌在内存中是: 0x10 0X20 0X30 0X40......0XD0
黑桃的13张牌在内存中是: 0X11 0X21 0X31 0X41......0XD1
红桃:0X12 0X22 0X32 0X42....0XD2
梅花:0X13 0X23 0X33 0X43...0XD3
这种方式是我最近发现的。当时找了很久都找不到。后来没办法,只有试着观察牌面可能出现的内存区域,才找到了。说起来比较幸运。如果运气不好,要想在那么多内存中发现这玩意恐怕几天几夜不吃饭也找不到。
3. 54张牌对应连续的54个数值,采用这种方式的游戏内存也比较容易查找,查找方法和第一种方式的一样。
在这里顺便出个小题,有个叫百家乐的游戏,是比点数大小的。如果牌面大于等于10就算0点,10以内的就是牌上是几就算几点。每个玩家三张牌,比谁的点数大。当三张牌的点数相加大于9时,只取个位数。
例如:你拿的牌是 7 8 9, 我拿的是 2 10 11(J)
你的点数: 7+8+9=24 取个位数是4点
我的点数: 2 +0+0=2 是2点
现在以第一种内存表示方式为例,要计算点数,首先要把每张牌转换成对应的点数。例如:0x31=1点 0x2A=0点 0x36=0点 0x0B=0点
现在考的是这种转换方法。这是个很简单的问题,不过实现起来有很多种方式。大家可以找出最简洁最有效率的那一种。
目前我用的是:(为了不影响大家思路,设置为回复可见)
**** Hidden Message *****
高手切莫取笑俺出这么小儿科的问题。估计大家更关心的是关于内存及内存基址的查找,内存操作等问题。等有时间了我会
根据自己的经验写个例子。目前俺也属于菜鸟级别,只初步掌握了内存的查找和操作。OD和call则还出于一窍不通的程度。

风行者 发表于 2011-2-4 03:55:06

先收藏,慢慢看

chenronting 发表于 2011-2-4 19:15:34

我的话, 会把10或10以上的, 先赋值为0, 这样再计算吧。呵呵, 不知道你的思路如何

chenronting 发表于 2011-2-4 19:17:19

其实牌的数值就那么 几十个, 每个都把值赋掉, 也就开头赋值一下而已吧。不算太麻烦

pusofalse 发表于 2011-2-4 19:49:26

取末尾4位,并判断是否大于10。

**** Hidden Message *****

foboy 发表于 2011-2-4 20:47:03

本帖最后由 foboy 于 2011-2-4 20:48 编辑

回复 5# pusofalse


    看来老兄喜欢位操作。肯定学汇编的{:face (303):}。
将条件的真假作为乘数俺也喜欢。

刘十九 发表于 2011-2-21 06:06:55

嗯,看看隐藏的内容

3mile 发表于 2011-2-21 12:42:22

mod(变量,10)

wua0550 发表于 2011-2-23 03:08:02

留名学习~~~~

masterpcc 发表于 2011-2-23 08:57:59

学习!谢谢分享!!

binshiwo 发表于 2011-2-23 16:18:01

學習,收藏了!

xzxnovice 发表于 2011-2-23 22:53:45

看盾{:face (456):}
页: [1]
查看完整版本: 公布3个牌类游戏常用的内存表示方式 顺便出个小题