0

これはちょっとしたパズルです - Bookworm や Wordsworth のような小さなゲームを子供向けに作りました。配列に格納されているアルファベットから 49 文字がランダムに選択され、子供たちは隣接する文字をクリックして単語を作成します。単語を辞書ファイル (配列内) と一致させるためのチェックがあり、単語が有効な場合、選択された文字がグリッド内でよりランダムな文字に置き換えられます。これまでのところすべて順調です。

次にやりたいことは、グリッドをチェックして、有効な単語が残っているかどうかを確認することです。必要に応じて、ゲーム オーバーのようなものです。問題は、実際にどこから始めればよいかわからないことです。

グリッド内の文字は簡単に配列にドロップできますが、グリッドをチェックして有効な単語を確認できる jQuery または JavaScript コードを作成するスキルが私にはありません (文字が互いに隣接している必要があることを思い出してください)。表ではなく、DIV 要素に文字が表示されます。

これまでのところ、単語が正しく検出され、グリッド内の文字が置換されるたびにコードを実行する必要があるため、問題が悪化するだけで、ブラウザーを多数のループでロックすることができました。

これはコーディングの質問というよりも、問題解決の実験であることを理解しています。この投稿がここでのルールに違反している場合は申し訳ありませんが、これについて最善の方法を知っている人はいますか?

乾杯BS

4

1 に答える 1

1

行のすべての文字を取得することから始めます。次に、最初の文字を文字列にコピーし、それを辞書と比較します。次に、最初の 2 文字を取り、同じことを行います。7 文字の長さに達したら、最後の 6 文字を取得して辞書と比較します。その行のチェックがすべて完了したら、次の行に進みます。すべての行が完了したら、列に対して同じことを行います。

擬似コード:

for ($currentCollumn=1; $gridWidth > $currentCollumn; $currentCollumn++) {
    $collumn = get collumn as string
    for ($i=1;$i!=7;$i++) {
        get first $i characters of $collumn and compare to dictionary
        }
    for ($i=1;$i!=7;$i++) {
        get last $i characters of $collumn and compare to dictionary
        }
}

for ($currentRow=1; $gridHeight > $currentRow; $currentRow++) {
    $row = get row as string
    for ($i=1;$i!=7;$i++) {
        get first $i characters of $row and compare to dictionary
        }
    for ($i=1;$i!=7;$i++) {
        get last $i characters of $row and compare to dictionary
        }
}

編集: バージョン 2、単語が直線に限定されていないことに気がつかなかったので。

可能なすべての場所から開始します。

// define variables:
booleanArray path[x][y] = false;  
p = pointerlocation;  
stack[] = p;  
currentString = "";  

p.up/.down/.left/.right は、それぞれ y+1、y-1、x+1、x-1 の path[][] をチェックします。範囲外の場合は false を返します。

stack[] は x86 スタックのように機能します。最初のうちの最後の。
push() 新しいオブジェクトをスタックに追加します
pop() スタックに最後に追加されたオブジェクトを取得し、スタックから削除します

function getAllTheStrings(p.x, p.y) {
    while (p) {
        path (p.x, p.y) = true;
        currentString += p.getCharacter();
        // check neighbors
        if (p.up) {
           stack.push(p.up, path, currentString);
        } 
        if (p.down) {
           stack.push(p.down, path, currentString);
        } 
        if (p.left) {
           stack.push(p.left, path, currentString);
        } 
        if (p.right) {
           stack.push(p.right, path, currentString);
        }
        // add current string to list possible words
        foundWords.push(currentString);

        // pop next item from stack
        overwrite variables with stored values of: p, path, currentString

        if (stack is empty) {
        p = false; // end loop
        }
    }
}

そして、それは次のように呼び出されます:

function getWords() {
    for ($y=1; $gridHeight > $y; $y++) {
        for ($x=1; $gridWidth > $x; $x++) {
            getAllTheStrings(x,y);
        }
}

この関数は、可能なパスのすべての組み合わせをチェックする必要があるため、グリッド サイズのスケーリングが非常に悪くなります。1x1 グリッドは 1 つのテストを実行します。2x2 には 28 回のテストが必要です。3x3 では、約 270 回のテストでカウントを失いました。

ループが終了foundWordsすると、辞書全体に対して単語ごとにチェックされます。見つかった 5 つの単語と辞書内の 100 の単語では、500 回の比較が行われます。実際には、辞書には少なくとも 1000 語が含まれます。

于 2012-04-30T11:35:33.487 に答える