オセロのサンプルが?? への返答

投稿で使用できる特殊コードの説明。(別タブで開きます。)
本名は入力しないようにしましょう。
投稿した後で削除するときに使うパスワードです。返答があった後は削除できません。
返答する人が目安にします。相手が小学生か社会人かで返答の仕方も変わります。
最初の投稿が質問の場合、質問者が解決時にチェックしてください。(以降も追加書き込み・返信は可能です。)
※「過去ログ」について書くときはその過去ログのURLも書いてください。

以下の返答は逆順(新しい順)に並んでいます。

投稿者 ボンジュールボンソワ  (中学生) 投稿日時 2009/3/29 16:12:10
1人用ですか?
対戦用ですか?
るきおさんのとこ読んだが、コム思考のフロチャートが少し書いてあるよ。
なるほどねぇ~
このへんは大事みたいだが。^^
投稿者 るしぇ  (社会人) 投稿日時 2009/3/29 15:45:56
コメントがしっかり書いてあるから流し読みして
。。。別段フシギなことは無いんだけど、

実引数と仮引数。。。ナニを問題にしてるのか
掴めないですねぇ。ヘンに知ったかぶりしないで
指で1つ2つと数えるようなレベルでいいから、
自分の言葉で説明したほうが好感が持てますけどねぇ。

メソッドっていうと外部から自分を操作させる
命令に思います。
(※状態を変えさせるのがプロパティ)
今回の例は内部処理の共通部分を関数化してる
だけだから、サブ関数(プロシージャ)と呼ぶほうが
回答者には把握し易いです。

同じような処理を2回繰り返してるのは、調べる
ほうで順次裏返してしまうと判定がかぶるマスが
あった時にそこで判定が変わっちゃうことがある
からかなぁ。。。本当にそんな状態があるかどうか
までは解析して無いけど、そんな処理にする理由で
思いつくのはそんなところだよね。

あとはマスの初期状態と、途中の状態(SearchPiece
実行後とか?)と、処理後の状態を出力するように
でも改造して、更に細かいところを1行1行実行して
確認すれば何が理解できないのかも分かってくるのでは?
デバッグしないでプログラムが分かるようになることは
ありませんよ。

>ちなみにこれらのメソッドを使わないで作る方法も
>あるのですよね(動けばいいといった見にくい
>プログラムになると思いますが)
なぜそんなことを気にするのか、なぜそんな質問を
する必要があるのか、まず、分かりません^^;
使わないで書き直せばいいだけでは?
投稿者 ヴァン  (社会人) 投稿日時 2009/3/29 02:48:18
>n って何よと言うのはありますけど。

良く見てなかった。引数だったのか。

投稿者 デフォルト  (社会人) 投稿日時 2009/3/29 00:13:30
>何が理解できないのでしょうか?

はっきりとした言葉にはできないのですが、メソッドの実引数と仮引数についての理解が十分できていないことがあると思います。

おぼろげながら最初よりみえてきた部分はあるのですが、もう少し勉強してみます。
ちなみにこれらのメソッドを使わないで作る方法もあるのですよね(動けばいいといった見にくいプログラムになると思いますが)
投稿者 ヴァン  (社会人) 投稿日時 2009/3/28 21:54:24
>SearchPieceとChangePieceメソッドの中にあるFor i = 1 To PIECE - 1の部分が
>どうしても理解できません。

何が理解できないのでしょうか?

>      'インデックスの取得
>      pos = GetIndex(tmp, n)

n って何よと言うのはありますけど。

投稿者 デフォルト  (社会人) 投稿日時 2009/3/28 04:45:59
黒と白のコマを交互に置く「くるくるバトル」というゲームです
置いた位置から縦、横、斜めにコマを調べて、自分の持ちコマではさんだときに裏返すことができます。
SearchPieceとChangePieceメソッドの中にあるFor i = 1 To PIECE - 1の部分が
どうしても理解できません。
オセロと同じ物だとおもうのですが、管理人様の作られたオセロと違うようなので
何ともお手上げです。helpをお願いします。

 Private PBox(35) As PictureBox    'PictureBoxの配列
  Private PBox2(5, 5) As PictureBox 'PictureBoxの二次元配列
  Private dw(7) As Integer    '横方向移動量
  Private dh(7) As Integer    '縦方向移動量
   Const PIECE As Integer = 6     '1辺のコマの数


  '-----------------
  '起動時
     'PictureBoxの配列を作成
     '二次元配列を作成
     '移動量を設定
    dh = New Integer() {-1, -1, -1, 0, 1, 1, 1, 0}
    dw = New Integer() {-1, 0, 1, 1, 1, 0, -1, -1}

    '盤面のドラッグ/ドロップを設定
    'コマを表示
    sender.Image = e.Data.GetData(DataFormats.Bitmap)

    '周囲のピクチャボックスを調べる
    Call CheckPiece(sender.Tag)


