保龄球得分计算器MATLAB

时间:2013-03-18 17:37:10

标签: matlab

我的保龄球得分计算器有点问题。我只是有点偏离这里,我很确定它与最后一帧有关。我不知道。 关于加载变量的一点点。 bowling.xls包含50场保龄球比赛的数据,因此比赛是50x21矩阵。 21列对应每个抛出的球。 谢谢你们的帮助。如果您不了解Matlab,欢迎您回答通用代码。

编辑:这是我的最新代码。正如您所看到的,当前正在预设“当前”变量以显示我正在尝试计算的游戏,因此您可以查看它以进行调试。我从这个程序得到的输出是158.它应该是194。

i = 1;
gamescore = 0;
current =  [10 0 6 0 9 1 10 0 10 0 8 2 8 2 8 0 10 0 10 10 10]
strikes = zeros(1,10);
spares = zeros(1,10);

% Check for strikes
for j=1:10
    if current(2*j-1) == 10
        strikes(j) = 1;
    end
end

% Check for spares
for j=1:10
    if (current(2*j-1) + current(2*j) == 10) && (current(2*j-1)~=10)
        spares(j) = 1;
    end
end

% Calculate score
for j=1:10
    if strikes(j) == 1
        gamescore = gamescore + 10 + current(2*j) + current(2*j+1);
    elseif spares(j) == 1
        gamescore = gamescore + 10 + current(2*j);
    else
        gamescore = gamescore + current(2*j-1) + current(2*j);
    end
end
fprintf('Game score: %d \n',gamescore)

4 个答案:

答案 0 :(得分:1)

让我们考虑一下这段代码:

else
    score(1,j) = current(1,j) + current(1,j+1);

如果第5帧中没有罢工或备用,j=5,得分是多少?从代码中可以看出

= current(1,j) + current(1,j+1);
= 5th Ball + 6th Ball
= Score of frame 3

由此可以清楚地看到代码需要更改为

else
    score(1,j) = current(1,2*j-1) + current(1,2*j);

编辑: 经过测试,如果连续2次罢工,代码也会失败。添加一个检查很简单,只需更改:

if strikes(1,j) == 1
    score(1,j) = 10 + current(1,2*j+1) + current(1,2*j+2);

if strikes(1,j) == 1
    if strikes(1,j+1) == 1
        score(1,j) = 10 + current(1,2*j+1) + current(1,min(2*j+3,20));
    else
        score(1,j) = 10 + current(1,2*j+1) + current(1,2*j+2);
    end

答案 1 :(得分:1)

你的代码没有很好地用于matlab。

你应该需要的唯一for循环应该是每次击打后在虚拟零轮中添加的循环(以便将攻击与0-10备件区分开来。我假设它是21列但不是22数据还没有为你排列成帧,但最后是零填充。如果你可以改变输入格式以便在帧中给出,那么你可以同时获得所有游戏的所有分数的向量无需循环它们)。 否则其他一切都可以进行矢量化,例如

for idx = 1 : 2 : 19
 if game(idx) == 10
  game = [game(1 : idx), 0, game(idx : 21)]
 end
end

由于有可能打出一场完美的300场比赛,我不相信有任何方法可以实现这一目标。在处理完所有先前的帧

之前,您无法确定0-10是罢工还是备用

但现在很容易获得备用和打击指数以及得分

startscore = sum(game(1 : 20));

game = reshape(game,11,2);

spares = game(1 : 10, 1) + game(1 : 10, 2) == 10;

sparescore = sum(game(2 : 11, 1)(spares));

strikes = game(1 : 10, 1) == 10;

strikescore = sum(game(2 : 11, 2)(strikes));

score = startscore + sparescore + strikescore

答案 2 :(得分:1)

如果数据已经排列成帧,只是想展示如何解决它。

在这种情况下,我假设罢工后的虚拟零已经存在,除了最后一帧。

function [scores] = getscores(games)
 [n, m] = size(games);
 assert(m == 21);
 games = [games, zeros(n, 1)];
 lastwasstrike = games(:, 19) == 10;
 games(lastwasstrike, 21 : 22) = games(lastwasstrike, 20 : 21);
 games(lastwasstrike, 20) = 0;
 startscores = sum(games(:, 1:20), 2);
 isspare = games(:, 1:2:19) + games(:, 2:2:20) == 10
 sparescores = sum((games(:, 3:2:21).*isspare), 2)

 isstrike = games(:, 1:2:19) == 10
 strikescores = sum((games(:, 4:2:22).*isstrike), 2)

 isdoublestrike = games(:, 1:2:17) == 10 & games(:, 3:2:19) == 10
 doublestrikescores = sum((games(:, 5:2:21).*isdoublestrike), 2)
 scores = startscores+sparescores+strikescores+doublestrikescores
endfunction

以下是我如何将所有得分一起矢量化

编辑: 请注意,我在这里计算一次罢工,因此备用分数实际上只是在有空余或罢工之后的任何一帧之后的第一次投掷总和 然后为了平衡它,strikescores只是罢工后任何一帧的第二次投掷 再次编辑: 我不得不连续两次罢工。现在我认为这很好

答案 3 :(得分:0)

我做到了!!经过一堆乱七八糟的混乱,使用了一堆你自己的方法,我终于能够找到代码了。这里是!如果您对我为什么做某事有任何疑问,我会很乐意解释,因为你们对我这样做很友好。

i = 1;
gamescore = 0;
current = games(i,:);
strikes = zeros(1,12);
spares = zeros(1,10);

% Check for strikes
for j=1:9
    if current(2*j-1) == 10
        strikes(j) = 1;
    end
end
for j=1:3
    if current(18+j)==10
        strikes(9+j) = 1;
    end
end

% Check for spares
for j=1:10
    if (current(2*j-1) + current(2*j) == 10) && (current(2*j-1)~=10)
        spares(j) = 1;
    end
end

% Calculate score
for j=1:10
    if strikes(j) == 1
        if strikes(j+1)==1
            gamescore = gamescore + 20 + current(2*j+1);
        else
            gamescore = gamescore + 10 + current(2*j) + current(2*j+1);
        end
    elseif spares(j) == 1
        gamescore = gamescore + 10 + current(2*j+1);
    else
        gamescore = gamescore + current(2*j-1) + current(2*j);
    end
end
fprintf('Game score: %d \n',gamescore)