2014-12-04 39 views
4

所以我在尋找如何使棋盤,但在它的螺旋,而不是像本作的默認棋盤:腓棋盤螺旋顯示器陣列

$checkerboard=array(); 
    for($row=0;$row<10;$row++){ 
    if($row%2==0){ 
     for($col=0;$col<10;$col++){ 
      if($col%2==0){ 
       $checkerboard[$row][$col]="white"; 
      }else{ 
       $checkerboard[$row][$col]="black"; 
      } 
     } 
    }else{ 
     for($col=0;$col<10;$col++){ 
      if($col%2==0){ 
       $checkerboard[$row][$col]="black"; 
      }else{ 
       $checkerboard[$row][$col]="white"; 
      } 
     } 
    } 
} 

我也有2個對角線這樣試了一下:

$diagonal=array(); 
    for($row=0;$row<10;$row++){ 
     for($col=0;$col<10;$col++){ 
      if($row==$col){ 
       $diagonal[$row][$col]='black'; 
      }else{ 
       $diagonal[$row][$col]='white'; 
      } 
      if($row+$col==9){ 
       $diagonal[$row][$col]='black'; 
      } 
     } 
    } 

然後回顯的只是這樣的:

echo "<table>"; 
for($row=0;$row<count($checkerboard);$row++){ 
    echo "<tr>"; 
     for($col=0;$col<count($checkerboard);$col++){ 
      echo "<td width='50px' height='50px' bgcolor='".$checkerboard[$row][$col]."'></td>"; 
     } 
    echo "</tr>"; 
} 

我想保持代碼的簡潔是因爲我很長一段時間沒有對PHP進行編碼,它必須使用數組。

我試過這個位置:

$spiral=array(); 
    for($row=0;$row<10;$row++){ 
     for($col=0;$col<10;$col++){ 
      $spiral[$row][$col]='white'; 
      if($row==0 or $row==9 or $col==0 or $col==9){ 
       $spiral[$row][$col]='black'; 
      }if($row==1 and $col==0){ 
       $spiral[$row][$col]='white'; 
      }if($row==2 and $col<8){ 
       $spiral[$row][$col]='black'; 
      }if($row>1 and $row<8 and $col==7){ 
       $spiral[$row][$col]='black'; 
      }if($row==7 and $col>1 and $col<8){ 
       $spiral[$row][$col]='black'; 
      }if($row>3 and $row<7 and $col==2){ 
       $spiral[$row][$col]='black'; 
      }if($row==4 and $col>2 and $col<6){ 
       $spiral[$row][$col]='black'; 
      }if($row==5 and $col==5){ 
       $spiral[$row][$col]='black'; 
      } 
     } 
    } 

但是,如果棋盤變大這將是非常難以改變。有沒有辦法讓它更容易?

+0

您是否已經嘗試過創建該圈子?你能顯示你已經嘗試過的代碼嗎? – 2014-12-04 08:48:31

+0

你是說螺旋嗎?或圈? – 321zeno 2014-12-04 09:08:30

回答

1

嘗試了這一點:

我創建一個空的板然後開始繪製水平&垂直線,從邊緣每次開始。該代碼可能需要一些調整,但它是一個良好的開端

$checkerboard=array(); 

$size = 12; 

for ($row=0; $row<$size; $row++) { 
    for ($col=0; $col<$size; $col++) { 
     $checkerboard[$row][$col]="red"; 
    } 
} 

//horizontal 
$pair = 0 ; 
while ($pair < (int) $size/2) { 
    //drawing top half rows 
    $row = 2 * $pair; 
    $end = min($row, $size - $row); 
    $start = $end - 2; 
    for ($col = $start; ($col < $size - $end) && ($row < $size/2); $col++){ 
     $checkerboard[$row][$col]="black"; 
    } 
    //drawing bottom half rows 
    $far_row = $size - 1 - 2 * $pair; 
    $end = min($far_row, $size - $far_row) + 1 - 2; 
    $start = $end ; 
    for ($col = $start; ($col < $size - $end) && ($far_row > $size/2); $col++){ 
     $checkerboard[$far_row][$col]="black"; 
    } 
    $pair++; 
} 

