• ベストアンサー

VB.NET 上位3チームの色分け方法

VB.NETにてプログラムを勉強しています。 さっそく質問なのですが 今、野球においてのプログラミングで、打者が打った方向(たとえばライトへの打球が1番多く、2番目にショート、3番目にセンター)を色分けで考えたいと思っております。 IF文で考えていたのですが、大量の行数が必要だと思いなおし、For文で考えているのですが詰まってしまいました。 今はシミュレーションで、飛んだ方向の多さは、各ポジションの数字と同じにしてあります。 なので一番多い方向はライト、次にセンター、三番目にレフトとなっております。 ポジションは全てtextboxで作っております。 こちらもあわせて色分けを考えておりますので、お時間がよろしければ教えてください。 お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.7

期限切れそうなので答え載せときます。 適当なWindowプロジェクトを作成してForm1のコードを丸ごと以下のコードに置き換えてみてください。 Public Class Form1 Private positionCount As Integer = 9 Private txtBoxs() As TextBox Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Me.SuspendLayout() Me.Size = New System.Drawing.Size(800, 300) Me.txtBoxs = New TextBox(Me.positionCount) {} Dim random As New System.Random For i As Integer = 0 To positionCount - 1 Me.txtBoxs(i) = New TextBox txtBoxs(i).Size = New System.Drawing.Size(50, 10) If (i > 3) Then txtBoxs(i).Location = New System.Drawing.Point(200 + (i - 4) * 100, 150) Else txtBoxs(i).Location = New System.Drawing.Point(200 + i * 100, 50) End If txtBoxs(i).Name = "TxtBox" & i txtBoxs(i).Text = random.Next(100) txtBoxs(i).ReadOnly = True txtBoxs(i).BackColor = Color.White Next Dim button As New Button button.Size = New System.Drawing.Size(100, 20) button.Location = New System.Drawing.Point(290, 200) button.Text = "SET COLOR" AddHandler button.Click, AddressOf Button_Click Me.Controls.Add(button) Dim button2 As New Button button2.Size = New System.Drawing.Size(100, 20) button2.Location = New System.Drawing.Point(410, 200) button2.Text = "RANDOM" AddHandler button2.Click, AddressOf Button2_Click Me.Controls.Add(button2) Me.Controls.AddRange(Me.txtBoxs) Me.ResumeLayout(False) End Sub Private Sub Button_Click(ByVal sender As Object, ByVal e As EventArgs) Dim valueAry() As Integer Dim nameAry() As String valueAry = New Integer(positionCount) {} nameAry = New String(positionCount) {} For i As Integer = 0 To positionCount - 1 valueAry(i) = Integer.Parse(txtBoxs(i).Text) nameAry(i) = txtBoxs(i).Name Next Dim valueTmp As Integer = 0 Dim nameTmp As String For i As Integer = 0 To positionCount - 1 For j As Integer = i + 1 To positionCount If valueAry(i) < valueAry(j) Then valueTmp = valueAry(i) valueAry(i) = valueAry(j) valueAry(j) = valueTmp nameTmp = nameAry(i) nameAry(i) = nameAry(j) nameAry(j) = nameTmp End If Next Next For i As Integer = 0 To 3 For Each ctrl As Control In Me.Controls If TypeOf ctrl Is TextBox And ctrl.Name = nameAry(i) Then Select Case (i) Case 0 : ctrl.BackColor = Color.Red Case 1 : ctrl.BackColor = Color.Blue Case 2 : ctrl.BackColor = Color.Green End Select Exit For End If Next Next End Sub Private Sub Button2_Click(ByVal sender As Object, ByVal e As EventArgs) Dim random As New System.Random For i As Integer = 0 To positionCount - 1 txtBoxs(i).Text = random.Next(100) txtBoxs(i).BackColor = Color.White Next End Sub End Class

air-sora
質問者

お礼

遅れましたがありがとうございます。 このプログラムを参考にして、ようやく完成することが出来ました。 本当にありがとうございます。

その他の回答 (6)

回答No.6

えーと、並び替えできているなら回答は出たも同然ではありませんか? 配列の[0][1][2]の順に1番2番3番と格納されているわけですから。 あとは3回ループして、目的のテキストボックスのコントロールを取得できれば背景色を変えておしまいです。

air-sora
質問者

お礼

