我有一场比赛.屏幕上将随机显示5种符号.如果屏幕上有3个或更多相同符号,则玩家赢得一些钱.
举例来说,如果我有符号A,B,C,D,E,和F.
F 可以替代任何其他种类的符号(通配符).
因此,当AAABC或AFABB在屏幕上出现,这意味着我赢得了3-A胜利.如果AAFBB屏幕上出现,这意味着我赢得既是一个3-A和3-B赢.
现在我有一个关于屏幕上显示内容的数组; 我需要找到一种足够快的方法来检测游戏结果.
我现在有这个方法:
我给一个代码,每一个符号:A -> 1,B -> 2,C -> 3,D -> 4,E -> 5,F -> 0xF.
就像我有一个数组:{A,B,C,D,E}我将它们转换为屏幕代码:0x12345.
然后我列出了获胜面具:
0x11111
0x22222
0x33333
0x44444
0x55555
0x11110
0x01111
0x22220
...
0x00111
0x01110
0x11100
Run Code Online (Sandbox Code Playgroud)
我使用屏幕代码,做&每个掩码代码,就像0x111f1 & 0x11111 == 0x11111,然后我知道我有一个5-A胜利.
有人有任何其他技巧吗?
作为ilent2笔记,您目前使用的方法实际并不起作用,因为符号申述你使用不按位分离的(如A = 1,B = 2和C = 3中断,因为A | B = C).
解决这个问题的直接方法是每个位置使用5位,并使用:
A = 0x01 (0b00001)
B = 0x02 (0b00010)
C = 0x04 (0b00100)
D = 0x08 (0b01000)
E = 0x10 (0b10000)
F = 0x1F (0b11111)
Run Code Online (Sandbox Code Playgroud)
但是,通过将每个符号表示为在四位字段中设置的两个位,有一种聪明的方法,因为有6(= 4 x 3 ÷ 2)种可能的组合:
A = 0x3 (0b0011)
B = 0x5 (0b0101)
C = 0x9 (0b1001)
D = 0x6 (0b0110)
E = 0xA (0b1010)
0xC (0b1100) - unused, but available for one more symbol
F = 0xF (0b1111)
Run Code Online (Sandbox Code Playgroud)
这样,任何两个符号的按位AND或OR永远不是另一个有效符号.
就检测匹配而言,您已经使用的方法是在正确的轨道上.利用位移来检测多个位置的匹配,而不是为每个组合分别设置模式.