1

我有以下代码:

while rounds<=5
    fprintf('Rolling the dice...\n');
    roll=randi(6,1,5);
    roll=sort(roll);
    fprintf('You rolled:');
    disp(roll);
    rollCount=rollCount+1;

    for x=1:2:17
        y=all(ismember(roll,rule{x}))
        disp(ismember(roll,rule{x}));

        z=all(ismember(rule{x},roll))
        disp(ismember(rule{x},roll));
        rounds=rounds+1;
    end
end 

它应该做的是将 roll 数组与 rule{x} 数组进行比较,并告诉我它是否匹配。如果不匹配,它应该告诉我滚动数组的哪些索引与规则数组不匹配。但是它不能正常工作。假设示例滚动是 [2 2 3 5 5],规则 {x} 是 [1 2 3 4 5]。

我想要的输出是一个具有 [0 1 1 0 1] 的数组,但我从 y 中得到的是 [1 1 1 1 1] 而 z 是 [0 1 1 0 1]。这似乎是正确的输出,但如果我们将规则更改为 [5 5 5 5 5] 我会得到 [1 1 1 1 1] 这是不正确的。

这是针对我正在编写的 Yahtzee 游戏。掷骰子是掷骰子,规则是我要匹配的,所以我可以看到我需要重新掷骰子才能匹配。

编辑:使用来自 dspyz 的代码,我编写了函数:

function[scoreCode]=ForwardChaining(rollFunc,ruleFunc)
temp=histc(rollFunc,1:6);

for x=1:2:11
    if (ruleFunc{x}<=temp)
        scoreCode=ruleFunc{x+1};
        break;        
    else scoreCode=0;
    end    
end

主函数将其称为:

c= ForwardChaining(roll,rule);
    if c == 12;
        break;
    end

但出于某种原因,即使经过 100,000 次迭代,它也不会停止,我认为它没有按预期工作。

4

2 回答 2

1

由于骰子只能取 1 到 6 之间的值。为什么不生成每个掷骰的直方图计数。

即拿你的卷v的(行)向量说

a = histc(roll, 1:6);

现在,如果您想检查规则是否是 a 的子集(其中规则本身也根据每个数字的计数来表述),您只需检查是否

rule <= a

如果所有 6 个索引都为真,则滚动满足规则

澄清:

我不知道一年级学生,但是给定一组(可能重复的)值,例如 [1, 1, 2, 4, 5],其中所有内容都从 1 到 6,我们可以通过计算如何表示这一点从 1 到 6 的每个数字中都有很多。在这个例子中:

1: 2
2: 1
3: 0
4: 1
5: 1
6: 0

现在我们想将其与具有相同形式但元素可能更少的规则进行比较。例如 [1, 2, 3, 4]。此规则的计数将是

1: 1
2: 1
3: 1
4: 1
5: 0
6: 0

要检查 [1, 2, 3, 4] 是否是 [1, 1, 2, 4, 5] 的子集,我们只需要知道 [1, 2, 3, 4] 的计数是否都小于或等于 [1, 1, 2, 4, 5] 的计数。即我们要检查是否

1: 1 <= 2
2: 1 <= 1
3: 1 <= 0
4: 1 <= 1
5: 0 <= 1
6: 0 <= 0

除 3 外,所有这些都是正确的,因此我们知道 [1 2 3 4] 不是 [1 1 2 4 6] 的子集,因为它不包含 3

但如果所有 6 个不等式都为真,那么它将是

前任。如果你想知道 [1 3 3 3 5] 是否包含 [3 3 3],你可以检查所有

1: 0 <= 1
2: 0 <= 0
3: 3 <= 3
4: 0 <= 0
5: 0 <= 1
6: 0 <= 0

这是真的

编辑:查看 MATLAB 的文档,它说必须对 histc 的参数进行排序

编辑2:哎呀,弄错了,它说第二个参数必须排序。改回来。

于 2013-03-19T01:18:05.470 回答
0

我不确定您的数组到底在做什么,但是如果您有 [2 2 3 5 5] 并且规则 {x} 是 [1 2 3 4 5],那么您的想法是,只需执行以下操作:

[2 2 3 5 5] == [1 2 3 4 5] 会让你得到 [0 1 1 0 1] 或类似 A=(roll==rule)

于 2013-03-19T00:39:40.903 回答