回答ありがとうございます 回答の中にあるとおり、あと一歩のところまできているのでしょうが、私の頭の中では完全にストップしてしまいました。 配列の[0][1][2]の順に格納されているのはわかりますが、ここからどうテキストボックスの背景を変えていくのかが思いつきません。 3回ループとも教えていただいておりますが、このアドバイスも私にはピンときません・・・ 今一度お時間がございましたら、初心者に教えるかのように教えていただけると大変助かります。

回答No.5

以下ヒントです。 Form1というフォームがあるとして、そのフォーム上にテキストボックスやラベル、ボタンが存在するとします。 仮にForm1のButton1をクリックした時にフォーム上のコントロールのtextをデバッグ出力する場合。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click For Each ctrl As Control In Me.Controls Debug.WriteLine(ctrl.Text) Next End Sub

air-sora
質問者

お礼

回答ありがとうございます。 現時点では Dim i, j, b, n As Integer Dim kei, p As Long Dim position() As String = {"投手", "捕手", "一塁手", "二塁手", "三塁手", "遊撃手", "レフト", "センター", "ライト"} Dim c(8) As Single Dim k As String a1 = Val(TextBox1.Text) a2 = Val(TextBox2.Text) a3 = Val(TextBox3.Text) a4 = Val(TextBox4.Text) a5 = Val(TextBox5.Text) a6 = Val(TextBox6.Text) a7 = Val(TextBox7.Text) a8 = Val(TextBox8.Text) a9 = Val(TextBox9.Text) Dim a() As Long = {a1, a2, a3, a4, a5, a6, a7, a8, a9} n = 8 TextBox10.Text &= "方向" + vbTab + "本数" + vbTab + "割合" + vbCrLf TextBox11.Text &= "方向" + vbTab + "本数" + vbTab + "割合" + vbCrLf For i = 0 To 8 kei = kei + a(i) Next For i = 0 To 8 c(i) = a(i) / kei TextBox10.Text &= position(i) + vbTab + Str(a(i)) + vbTab + Format(c(i), "###.0%") + vbCrLf Next '並び替え For i = 0 To n - 1 For j = i + 1 To n If a(i) < a(j) Then b = a(i) a(i) = a(j) a(j) = b k = position(i) position(i) = position(j) position(j) = k End If Next Next For i = 0 To 8 c(i) = a(i) / kei TextBox11.Text &= position(i) + vbTab + Str(a(i)) + vbTab + Format(c(i), "###.0%") + vbCrLf Next この状態まで進みました。 大変見づらいプログラムではありますが、並び替えまでできております。 この後に色付けのプログラムをしたいのですが、最初の質問にも書いたとおり、一番目、二番目、三番目を区別するプログラムを作成できません。 IF文でどうにか・・・と考えているのですが・・・ 今一度アドバイスなどありましたらお願いします。

回答No.4

やり方の一例ですが。 1.配列の宣言 各ポジションの飛打球数を入れる配列(仮に「飛打球配列」とします) 各ポジションのテキストボックスの名前を入れる配列(仮に「ポジション名配列」とします) 2つの配列はポジションの順番に値が入っているとします。 2.配列のソート(ソートのしかたは考えるか調べてみてください) 飛打球配列の内容を大きい順に並べ替えます。([0]:20,[1]:17,[2]:14....) この時同時にポジション名配列も飛打球配列の要素と同じ順に並べ替えます。(ソート前の飛打球配列が[0]:2,[1]:3,[2]:5。ポジション配列が[0]:ファースト、[1]:セカンド,[2]:サード とした場合、並び替えた結果は飛打球配列が[0]:5,[1]:3,[2]:2 ポジション配列が[0]:サード、[1]:セカンド,[2]:ファースト となるようにします) 3.ループ1・・・上位3位までの色を変更するため0,1,2と3回ループします。(この説明では0の場合を記述しています) 3-1.フォームのコントロールをすべて取得する。 3-2.ループ2・・・3-1で取得したコントロールの回数ループします。 3-2-1.コントロール内からコントロール種別が「テキストボックス」 かつ テキストボックス名が「ポジション配列[0]」のものを取得する。 3-2-2.目的のテキストボックスが取得できたらテキストボックスの背景色を変更する。 3-2-3.ループ2を抜ける。 3回ループが終わったら終了。 こんな感じでできるかと思います。

air-sora
質問者

お礼

