0

私はこれについてみんなに迷惑をかけ続けている気がするので、「またこの男」でごめんなさい。

私の 4 連打ゲームは、4 連打をチェックする必要があるところまで機能します。X と O がチャームのように列に追加され、グリッドが正しく表示されます。ここでのポイントは、多次元配列で 4 が連続しているかどうかを確認したいということですが、if ステートメントを使用することは、次のように記述しなければならないため、実際にはうまくいかないようです。

if ($CreateBoard[1,0] -and $CreateBoard[1,1] -and $CreateBoard[1,2] -and $CreateBoard[1,3] -eq "X") {Write-host "Exit script!"}
if ($CreateBoard[1,1] -and $CreateBoard[1,2] -and $CreateBoard[1,3] -and $CreateBoard[1,4] -eq "X") {Write-host "Exit script!"}
if ($CreateBoard[1,2] -and $CreateBoard[1,3] -and $CreateBoard[1,4] -and $CreateBoard[1,5] -eq "X") {Write-host "Exit script!"} 
if ($CreateBoard[1,3] -and $CreateBoard[1,4] -and $CreateBoard[1,5] -and $CreateBoard[1,6] -eq "X") {Write-host "Exit script!"} 
if ($CreateBoard[1,4] -and $CreateBoard[1,5] -and $CreateBoard[1,6] -and $CreateBoard[1,7] -eq "X") {Write-host "Exit script!"} 
if ($CreateBoard[1,5] -and $CreateBoard[1,6] -and $CreateBoard[1,7] -and $CreateBoard[1,8] -eq "X") {Write-host "Exit script!"} 
if ($CreateBoard[1,6] -and $CreateBoard[1,7] -and $CreateBoard[1,8] -and $CreateBoard[1,9] -eq "X") {Write-host "Exit script!"}
if ($CreateBoard[1,7] -and $CreateBoard[1,8] -and $CreateBoard[1,9] -and $CreateBoard[1,10] -eq "X") {Write-host "Exit script!"} 

すべての列、次に行、そして対角線に進みます。質問は次のとおりです: 私の 10x10 グリッドをすばやく通過する方法はありますか (for ループの Foreach-Object を使用すると思いますか?)、そうであれば、基本的な例を提供していただけますか? (問題がある場合は、文字列「X」または「O」を4回続けて見つけようとしています)

ありがとう

4

1 に答える 1

1

これは、PowerShellの質問というよりもアルゴリズムの質問です。:-)そうは言っても、1つの簡単なアプローチは次のようになります。

function FindFourInARow($brd, $startRow, $startCol)
{
    $numRows = $brd.GetLength(0);
    $numCols = $brd.GetLength(0);

    #search horizontal
    $found = 0;
    $cnt  = 0;
    for ($col = $startCol; $col -lt $numCols -and $cnt -lt 4; $col++, $cnt++)
    {
        if ($brd[$startRow, $col] -eq 'X')
        {
            $found += 1
            if ($found -eq 4) { return $true }
        }
    }

    #search vertical
    $found = 0;
    $cnt = 0;
    for ($row = $startRow; $row -lt $numRows -and $cnt -lt 4; $row++, $cnt++)
    {
        if ($brd[$row, $startCol] -eq 'X')
        {
            $found += 1
            if ($found -eq 4) { return $true }
        }
    }

    #search diag forwards
    $found = 0;
    $row = $startRow
    $col = $startCol
    $cnt = 0;
    for (;$row -lt $numRows -and $col -lt $numCols -and $cnt -lt 4; 
          $row++, $col++, $cnt++)
    {
        if ($brd[$row, $col] -eq 'X')
        {
            $found += 1
            if ($found -eq 4) { return $true }
        }
    }

    return $false
}

# TODO: implement search diag backwards

$brd = New-Object 'char[,]' 10,10
$brd[2,2] = $brd[3,3] = $brd[4,4] = $brd[5,5] = 'X'

$numRows = 10
$numCols = 10
for ($r = 0; $r -lt ($numRows - 3); $r++)
{
    for ($c = 0; $c -lt ($numCols - 3); $c++)
    {
        if (FindFourInARow $brd $r $c)
        {
            "Found four in a row at $r,$c"
            $r = $numRows
            break;
        }
    }
}

これをSOに直接入力しました。エラーが発生している可能性がありますが、基本的な要点がわかります。

于 2013-01-17T19:07:49.737 に答える