1

ボウリングのスコア計算機に少し問題があります。私はここで少しずれていますが、それは最後のフレームに関係していると確信しています。わからないけど。ロードされた変数について少し。Bowling.xls には 50 ゲームのボウリングのデータが含まれているため、games は 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

4 に答える 4

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
于 2013-03-18T18:25:49.403 に答える
1

コードが matlab 用に適切にベクトル化されていません。

必要な唯一の for ループは、各ストライクの後にダミーのゼロ ラウンドを追加する必要があります (ストライクと 0 ~ 10 のスペアを区別するためです。22 列ではなく 21 列であるという事実から、データがはまだフレームに配置されていませんが、最後にゼロが埋め込まれています. フレームで指定されるように入力形式を変更できる場合は、すべてのゲームのすべてのスコアのベクトルを同時に取得できます。それらをループします)。それ以外の場合は、他のすべてをベクトル化できます。

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
于 2013-03-18T18:42:58.407 に答える
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

すべてのスコアを一緒に取得してベクトル化する方法は次のとおりです

編集: ここではストライクをスペアとしてカウントしているので、スペアスコアは実際には、スペアまたはストライクがあった後の任意のフレームの後の最初のスローを合計するだけであることに注意してください。ストライク 編集 繰り返しますが、2 回連続してストライキを行わなければなりませんでした。今はそれでいいと思う

于 2013-03-18T19:13:31.243 に答える
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)
于 2013-03-21T05:15:54.900 に答える