📝

2022/10/17 ○✕プログラムをブラッシュアップする

2022/10/17に公開

今日の目標

バグ修正
プログラムの振り返り
次回以降の目標設定

プログラムのバグ修正

既知(既に知っている)バグ
○を置いたところをクリックしても✕になってしまう

修正箇所を予想する
修正する箇所はどこだろうか?

考え方
クリックされたところにすでに何か入っていたら無視する

「クリックされたところ」が分かるのはクリックされた瞬間

そこの処理でクリックされたラベルになにも書いていないか、何か書かれているかで判断できる

クリックされた時の処理で、クリックされたラベルがわかればよい

ヒント
Form1.cs
if (lbl.Text == "")
{
	ラベルになにも書かれていなければ
	クリックされた時の処理を行う
}

クリックイベントの関数で、クリックされたラベルが入っているsender
senderをLabel化してlblにしている。

lblのTextプロパティが空("")だったらクリックの処理をします。

プログラムの振り返り-実行される順に振り返る-

実行される順番にプログラムを振り返りましょう。

画面を表示した直後に実行されるForm1.cs側のForm1_Shown関数
ここでドキュメントクラスがnewされる。
newされた瞬間にドキュメントクラスが設計図から実態(たとえるなら建物)になる
設計図のなかにあった関数以外のものが、次々と実体化される
建物になる最初の一回目だけ処理されるのが、クラスメイト同じ名前の関数!
つまりDocumentクラスのDocument関数が実行される

クリックされた時に実行されるlbl_0_2_Click関数
→関数名が分かりづらいので変更してみましょう
①関数名の上にマウスを持っていきクリック
②表示されるメニューの[名前の変更]をクリック


となるので、関数名をlbl_Clickへ変更する
④適用をクリックする。
⑤新たに表示される画面でも[適用]をクリックする

この操作で名前を変えようとしている関数名が関わっている箇所すべての名前が変更になります

この関数のなかで、クリックされたx,y座標を調べてDocument関数へ伝えてます。
Document関数側では、ボードの記憶(iBordArray)を持っているので、
その記憶を最新とする。と同時に次の順番を更新しておく
UpdateBord関数で、Document側で更新されたボード記憶を貰い受けて実際にボードを更新する。ついでに次の順番の表示も更新

勝ち負けが付いたか?の判断もする

勝ち負けがついていたら表示して次のゲームへ、ついていなかったら関数を終える

変数の型

プリミティブ型
bool (trueかfalseか)
byte
char
decimal (小数点を正確にもつ)
double (大きい値の整数)
int (小さい値の整数)
uint (符号なし小さい値の整数)
long
short

参照型
string (文字を入れる)
object (クラスなどを入れる)

スコープ

変数の有効範囲
{}の中!

関数の中だけで有効な変数はローカル変数
関数をまたいで有効な変数はメンバ変数
クラスをまたいで有効な変数はグローバル変数という

関数や変数の名前の付け方

関数名
https://murashun.jp/article/programming/naming-conventions.html
ここのサイトの規則がよい

変数名
変数の名前を見ただけで、型、用途がわかるようにする。

もう一歩プログラムを綺麗にしてみる

Form1.cs
private void UpdateBord()
{
    //最新のボードの状況を取得
    int[,] iaBord = oDoc.getBord();

    //最新のボードの内容を画面に反映
    if (iaBord[0, 0] == 1)
    {
        lbl_0_0.Text = "〇";
    }
    else if (iaBord[0, 0] == 2)
    {
        lbl_0_0.Text = "×";
    }
    else
    {
        lbl_0_0.Text = "";
    }

  ★★★★★★★★★★★★★★★★★★★★
   似たようなプログラムがだらだらーとつづく
   ★★★★★★★★★★★★★★★★★★★★
   
    //順番を表示
    UudateJun();
}

3✕3で9個のラベルも配列に入れて管理する

Form1クラス全体で扱う変数

Label[,] lblBordArray = new Label[3,3];

その変数にそれぞれのラベルを入れるロジック

lblBordArray[0, 0] = lbl_0_0;
lblBordArray[0, 1] = lbl_0_1;
lblBordArray[0, 2] = lbl_0_2;
lblBordArray[1, 0] = lbl_1_0;
lblBordArray[1, 1] = lbl_1_1;
lblBordArray[1, 2] = lbl_1_2;
lblBordArray[2, 0] = lbl_2_0;
lblBordArray[2, 1] = lbl_2_1;
lblBordArray[2, 2] = lbl_2_2;

2重ループでだらだらープログラムを綺麗にする

2重ループのコード
    for (int x = 0; x < 3 ; x++)
    {
	for(int y = 0; y < 3 ; y++)
	{
	    Label lbl = lblBordArray[x, y];

	    if (iaBord[x, y] == 1)
	    {
		lbl.Text = "〇";
	    }
	    else if (iaBord[x, y] == 2)
	    {
		lbl.Text = "×";
	    }
	    else
	    {
		lbl.Text = "";
	    }
	}
    }

来週から新プログラムに挑戦?それとも深堀?

習うより慣れる

難度を上げる
○✕ゲームをコンピュータ対戦できるようにする
五目並べに挑戦する
オセロに挑戦する

Discussion