$pair = 0; 
//vertical 
while ($pair < (int) $size/2) { 
    //drawing left half columns 
    $col = 2 * $pair; 
    $end = min($col, $size - $col); 
    $start = $end +2 ; 
    for ($row = $start; ($row < $size - $end) && ($col < $size/2); $row++){ 
     $checkerboard[$row][$col]="black"; 
    } 
    //drawing right half columns 
    $far_columns = $size - 1 - 2 * $pair; 
    $end = min($far_columns, $size - $far_columns) - 1; 
    $start = $end ; 
    for ($row = $start; ($row < $size - $end) && ($far_columns >= ($size/2)); $row++){ 
     $checkerboard[$row][$far_columns]="black"; 
    } 
    $pair++; 
} 


echo "<table>"; 
for($row=0;$row< $size;$row++){ 
    echo "<tr>"; 
     for($col=0; $col< $size; $col++){ 
      echo "<td width='50px' height='50px' bgcolor='".$checkerboard[$row][$col]."'></td>"; 
     } 
    echo "</tr>"; 
} 

你可以改變的$size變量不同維度

+1

不要這麼親:教我如何? 但是非常感謝。 – Wanjia 2014-12-04 17:14:22

+0

如果你真的想學習,試着解剖他的代碼321zeno,並嘗試重新創建或重寫它。他使用了一些很好的步驟使其易於理解和簡單。 – Rimble 2014-12-05 17:47:19

1

這裏是我的問題的嘗試:

function buildSpiral($gridSize) 
{ 
    /** 
    * Origin is at the top left handcorner 
    */ 
    $x = 0; 
    $y = 0; 
    $xMin = 0; 
    $xMax = $gridSize-1; 
    $yMin = 2; 
    $yMax = $gridSize-1; 
    $pattern = []; 
    $size = $gridSize; 

    $collision = function($p, $limit) { 
     return (bool) ($p == $limit); 
    }; 

    // increment x 
    $shadeRight = function(&$x, $y) use (&$pattern, &$xMin, &$xMax, $collision) { 
     if ($xMin > $xMax) { 
      return;  
     } 
     do { 
      $pattern[$y][$x] = 1; 
     } while (!$collision($x++, $xMax)); 
     if ($x >= $xMax) { 
      $x=$xMax; 
     } 
     $xMax-=2; 
    }; 

    // increment y 
    $shadeDown = function($x, &$y) use (&$pattern, &$yMin, &$yMax, $collision) { 
     while ($y < $yMax && $yMin > $yMax) { 
      $pattern[++$y][$x] = 1; 
     } 
     if ($yMin > $yMax) { 
      return; 
     } 

     do { 
      $pattern[$y][$x] = 1; 
     } while (!$collision($y++, $yMax)); 
     if ($y >= $yMax) { 
      $y = $yMax; 
     } 
     $yMax-=2; 
    }; 

    // decrement x 
    $shadeLeft = function(&$x, $y) use (&$pattern, &$xMin, &$xMax, $collision, $gridSize) { 
     if ($xMin > $xMax) { 
      return; 
     } 
     do { 
      $pattern[$y][$x] = 1; 
     } while (!$collision($x--, $xMin)); 
     if ($x < $xMin) { 
      $x=$xMin; 
     } 
     $xMin+=2; 
    }; 

    // decrement y 
    $shadeUp = function($x, &$y) use (&$pattern, &$yMin, &$yMax, $collision, $gridSize) { 
     while ($y > $yMin && $yMin > $yMax) { 
      $pattern[--$y][$x] = 1; 
     } 

     if ($yMin > $yMax) { 
      return; 
     } 
     do { 
      $pattern[$y][$x] = 1; 
     } while(!$collision(--$y, $yMin)); 
     if ($y < $yMin) { 
      $y = $yMin; 
     } 

     $yMin+=2; 
    }; 

    while ($size > 0) { 
     $shadeRight($x, $y); 
     $shadeDown($x, $y); 
     $shadeLeft($x, $y); 
     $shadeUp($x, $y); 

     $size-=2; 
    } 

    return $pattern;  
} 

for ($i = 1; $i <= 25; $i++) { 
    $checkboard = buildSpiral($i); 
    echo "<h1>$i</h1>"; 
    echo "<table style='margin-bottom: 2em;'>"; 
    for($row=0;$row<count($checkboard);$row++){ 
     echo "<tr>"; 
      for($col=0;$col<count($checkboard);$col++){ 
       if (!isset($checkboard[$row][$col])) { 
        echo "<td width='50px' height='50px' bgcolor=\"red\"></td>"; 
       } else { 
        echo "<td width='50px' height='50px' bgcolor=\"black\"></td>"; 
       } 
      } 
     echo "</tr>"; 
    } 
    echo "</table>"; 
} 

