首先,我想指出,这是服务器端的Node.js代码,而不是普通的客户端Javascript。我不想使用jQuery,但是使用任何本机Node.js方法(如果有可能有用的话)都可以。
这是纸牌游戏中机器人玩家的代码。机器人的卡片结构如下:
[ '9H', '10S', 'KD', '9D', '7D', 'QC', 'JC', '7C' ]因此,这8张卡中的每一张都是作为value+suit字符串给出的。这是不能更改的,因为整个应用程序都使用这个结构。
现在,机器人必须分析这只手来寻找特定的卡片组合。例如,它应该找到任何“第三国王”(至少有两张同一套西装的两张较小的卡)、“第二张十张”(同一套西装中至少有一张小卡的皇后)或“第三皇后”。
在上面的例子中,它应该提出:钻石的第三王和俱乐部的第三皇后。
我正在考虑实现一个搜索算法来找到这些组合,但我担心这会非常低效。我的第一个想法是遍历数组,找到所有的国王、王后和10,并将这些数据保存在某个地方,然后再迭代一次,计算出我们有多少其他相同的卡。例如,对于国王:
var kingsuits = [];
for(var i=0;i<8;i++){
if(hand[i].substr(0,1) == "K")
kingsuits.push(hand[i].substr(-1));
}
//now kingsuits has the suits of all kings, and we can go through our hand again and check how many cards we have in each of these suits...我的问题是,是否有更有效的方法来实现这一点?问题是,还有很多其他的组合也需要寻找,而不仅仅是我上面提到的例子。
此外--也许更重要的是--如果我们找到一个“第三国王”,我们根本不需要寻找“第三皇后”或“第二国王”。这些组合有一个清晰的层次结构,所以如果我们找到第一个组合,我们根本不需要关心其他的组合。
发布于 2014-03-07 13:32:07
使用二维hashmap或数组或其他类型的直接访问数据结构,其中存储特定类型的(布尔型)或多少(int)卡。例如:
[ '9H', '10S', 'KD', '9D', '7D', 'QC', 'JC', '7C' ]
=>
| A K Q J 10 9 8 7 6 5 4 3 2
--+--------------------------------------
C | 0 0 1 1 0 0 0 1 0 0 0 0 0
D | 0 1 0 0 0 1 0 0 0 0 0 0 0
H | 0 0 0 0 0 1 0 0 0 0 0 0 0
S | 0 0 0 0 1 0 0 0 0 0 0 0 0这应该允许相当快速和简单的搜索结构-通过循环你可以快速识别有多个九,和有2俱乐部卡旁边的俱乐部女王。
不管您是为黑桃选择一个对象还是一个数组,哪个(适合还是值)是第一维度还是第二维度,这并不重要。对于值,您将需要使用数组来获得定义的顺序,即使映射(例如A->0,K->1,…)2->12)是非常规的。
发布于 2014-03-07 13:01:57
一种快速的解决办法是首先快速地将手按西装/号码顺序排序,即:
[ '9H', '10S', '7D', '9D', 'KD', '7C', 'JC', 'QC' ]然后,通过单张单子,追踪迄今发现的一套西装中最长的牌序,例如:
var lastCard
var currentSequence
var bestSequence
for card in cards:
if suitOf(card) = suitOf(lastCard) and numberOf(card) = numberOf(lastCard) + 1:
append to currentSequence
else:
if currentSequence better than bestSequence:
bestSequence = currentSequence
clear currentSequence当您找到“最佳”序列时,可以很容易地中止搜索。
发布于 2014-03-07 13:36:41
由于有很多关于您正在搜索的内容的未知信息,所以简单地对卡片进行排序就足够了,但是您可以考虑在对象(哈希表)中安排卡片,以便快速查找这些条件。
function value(s) {
return s.substr(0, s.length - 1)
}
function suit(s) {
return s.substr(-1)
}
function search(arr) {
var suits = {
S: {},
C: {},
D: {},
H: {}
}
var count = {
S: 0,
C: 0,
D: 0,
H: 0
}
for (var i = 0; i < arr.length; i++) {
var card = arr[i]
var s = suit(card)
var v = value(card)
suits[s][v] = true
count[s]++
}
// hunt in the structure here
}这将允许您获取第三皇后,例如:
var thirdQueens = ["S", "C", "D", "H"].map(function (s) {
var hash = suits[s]
if (hash.Q && count[s] - (hash.K ? 1 : 0) >= 3) {
return "Q" + s
}
}).filter(function identity(x) { return x })https://stackoverflow.com/questions/22249959
复制相似问题