------------------------------
  '周囲のピクチャボックスを調べる
  '
  Private Sub CheckPiece(ByVal index As Integer)
    Dim i As Integer    'カウンタ
    Dim pos As Integer  'チェック対象の番号
    Dim flg As Boolean  '裏返すかどうか

    For i = 0 To 7

      'ピクチャボックスの番号を調べる
      pos = GetIndex(index, i)

      'ピクチャボックスの番号が正しいかどうか
      If pos < 0 Then
        '
      Else
        'コマが置いてあるかどうか
        If PBox(pos).Image Is Nothing Then
          '
        Else
          'ドラッグしたコマと同じ色かどうか
          If PBox(index).Image Is PBox(pos).Image Then
            '
          Else
            'コマを裏返す
            flg = SearchPiece(index, i)
            If flg = True Then
              Call ChangePiece(index, i)
            End If
    中略

  '-----------------------------
  'インデックスを取得する
  '
  Private Function GetIndex(ByVal index As Integer, ByVal n As Integer) As Integer
    Dim h As Integer    '行番号
    Dim w As Integer    '列番号
    Dim hh As Integer   'チェック対象の行番号
    Dim ww As Integer   'チェック対象の列番号

    '行・列番号の取得
    h = index \ PIECE
    w = index Mod PIECE

    'チェック対象の行・列番号
    hh = h + dh(n)
    ww = w + dw(n)

    'インデックスの取得
    If (hh < 0) Or (hh > PIECE - 1) Then
      GetIndex = -1
    ElseIf (ww < 0) Or (ww > PIECE - 1) Then
      GetIndex = -1
    Else
      GetIndex = PBox2(hh, ww).Tag
    End If
  End Function


  '-----------------------------
  'コマを調べる
  '
  Private Function SearchPiece(ByVal index As Integer, ByVal n As Integer) As Boolean
    Dim tmp As Integer  '仮の基準位置
    Dim pos As Integer  'チェック対象の番号
    Dim i As Integer    'カウンタ
    Dim flg As Boolean  '裏返すかどうか

    '初期化
    tmp = index

    '一方向の繰り返し
    For i = 1 To PIECE - 1

      'インデックスの取得
      pos = GetIndex(tmp, n)

      'インデックスが正しいかどうか
      If pos < 0 Then
        Exit For

      Else
        'コマが置いてあるかどうか
        If PBox(pos).Image Is Nothing Then
          Exit For

        Else
          '裏返す必要があるかどうか
          If PBox(index).Image Is PBox(pos).Image Then
            flg = True
            Exit For
          End If
        End If
      End If

      '基準の位置を更新
      tmp = pos
    Next i

    '結果を返す
    SearchPiece = flg
  End Function


  '--------------------------
  'コマを裏返す
  '
  Private Sub ChangePiece(ByVal index As Integer, ByVal n As Integer)
    Dim tmp As Integer    '仮の基準位置
    Dim pos As Integer    'チェック対象の番号
    Dim i As Integer      'カウンタ

    '初期化
    tmp = index

    '一方向の繰り返し
    For i = 1 To PIECE - 1

      'インデックスの取得
      pos = GetIndex(tmp, n)

      'インデックスが正しいかどうか
      If pos < 0 Then
        Exit For

      Else
        'イメージがあるかどうか
        If PBox(pos).Image Is Nothing Then
          Exit For

        Else
          'ドロップしたコマと同じ色かどうか
          If PBox(index).Image Is PBox(pos).Image Then
            Exit For
          Else
            'コマを裏返す
            PBox(pos).Image = PBox(index).Image

                '基準の位置を更新
      tmp = pos
    Next i
  End Sub