回答ありがとうございます >この時同時にポジション名配列も飛打球配列の要素と同じ順に並べ替えます。(ソート前の飛打球配列が[0]:2,[1]:3,[2]:5。ポジション配列が[0]:ファースト、[1]:セカンド,[2]:サード とした場合、並び替えた結果は飛打球配列が[0]:5,[1]:3,[2]:2 ポジション配列が[0]:サード、[1]:セカンド,[2]:ファースト となるようにします) 自分なりに考えたり、ネット上で参考にしたりしましたが、この部分のポジション配列を入れ替えがうまく出来ません。 >3.ループ1・・・上位3位までの色を変更するため0,1,2と3回ループします。(この説明では0の場合を記述しています) 3-1.フォームのコントロールをすべて取得する。 3-2.ループ2・・・3-1で取得したコントロールの回数ループします。 3-2-1.コントロール内からコントロール種別が「テキストボックス」 かつ テキストボックス名が「ポジション配列[0]」のものを取得する。 3-2-2.目的のテキストボックスが取得できたらテキストボックスの背景色を変更する。 3-2-3.ループ2を抜ける。 ここのコントロールを全て取得とはどういう意味でしょうか? よろしければ教えていただけるとうれしいです。

回答No.3

#2の回答者です。 数時の字が間違いでした。 数字に読みかえて下さい。 失礼しました。

回答No.2

質問の内容は、ソート(数字の順番に並び替える)の方法? >1番よく飛んだ方向の判別方法は、math.max を使えば大丈夫なのですが、 から推測すると、配列に数時が入っているのですか?。 ソート処理には、沢山の方法があります。OSの力を借りるなり、 自分でソートするなりどれをとってもよいとは思います。 ただ、気になるのが、 >1番よく飛んだ方向の判別方法は、math.max を使えば大丈夫なのですが、 >2番目の判別方法でわからなくなりました。 >どうやって1番目に出た場所を取り除くかわかりません。 一番目が分かっているのでしょう?。だったら、そこからもう少し考えて みるとよいと思う。なんでも頼るのはよくない。 配列の中に数時が入っていて、1番大きいのがわかるってことは、 一番おおきのを仮にゼロにしたら、一番大きいのは2番目の数字では?。 プログラムは、ほんの少しのアイデアでどうにでもなります。今回の場合だと ソート点数が3個かせいぜい10個位だとおもいます。この様な方法でも 充分では。 本格的なソートもありますが、できるだけ自分で解決する努力が必要です。 自分でできる範囲ないで、プログラムの技を磨くのも一里あるのでは。、

air-sora
質問者

お礼

回答ありがとうございます。 多くのアドバイスありがとうございます。 ソート処理を学習し、小さい順に並び替えたり、大きい順に並び替えたりすることに成功しました。 これから先も詰まるところが多くあると思いますが、またアドバイスをいただけたらうれしいです。

回答No.1

タイトルの「VB.NET 上位3チームの色分け方法」と質問内容の >今、野球においてのプログラミングで、打者が打った方向(たとえばライトへの打球が1番多く、2番目にショート、3番目にセンター)を色分けで考えたいと思っております。 とあるのですが、これはどちらをやりたいのでしょうか? とりあえず質問内容のほうが多少は具体的に書いてあるので仮にこちらの内容だとして。 一体どこがわからないのでしょうか? 1.1番~3番の判別方法 2.色のつけ方(そもそもテキストの色を変えるのか、それともテキストボックスの背景の色を変えるのかもわかりません) 3.それともまったく違う部分なのか

air-sora
質問者

補足

回答ありがとうございます >とあるのですが、これはどちらをやりたいのでしょうか? とありますが、私は色分けをしたいと思っております。 題名の「チーム」はこちらの間違いでした。すみません。 >1.1番~3番の判別方法 >2.色のつけ方(そもそもテキストの色を変えるのか、それともテキストボックスの背景の色を変えるのかもわかりません) >3.それともまったく違う部分なのか 1,2番を考えています。 1番よく飛んだ方向の判別方法は、math.max を使えば大丈夫なのですが、2番目の判別方法でわからなくなりました。 どうやって1番目に出た場所を取り除くかわかりません。 色のつけかたですが 私はテキストボックスの背景の色を変える方法でしています。 textbox1.backcolor = color.red というコマンドはわかりました。 単体でのコマンドはわかりましたが、後々他のプログラムを入れるとどうなるかわかりませんが、現時点では理解しているつもりです。 よろしければさらに教えていただけるとうれしいです

関連するQ&A