配列について

タグの編集
投稿者 syosinya  (社会人) 投稿日時 2009/1/19 19:07:32
下記のコードは、「くるくるバトル」というゲームで、6×6のピクチャボクスを使って
作成してあり、黒と白のコマを交互において自分の持ちコマで相手のコマをはさんだときに
裏返せる。裏返したコマの数が勝敗を決するというゲームの一部です。
これは、とある本のサンプルの一部ですが、疑問に思っていることがあるので
おしえてください。
下記のコードの中でPictureBoxの配列とPictureBoxの二次元配列の2つが書かれているのですが
前者は不要な気がするのですが、ちがいますでしょうか?

  '-----------------------
  'モジュールレベル変数
  '
  Private PBox(35) As PictureBox    'PictureBoxの配列
  Private PBox2(5, 5) As PictureBox 'PictureBoxの二次元配列
  Private dw(7) As Integer    '横方向移動量
  Private dh(7) As Integer    '縦方向移動量
  Private gCnt As Integer     'コマの数
  Private gBlack As Integer   '黒のポイント
  Private gWhite As Integer   '白のポイント
  '
  Const PIECE As Integer = 6     '1辺のコマの数


  '-----------------
  '起動時
  '
  Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim i As Integer  'カウンタ

    'PictureBoxの配列を作成
    PBox = New PictureBox() { _
                  pctBan0, pctBan1, pctBan2, pctBan3, pctBan4, pctBan5, _
                  pctBan6, pctBan7, pctBan8, pctBan9, pctBan10, pctBan11, _
                  pctBan12, pctBan13, pctBan14, pctBan15, pctBan16, pctBan17, _
                  pctBan18, pctBan19, pctBan20, pctBan21, pctBan22, pctBan23, _
                  pctBan24, pctBan25, pctBan26, pctBan27, pctBan28, pctBan29, _
                  pctBan30, pctBan31, pctBan32, pctBan33, pctBan34, pctBan35}

    '二次元配列を作成
    PBox2 = New PictureBox(,) { _
                    {pctBan0, pctBan1, pctBan2, pctBan3, pctBan4, pctBan5}, _
                    {pctBan6, pctBan7, pctBan8, pctBan9, pctBan10, pctBan11}, _
                    {pctBan12, pctBan13, pctBan14, pctBan15, pctBan16, pctBan17}, _
                    {pctBan18, pctBan19, pctBan20, pctBan21, pctBan22, pctBan23}, _
                    {pctBan24, pctBan25, pctBan26, pctBan27, pctBan28, pctBan29}, _
                    {pctBan30, pctBan31, pctBan32, pctBan33, pctBan34, pctBan35}}

    '移動量を設定
    dh = New Integer() {-1, -1, -1, 0, 1, 1, 1, 0}
    dw = New Integer() {-1, 0, 1, 1, 1, 0, -1, -1}

    '盤面のドラッグ/ドロップを設定
    For i = 0 To PIECE * PIECE - 1
      PBox(i).AllowDrop = True
    Next
  End Sub
以下省略

投稿者   (社会人) 投稿日時 2009/1/19 19:51:59
不要かどうかはともかく、提示されているコードの最後のFor文で思いっきり使われているけど。
投稿者 るしぇ  (社会人) 投稿日時 2009/1/19 20:10:16
>不要かどうかはともかく、提示されているコードの最後のFor文で思いっきり使われているけど。
うん。置き換えがいるよね。

同じ PictureBox の実体を参照しているので、
PBox の処理を PBox2 の処理に置き換えてしまう方が
分かり易いでしょうね。

このような宣言をすると、
・ある場所では PictureBox 全てに同じ設定を実行。
・別の場所では PictureBox の縦横を意識した命令を実行。
と使い易いように感じることもあるでしょうが、全体を
見ると同じ処理を2回書いているようなプログラムに
なりがちです。

PictureBox が追加になったら、2箇所修正することになり、
その後のテストも2系列でテストすることになります。
どちらかの系統でバグが出た時に、同じような修正を
もう1つの系統に反映しなくてはならない場合が多く、
反映し忘れることも考えられます。

前者(または後者)は不要な配列として統一する考え方は
良い考え方だと思います。
投稿者 るしぇ  (社会人) 投稿日時 2009/1/20 00:13:24
もっと言えば
> Const PIECE As Integer = 6     '1辺のコマの数
せっかく定数宣言してるので、7×7に変更したくなるんですよね。
#「くるくるバトル」は6×6でないと成り立たないゲームなんですか?

>  Private PBox(35) As PictureBox    'PictureBoxの配列
>  Private PBox2(5, 5) As PictureBox 'PictureBoxの二次元配列
>  Private dw(7) As Integer    '横方向移動量
>  Private dh(7) As Integer    '縦方向移動量
これって
  Private PBox(PIECE * PIECE - 1) As PictureBox    'PictureBoxの配列
  Private PBox2(PIECE - 1, PIECE - 1) As PictureBox 'PictureBoxの二次元配列
  Private dw(PIECE + 1) As Integer    '横方向移動量
  Private dh(PIECE + 1) As Integer    '縦方向移動量
なのではないのでしょうか?

で、動的にコントロールを作成する、と。
他の処理も自由にサイズを変更できる形に改造ですね。
もちろん、難易度はかなり上がります。
中級者向けの応用問題です。