質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.85%

15パズルゲーム

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,776

takezou_tank

score 5

イメージ説明###前提・実現したいこと

15パズルのプログラムがうまく作動しません.
visual studio2013,windowsフォームアプリケーションにて作業しています。

関数number(x)はクリックしたボタンの四方に対し0のボタンを探し、自身が0であれば0、四方のボタンに0がある場合はそのボタン番号、自身・四方に0がない場合は17を返します。(ボタン番号は左から123…となります。)

ボタン1をクリックするとnumberからかえってきたボタン番号が2であった場合、配列mybutton(1))に書かれている数字をボタン2へ入力、ボタン1の数字を0にする。
5の場合も同様に行う。また、参照したボタン番号をlabel1に表示させます。

発生している問題

1)自身・四方に0がない場合number()から17が返ってくるはずが0が返ってきます。
2)number()がすべてコードパスで値を返しません」とエラーが出ます。
3)0と表示されているボタンに隣接していてもそのボタン番号を返さないことがある。

ソースコード

Public Class Form1
Private Sub Button17_Click(sender As System.Object, e As System.EventArgs) Handles Button17.Click

Dim array As Integer() = New Integer() {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}
Dim rng As New System.Random()
Dim n As Integer = array.Length
While n > 1
n -= 1
Dim k As Integer = rng.Next(n + 1)
Dim tmp As Integer = array(k)
array(k) = array(n)
array(n) = tmp
End While

Button1.Text = array(0)
Button2.Text = array(1)
省略
Button15.Text = array(14)
Button16.Text = array(15)
End Sub
Dim mybutton(16) As Integer

Private Function number(x As Integer) As Integer
Dim y As Integer
mybutton(1) = Button1.Text
mybutton(2) = Button2.Text
省略
mybutton(15) = Button15.Text
mybutton(16) = Button16.Text
If mybutton(x) = 0 Then
y = 0
Return y
ElseIf x - 1 > 0 Then
If mybutton(x - 1) = 0 Then
y = x - 1
Return y

End If
ElseIf (x + 1) < 17 Then
If mybutton(x + 1) = 0 Then
y = x + 1
Return y

End If
ElseIf (x - 4) > 0 Then
If mybutton(x - 4) = 0 Then
y = x - 4
Return y

End If
ElseIf (x + 4) < 17 Then
If mybutton(x + 4) = 0 Then
y = x + 4
Return y

End If
Else : y = 17
Return y

End If

End Function

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim x As Integer = 1
Dim ans As Integer = number(x)
If ans = 2 Then
Button2.Text = mybutton(x)
Button1.Text = 0
ElseIf ans = 5 Then
Button5.Text = mybutton(x)
Button1.Text = 0
End If
Label1.Text = ans

End Sub

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Dim x As Integer = 2
Dim ans As Integer = number(x)
If ans = 1 Then
Button1.Text = mybutton(x)
Button2.Text = 0
ElseIf ans = 3 Then
Button3.Text = mybutton(x)
Button2.Text = 0
ElseIf ans = 6 Then
Button6.Text = mybutton(x)
Button2.Text = 0
End If
Label1.Text = ans
End Sub

Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
Dim x As Integer = 3
Dim ans As Integer = number(x)
If ans = 2 Then
Button2.Text = mybutton(x)
Button3.Text = 0
ElseIf ans = 4 Then
Button4.Text = mybutton(x)
Button3.Text = 0
ElseIf ans = 7 Then
Button7.Text = mybutton(x)
Button3.Text = 0
End If
Label1.Text = ans
End Sub

Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
Dim x As Integer = 4
Dim ans As Integer = number(x)

If ans = 3 Then
Button3.Text = mybutton(x)
Button4.Text = 0
ElseIf ans = 8 Then
Button8.Text = mybutton(x)
Button4.Text = 0
End If
Label1.Text = ans
End Sub

Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
Dim x As Integer = 5
Dim ans As Integer = number(x)

If ans = 1 Then
Button1.Text = mybutton(x)
Button5.Text = 0
ElseIf ans = 6 Then
Button6.Text = mybutton(x)
Button5.Text = 0
ElseIf ans = 9 Then
Button9.Text = mybutton(x)
Button5.Text = 0
End If
Label1.Text = ans
End Sub

以下button16まで省略
End Class

試したこと

returnを最後ではなく、各if内に記入

補足情報(言語/FW/ツール等のバージョンなど)

visual studio2013,windowsフォームアプリケーションにて作業しています。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

number()関数ですが

If mybutton(x) = 0 Then 
    y = 0 
    Return y 
ElseIf x - 1 > 0 Then ……(1)
    If mybutton(x - 1) = 0 Then 
        y = x - 1 
        Return y
    End If 
ElseIf (x + 1) < 17 Then 
:
:


このif文で、xが2以上の場合、すべて(1)の条件にあてはまるため、他の分岐は通りません。

またそのとき、mybutton(x - 1) の値が0以外の場合、そこで関数の処理を抜けてしまい関数は戻り値として0を返すことになります(返す値を設定していないため)。「すべてのコードパスで値を返していません」という警告が表示されるのはそのためです。

おそらくやりたかったことは

If mybutton(x) = 0 Then 
    y = 0 
    Return y 
End If
If x - 1 > 0 Then   '(1)
    If mybutton(x - 1) = 0 Then 
        y = x - 1 
        Return y
    End If 
End If
If (x + 1) < 17 Then 
:
:


こういうことだと思います。それで、最後にどの条件にも当てはまらない場合

:
:
If (x + 4) < 17 Then 
    If mybutton(x + 4) = 0 Then 
        y = x + 4
        Return y
    End If 
End If
y = 17 
Return y


としてやれば、最後に17を返すことができます。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/01 14:18

    ちゃんと動くようになりました。
    お早い返信ありがとうございました。

    感謝っ・・・・!圧倒的感謝っ・・・・!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.85%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る