我停止每個當限制被擊中時遮光方向。

更新比方說,我想螺旋從右上角開始,那麼我們只需要設置新的原點,並調用着色器,我們希望螺旋去像這樣的方式:

function buildSpiral($gridSize) 
{ 
    /** 
    * Origin is at the top left handcorner 
    */ 
    $x = $gridSize-1; 
    $y = 0; 
    $xMin = 0; 
    $xMax = $gridSize-1; 
    $yMin = 2; 
    $yMax = $gridSize-1; 
    $pattern = []; 
    $size = $gridSize; 

    $collision = function($p, $limit) { 
     return (bool) ($p == $limit); 
    }; 

    // increment x 
    $shadeRight = function(&$x, $y) use (&$pattern, &$xMin, &$xMax, $collision) { 
     if ($xMin > $xMax) { 
      return;  
     } 
     do { 
      $pattern[$y][$x] = 1; 
     } while (!$collision($x++, $xMax)); 
     if ($x >= $xMax) { 
      $x=$xMax; 
     } 
     $xMax-=2; 
    }; 

    // increment y 
    $shadeDown = function($x, &$y) use (&$pattern, &$yMin, &$yMax, $collision) { 
     while ($y < $yMax && $yMin > $yMax) { 
      $pattern[++$y][$x] = 1; 
     } 
     if ($yMin > $yMax) { 
      return; 
     } 

     do { 
      $pattern[$y][$x] = 1; 
     } while (!$collision($y++, $yMax)); 
     if ($y >= $yMax) { 
      $y = $yMax; 
     } 
     $yMax-=2; 
    }; 

    // decrement x 
    $shadeLeft = function(&$x, $y) use (&$pattern, &$xMin, &$xMax, $collision, $gridSize) { 
     if ($xMin > $xMax) { 
      return; 
     } 
     do { 
      $pattern[$y][$x] = 1; 
     } while (!$collision($x--, $xMin)); 
     if ($x < $xMin) { 
      $x=$xMin; 
     } 
     $xMin+=2; 
    }; 

    // decrement y 
    $shadeUp = function($x, &$y) use (&$pattern, &$yMin, &$yMax, $collision, $gridSize) { 
     while ($y > $yMin && $yMin > $yMax) { 
      $pattern[--$y][$x] = 1; 
     } 

     if ($yMin > $yMax) { 
      return; 
     } 
     do { 
      $pattern[$y][$x] = 1; 
     } while(!$collision(--$y, $yMin)); 
     if ($y < $yMin) { 
      $y = $yMin; 
     } 

     $yMin+=2; 
    }; 

    while ($size > 0) { 
     $shadeLeft($x, $y); 
     $shadeDown($x, $y); 
     $shadeRight($x, $y); 
     $shadeUp($x, $y); 

     $size-=2; 
    } 

    return $pattern;  
} 

for ($i = 1; $i <= 25; $i++) { 
    $checkboard = buildSpiral($i); 
    echo "<h1>$i</h1>"; 
    echo "<table style='margin-bottom: 2em;'>"; 
    for($row=0;$row<count($checkboard);$row++){ 
     echo "<tr>"; 
      for($col=0;$col<count($checkboard);$col++){ 
       if (!isset($checkboard[$row][$col])) { 
        echo "<td width='50px' height='50px' bgcolor=\"red\"></td>"; 
       } else { 
        echo "<td width='50px' height='50px' bgcolor=\"black\"></td>"; 
       } 
      } 
     echo "</tr>"; 
    } 
    echo "</table>"; 
} 
+1

這很好,但以前的答案是相當好,即使您使用的功能更緊湊。 – Wanjia 2014-12-05 17:15:13

+0

我試圖想出一個可以用於不同方向的解決方案,我會更新我的解決方案以向您展示我的意思 - 看看您是否可以弄清楚如何使它們從其餘角落開始。 – ymas 2014-12-05 17:41:59

+0

我同意,這個解決方案比我的可讀性更強。 – 321zeno 2014-12-08 07:36:46