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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

Q&A

解決済

1回答

4262閲覧

15パズルゲーム

takezou_tank

総合スコア9

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

0グッド

0クリップ

投稿2016/06/30 11:39

編集2016/06/30 11:42

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

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フォームアプリケーションにて作業しています。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

number()関数ですが

VB

1If mybutton(x) = 0 Then 2 y = 0 3 Return y 4ElseIf x - 1 > 0 Then ……(1) 5 If mybutton(x - 1) = 0 Then 6 y = x - 1 7 Return y 8 End If 9ElseIf (x + 1) < 17 Then 10: 11:

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

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

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

VB

1If mybutton(x) = 0 Then 2 y = 0 3 Return y 4End If 5If x - 1 > 0 Then '(1) 6 If mybutton(x - 1) = 0 Then 7 y = x - 1 8 Return y 9 End If 10End If 11If (x + 1) < 17 Then 12: 13: 14

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

VB

1: 2: 3If (x + 4) < 17 Then 4 If mybutton(x + 4) = 0 Then 5 y = x + 4 6 Return y 7 End If 8End If 9y = 17 10Return y

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

投稿2016/06/30 15:26

編集2016/06/30 15:28
KoichiSugiyama

総合スコア3041

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takezou_tank

2016/07/01 05:18

ちゃんと動くようになりました。 お早い返信ありがとうございました。 感謝っ・・・・!圧倒的感謝っ・・・・!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問