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

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

新規登録して質問してみよう
ただいま回答率
85.48%
VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

1回答

816閲覧

vb.net 3目ならべについて

pirorikin13

総合スコア12

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2019/06/16 11:21

前提・実現したいこと

 初めての投稿です。 
現在vb.netの勉強をしておりまして、それについての質問があります。
本当に初心者なので拙い面があるかと思いますが、知識のある方にどうか教えていただきたいです。
現在vb.netで3目ならべ(〇×)のプログラムを考えています。

発生している問題・エラーメッセージ

 いろいろな書生や本などを参考にしてある程度コードは書けました。
ゲームとしては一応動いてはいるのですが、この後、〇と×の勝敗を保存や、勝ち負けのデータを蓄積していきたいなと考えています。 
しかし、そのようにするにはどうしたらよいか思いつきません。
未熟なもので指摘される点は多々あるかと思いますヴぁ、現在でできているところまでのコードを載せます。
よろしくお願いします。(フォーム上にパネルで升目を作って、〇×交互にマウスで場所を決めていくといった形です)

エラーメッセージ

該当のソースコード

'暗黙の変換の禁止
Option Strict On
'暗黙の変数宣言の禁止
Option Explicit On

Public Class Form1

'マスの2次元配列 Dim masu(2, 2) As Integer '〇と×の総数 Dim count As Integer = 0 Private Sub Panel1_Paint(sender As Object, e As PaintEventArgs) Handles Panel1.Paint '格子 # の直線を描く Dim kousipen As New Pen(Color.Blue, 3) '〇を描く(黒)ペンのインスタンス化 Dim marupen As New Pen(Color.Black, 3) '×を描く(赤)ペンのインスタンス化 Dim batupen As New Pen(Color.Red, 3) ''丸を描く(円の中は塗らない)塗る場合は,FillEllipseで 'e.Graphics.DrawEllipse(marubatupen, 10, 10, 30, 30) ''×を描く 'e.Graphics.DrawLine(marubatupen, 60, 10, 90, 40) 'e.Graphics.DrawLine(marubatupen, 90, 10, 60, 40) '格子を描く(縦│) e.Graphics.DrawLine(kousipen, 0, 0, 0, 150) e.Graphics.DrawLine(kousipen, 50, 0, 50, 150) e.Graphics.DrawLine(kousipen, 100, 0, 100, 150) e.Graphics.DrawLine(kousipen, 150, 0, 150, 150) '格子を描く(横─) e.Graphics.DrawLine(kousipen, 0, 0, 150, 0) e.Graphics.DrawLine(kousipen, 0, 50, 150, 50) e.Graphics.DrawLine(kousipen, 0, 100, 150, 100) e.Graphics.DrawLine(kousipen, 0, 150, 150, 150) For i As Integer = 0 To 2 For j As Integer = 0 To 2 '(i,j)の位置のマスが〇なら〇を描く If masu(i, j) = 1 Then e.Graphics.DrawEllipse(marupen, i * 50 + 10, j * 50 + 10, 30, 30) '(i,j)の位置のマスが×なら×を描く ElseIf masu(i, j) = 2 Then e.Graphics.DrawLine(batupen, i * 50 + 10, j * 50 + 10, i * 50 + 40, j * 50 + 40) e.Graphics.DrawLine(batupen, i * 50 + 40, j * 50 + 10, i * 50 + 10, j * 50 + 40) End If Next Next End Sub 'マウスをクリックした際の動作 Private Sub Panel1_MouseDown(sender As Object, e As MouseEventArgs) Handles Panel1.MouseDown 'マウスが押されたx座標から実際のマス上のx座標に変換 Dim x As Integer = e.X \ 50 'マウスが押されたy座標から実際のマス上のy座標に変換 Dim y As Integer = e.Y \ 50 'マスに既に〇か×がある場合は置けない If masu(x, y) <> 0 Then Return 'マス数が偶数なら〇,奇数なら×にする If count Mod 2 = 0 Then masu(x, y) = 1 Else masu(x, y) = 2 '〇と×の総数を1増やす count = count + 1 If count Mod 2 = 0 Then Me.Label1.ForeColor = Color.Black Label1.Text = "先攻""〇""の番です" ElseIf count Mod 2 = 1 Then Me.Label1.ForeColor = Color.Red Label1.Text = "後攻""×""の番です" End If 'パネル再構築 Panel1.Invalidate() '勝敗判定 Dim win As Integer = Judge() '先手の勝ちなら If win = 1 Then MessageBox.Show("先攻(〇)の勝ち", "結果") Label1.ForeColor = Color.Black Label1.Text = "〇の勝ち" Reset() Panel1.Enabled = False '後手の勝ちなら ElseIf win = 2 Then MessageBox.Show("後攻(×)の勝ち", "結果") Label1.ForeColor = Color.Red Label1.Text = "×の勝ち" Reset() Panel1.Enabled = False '9ターン経って勝敗がつかなかったら ElseIf count >= 9 Then MessageBox.Show("引き分け", "結果") Label1.ForeColor = Color.Purple Label1.Text = "引き分け" Reset() Panel1.Enabled = False End If 'マスが全部埋まったら If count >= 9 Then MessageBox.Show("終了します", "結果") Me.Close() End If End Sub Private Sub Reset() 'ゲーム内容のリセット For i As Integer = 0 To 2 For j As Integer = 0 To 2 'マスを全て空白にする masu(i, j) = 0 Next Next 'カウントを0に戻す count = 0 Panel1.Invalidate() 'パネル再構築 End Sub ''' <summary> ''' 〇×の勝敗判定 ''' </summary> ''' <returns></returns> Private Function Judge() As Integer '横判定 For i As Integer = 0 To 2 '横一列のマスが全て同じで、空白でないなら If masu(0, i) <> 0 And masu(0, i) = masu(1, i) And masu(0, i) = masu(2, i) Then Return masu(0, i) End If Next '縦判定 For j As Integer = 0 To 2 '縦一列のマスが全て同じで、空白でないなら If masu(j, 0) <> 0 And masu(j, 0) = masu(j, 1) And masu(j, 0) = masu(j, 2) Then Return masu(j, 0) End If Next '斜め判定 右下がり一列全てのマスが同じで、空白でないなら If CBool(CInt(masu(0, 0) <> 0 And masu(0, 0) = masu(1, 1)) And masu(0, 0) And masu(2, 2)) Then Return masu(0, 0) End If '斜め判定 右上がり一列全てのマスが同じで、空白でないなら If CBool(CInt(masu(2, 0) <> 0 And masu(2, 0) = masu(1, 1)) And masu(2, 0) And masu(0, 2)) Then Return masu(2, 0) End If Return 0 End Function 'フォームがロードされた直後は,パネルの操作無効 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Panel1.Enabled = False End Sub 'スタートボタンを押した Private Sub btnStart_Click(sender As Object, e As EventArgs) Handles btnStart.Click Panel1.Enabled = True Me.Label1.ForeColor = Color.Black Label1.Text = "先攻""〇""の番です" End Sub 'リセットボタンが押されたときに初期化 Private Sub btnReset_Click(sender As Object, e As EventArgs) Handles btnReset.Click Reset() End Sub Private Sub btnClose_Click(sender As Object, e As EventArgs) Handles btnClose.Click '終了ボタンを押したら終了 Me.Close() End Sub Private Sub 読み込みRToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles 読み込みRToolStripMenuItem.Click End Sub Private Sub 結果を保存SToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles 結果を保存SToolStripMenuItem.Click 'SaveFileのインスタンス化 Dim SaveFile As New SaveFileDialog() 'はじめのファイル名の指定 SaveFile.FileName = "新しいファイル.txt" 'はじめに表示されるフォルダの表示 SaveFile.InitialDirectory = "D:\" 'ファイルの種類に表示される選択肢を指定 SaveFile.Filter = "TXTファイル(*.txt)|*.txt|すべてのファイル(*.*)|*.*" '[ファイルの種類]ではじめに「すべてのファイル」が選択されているようにする SaveFile.FilterIndex = 2 'タイトルを設定する SaveFile.Title = "保存先のファイルを選択してください" 'ダイアログボックスを閉じる前に現在のディレクトリを復元するようにする SaveFile.RestoreDirectory = True '既に存在するファイル名を指定したとき警告する.デフォルトでTrueなので指定する必要はない SaveFile.OverwritePrompt = True '存在しないパスが指定されたとき警告を表示する.デフォルトでTrueなので指定する必要はない SaveFile.CheckPathExists = True 'ダイアログを表示する If SaveFile.ShowDialog() = DialogResult.OK Then 'OKボタンがクリックされたとき Dim stream As System.IO.Stream stream = SaveFile.OpenFile() If Not (stream Is Nothing) Then 'ファイルに書き込む Dim sw As New System.IO.StreamWriter(stream) sw.Write(masu(0, 0)) sw.Write(masu(0, 1)) sw.WriteLine(masu(0, 2)) sw.Write(masu(1, 0)) sw.Write(masu(1, 1)) sw.WriteLine(masu(1, 2)) sw.Write(masu(2, 0)) sw.Write(masu(2, 1)) sw.Write(masu(2, 2)) '閉じる sw.Close() stream.Close() End If End If End Sub

End Class

ソースコード

試したこと

DataGridViewやDataSetなどを使うのかなと・・・

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

・1戦毎に保存したいデータ(例えば、勝敗、手数、1戦の時間など)を決めてそれを格納するクラスなり構造体なりを作成する。

VB.NET

1Class ResultData 2 '保存したいデータ 3End Class

・そのクラスなり構造体なりをListに格納する。

VB.NET

1Private ResultList As List(of ResultData) 2 3'結果を格納する場合は1戦が終了した時に 4Dim result As New ResultData 5result.~ 6ResultList.Add(result)

表示したい内容に即してListを集計するなどすればいいのではないかと思います。
ファイルに保存するのであれば、CSVやXML、JSONなどいろいろ検討して決定してからそれに即した保存処理を作成すればよろしいかと

投稿2019/06/16 11:41

YAmaGNZ

総合スコア10258

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問