何も見ずにVB.netを使ってオセロを作ってみる その1フォーム作成~駒の配置


こんにちは

最近ちゃんとプログラミングを勉強をしていく中で自分でなにか作ってみたいと思い始めその足かかりとして誰でも知ってるゲームを作ってみようと思いました。

ということでオセロを作ってみます。

使うのはVB.netのFrameWork。初心者向けと言われ主にWindowsのフォーム作成に使われているそうです。

特徴はツールボックスを使い視覚的にボタンやテキストボックスなどを配置できること。これが便利でもあり厄介でもある。

そんなこんなで初心者の知ってる知識だけで作ってみる。一応誰が読んでわかるものになるはず。。。

 

 

1 フォームの配置(道具を用意する)

まず、オセロに必要なものは黒と白の駒、盤面、マス目。

これをそれぞれ

 

黒と白の駒→黒と白色のテキスト(●)

盤面→FlowLayoutPanel(この中に入れたオブジェクトを自動整列してくれる)

マス目→8×8=64個のボタン

 

というように割り当てた。また、ボタンには下の図のように1~64までの数字が割り当てられるように設定した、イメージはカレンダーの日付。

f:id:koji007:20210422135305p:plain

実際のフォーム、四角の部分はボタンでそこに「●」を書いている
これはまだ配置しただけなのでそれぞれのボタンはなにも反応しないから少しずつ機能を追加していく。

 

2 ボタンを押したら●が表示される機能 (駒を置く)

まずボタンを押したときに駒を配置する機能を追加します。

実際のコードはこんな感じ

    Private Turn_Mode As Short = 0 '先行後攻のフラグ 0=先行 1=後攻

'ボタンの処理
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        'テキストが入ってないときのみ動かす
        If Button1.Text = "" Then
            stnPlace(Button1)
            trnChange()
        End If
    End Sub

    '先行後攻の切り替え
    Public Function trnChange()
        If Turn_Mode = 0 Then
            Turn_Mode = 1 'フラグの切り替え
            lblTurn.Text = "後攻●" '先行後攻表示
            lblTurn.ForeColor = Color.White 'テキストの色変更
        Else
            Turn_Mode = 0
            lblTurn.Text = "先行●"
            lblTurn.ForeColor = Color.Black
        End If
    End Function


    '盤面の状態を変更
    Public Function stnPlace(ByVal bName As Button) As Boolean
        '先行なら黒後攻なら白
        If Turn_Mode = 0 Then
            bName.ForeColor = Color.Black
        Else
            bName.ForeColor = Color.White
        End If
        'テキストの配置
        bName.Text = "●"
    End Function

 
ちょっとしつこいけど一段落ずつ確認しておく

    Private Turn_Mode As Short = 0 '先行後攻のフラグ 0=先行 1=後攻

 まずは先行後攻のフラグの設定。0になってるときは先行、1になってるときは後攻



'ボタンの処理
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        'テキストが入ってないときのみ動かす
        If Button1.Text = "" Then
            stnPlace(Button1)
            trnChange()
        End If
    End Sub

これはボタンを押したときの処理をあらわしている。
if文を使ってボタンのテキストが入ってないときのみ関数を動かすように設定。
これをボタン1~64まで同じように動くように設定。



    '先行後攻の切り替え
    Public Function trnChange()
        If Turn_Mode = 0 Then
            Turn_Mode = 1 'フラグの切り替え
            lblTurn.Text = "後攻●" '先行後攻表示
            lblTurn.ForeColor = Color.White 'テキストの色変更
        Else
            Turn_Mode = 0
            lblTurn.Text = "先行●"
            lblTurn.ForeColor = Color.Black
        End If
    End Function

先行後攻切り替えの関数。ついでに下にラベル(lblTurn)をターンに合わせて切り替わるようにしてわかりやすく表示。
内容としてはIf文を使い、先行のときは後攻に、後攻のときは先行にフラグを切り替える簡単なもの



    '盤面の状態を変更
    Public Function stnPlace(ByVal bName As Button) As Boolean
        '先行なら黒後攻なら白
        If Turn_Mode = 0 Then
            bName.ForeColor = Color.Black
        Else
            bName.ForeColor = Color.White
        End If
        'テキストの配置
        bName.Text = "●"
    End Function

ボタンにテキストを表示し、場合に応じて黒色か白色かを変更する関数。
ここでもTurn_Mode変数が大活躍。先行なら黒色、後攻なら白色で●を書く。
引数はボタンの型にしてボタン1~64が入れられるようにした。


実際の動作

実際の動作はこんな感じ、ひっくり返らないし、どこにでも駒が置けるけどそれっぽくはなってきた?

f:id:koji007:20210422160204g:plain
置くだけ

まとめ

ここまでは思ったよりシンプルにまとまった!
次はひっくり返す動作をつける、ここからが大変や!
以上!