• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:三目並べのコードの続きについて。ビジュアルベーシック2008。)

三目並べのコードの続きについて

このQ&Aのポイント
  • 三目並べのコードの続きについて
  • 三目並べのゲームの表示をダイアログボックスに変更したい
  • 引き分けのプログラムの設定方法を知りたい

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こちらが作ると、このようになってしまいますが、お分かりになるでしょうか? BlankCount で、空白を数えるわけです。 If BlankCount() < 1 Then で、リセットされずに、最後まで来たら、Tie になるわけですね。 '//   Private _Buttons As New List(Of Button)   Private GameCount As Integer   Private XCount As Integer   Private OCount As Integer Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load   GameCount = 0   '配列に格納   Me._Buttons.Add(Me.Button1)   Me._Buttons.Add(Me.Button2)   Me._Buttons.Add(Me.Button3)   Me._Buttons.Add(Me.Button4)   Me._Buttons.Add(Me.Button5)   Me._Buttons.Add(Me.Button6)   Me._Buttons.Add(Me.Button7)   Me._Buttons.Add(Me.Button8)   Me._Buttons.Add(Me.Button9)   For i As Integer = 1 To 9     With Button(i)       Button(i).Text = ""     End With   Next i End Sub   Function BlankCount()    Dim Cnt As Integer    For i As Integer = 1 To 9      With Button(i)        If .Text = "" Then          Cnt = Cnt + 1        End If      End With    Next i    BlankCount = Cnt  End Function  Private Function Button(ByVal index As Integer) As Button    Return DirectCast(Me.Controls("Button" & index.ToString), Button)  End Function   Private Sub win()   If Button1.Text = "X" And Button2.Text = "X" And Button3.Text = "X" Or _     Button4.Text = "X" And Button5.Text = "X" And Button6.Text = "X" Or _     Button7.Text = "X" And Button8.Text = "X" And Button9.Text = "X" Or _ '   省略     MessageBox.Show("X is the winner!")     Call DisableButtons()     Call Reset()     XCount = XCount + 1 'Winカウント   ElseIf _     Button1.Text = "O" And Button2.Text = "O" And Button3.Text = "O" Or _ '   省 略     MessageBox.Show("X lose the game")     OCount = OCount + 1     Call DisableButtons()     Call Reset()   End If   If BlankCount() < 1 Then     MessageBox.Show("Tie")     Call DisableButtons()     Call Reset()   End If End Sub Reset の中で、GameCount = GameCount + 1 として数えます。

chirosaku_v
質問者

お礼

コードまで的確に書いて下さり、本当になんと感謝していいのかわかりません。これからも慣れない英語で頑張ってシリーズと化したVBの最後の課題を頑張って参りますのでなにとぞご指導よろしくお願いいたします。

その他の回答 (3)

  • layy
  • ベストアンサー率23% (292/1222)
回答No.4

プログラムは作ってないので考え方、参考。 エクセル1回起動し終了までの勝敗ですか?。 昨日起動、今日起動とかの過去の通算の勝敗ですか?。 外部データに勝敗を保持すれば、どちらでも問題なくできます。 9マス埋まらないものはゲームに含めない、なら、 「勝ち」「負け」以外が「引き分け」となるので、 =「勝ち」でもなく「負け」でもないのが「引き分け」 9マスしかない、○×2択ということで 9ビット「000-000-000」をイメージした構造でもできる、と思います。 2列同時に並んだ「勝ち」もあるのでしょうか?。 (人対戦ではないと思いますがプログラム的にはパターンあり得ますので。)

chirosaku_v
質問者

補足

過去ではなく、ただプログラムを起動してから終了するまでの回数を記録したいのです。 外部データの保持は皆様の回答からStaticを使う、という事なので頑張ってみようと思います。 2列同時はなく、本当にシンプルに3つ揃ったら勝ち、と簡単なものです。

  • shinkami
  • ベストアンサー率43% (179/411)
回答No.3

途中参加です 9つのボタンのXとOを指定して何十通りもコードを打つしかないのでしょうか。 同じ式を繰り返し使うときは「ユーザー定義関数」はいかがでしょう VBはないので EXCEJのVBAですが 例 Function 勝敗(カードA, カードB, カードC)   If カードA = "○" Then A = 1 Else A = 0   If カードB = "○" Then B = 1 Else B = 0   If カードC = "○" Then C = 1 Else C = 0   勝敗 = "引分"   If A + B + C = 0 Then 勝敗 = "負" Else If A * B * C = 1 Then 勝敗 = "勝" End Function Private Sub 判定ボックス_Click()   判定ボックス = 勝敗(札A, 札B, 札C) End Sub シリーズの質問は前回のURLがあれば途中参加でも… ツイッター気分でした

chirosaku_v
質問者

お礼

わかりやすいコードありがとうございます!毎回シリーズの質問をさせて頂いておりますので是非次も参加して頂ければとても助かります!

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

>”勝ち”と”負け”のプログラムは成功しましたが”引き分け”  1 2 3  4 5 6  7 8 9 -----  1,2,3  4,5,6  7,8,9  1,4,7  2,5,8  3,6,9  1,5,9  3,5,7 縦が、3通り 横が、3通り 斜めが、2通り ------ 合計: 8 通りです。 >地道に9つのボタンのXとOを指定して何十通りもコードを打つしかないのでしょうか この部分が良く分からないのですが、 X, ○ の片方ずつ、文字として調べるか、ひとつにまとめるなら、数値化して、X = 1, ○ = -1, 未入力= 0 として、3 が成り立つのを調べか、どちらかで、Win, Lose になるのは、もうお済みのことだと思います。 Tie を求めるというのは、結果的に、未入力を探すことになるのだと思います。未入力がない状態で、どちらにも、Win がでていないなら、Tie ということになると思います。 簡単な方法としては。 --------- X の8通りの組み合わせチェック ○の8通りの組み合わせチェック 未入力のチェック >8 (>7 ですと、複雑になります) --------- で、Xか○に、該当が立たないなら、Tie ですね。 (8回目まで入れて、最後を入力しなくても、Tie になることがあることは、今は、調べていません) >三目並べのゲームのある”同じページ”に表示するのではなく、新しく追加したダイアログボックスの中に表示したいのです。 その集計を、モジュールレベル変数(Form の外に変数を置くか、Static 変数)を設けて、その変数に、記録を残します。 >勝った回数:1回 >負けた回数:2回(相手の勝った数) そして、Game数を決めて、別のDialog(MessageBox?)を出せば良いと思います。 ここまで来ると、私自身、こういうものは作ったことがありませんので、同じものを作ってみないと、どこに問題が出てくるのか分からないですね。

関連するQ&A