5章:チュートリアル 4: 絵合わせゲームの作成

    作成2013.04.09

  1. 参照元情報
     チュートリアル 4: 絵合わせゲームの作成
    「チュートリアル 4: 絵合わせゲームの作成」にジャンプする
     作成方法の詳細は上記を参照願います。


  2. チュートリアル 4: 絵合わせゲームの作成の完成ファイル
     チュートリアル 4: 絵合わせゲームの作成の解説とおりに作業を実施すると、プロジェクトファイル群が完成しますがVBからC#に変換したほうが簡単です。
     完成ファイルは以下からダウンロードできます。
     ダウンロード後は解凍してから使用してください。
      [ チュートリアル 3: 計算クイズの作成]をダウンロードする。
     解凍すると「5MatchingGame」フォルダーがあります。
    注(1)「5MatchingGame」フォルダーの「MatchingGame.sln」ファイルをダブルクリックすると「Express 2012 for Windows Desktop」が起動します。
    注(2)メニューの「ウインド」_「ウインドレイアウトのリセット」で標準に戻ります。
    注(3)「ソリューションエクスプローラ」ウインドウ内の「Form1.cs」をダブルクリックすると「デザイン」が表示されます。
    注(4)メニューの「表示」_「コード」を選択するとコードが表示されます。
    注(5)「MatchingGame.sln」の動作確認は「デバッグ」_「デバッグ開始」で実行します。デバッグ機能を用いて動作確認を行います。


  3. MatchingGame.slnの実行
    (1)「Express 2012 for Windows Desktop」のデバッグ機能を使用します。
    (2)「デバッグ」_「デバッグ開始」を選択します。
    (3)全面青の画面が表示されます。
    (4)画面内をクリックすると絵が表示されます。
    (5)続けて画面内の別の位置をクリックすると絵が表示されます。
    (6)この2つの絵が一致すると絵は消えずに残りますが、一致しないと消えます。
    (7)全ての絵が表示されれば完了です。
    (8)クローズボックスでプログラムを終了します。


  4. 新規プロジェクトの作成
    (1)Form1のデザイン設定
     新規プロジェクトを作成すると「デザイナー」にはForm1が自動生成されます。Form1のデザイン設定はVBのForm1のコピー&ペーストで完成します。

    (2) Form1コード
     基本コードが自動生成されます。


  5. Form1の全コード
    using System;
    using System.Collections.Generic;
    using System.Drawing;
    using System.Windows.Forms;
    
    namespace MatchingGame
    {
        public partial class Form1 : Form
        {
            Random random = new Random();
            List icons = new List() 
              { "!", "!", "N", "N", ",", ",", "k", "k", "b", "b", "v", "v", "w", "w", "z", "z" };
            Label firstClicked = null;
            Label secondClicked = null;
    
            public Form1()
            {
                InitializeComponent();
                AssignIconsToSquares();
            }
    
            private void AssignIconsToSquares()
            {
                foreach (Control control in TableLayoutPanel1.Controls)
                {
                    Label iconLabel = control as Label;
                    if (iconLabel != null)
                    {
                        int randomNumber = random.Next(icons.Count);
                        iconLabel.Text = icons[randomNumber];
                        iconLabel.ForeColor = iconLabel.BackColor;
                        icons.RemoveAt(randomNumber);
                    }
                }
            }
    
            private void label_Click(object sender, EventArgs e)
            {
                if (Timer1.Enabled == true)  return;
                Label clickedLabel = sender as Label;
                if (clickedLabel != null)
                {
                    if (clickedLabel.ForeColor == Color.Black) return;
                    if (firstClicked == null)
                    {
                        firstClicked = clickedLabel;
                        firstClicked.ForeColor = Color.Black;
                        return;
                    }
                    secondClicked = clickedLabel;
                    secondClicked.ForeColor = Color.Black;
                    CheckForWinner();
                    if (firstClicked.Text == secondClicked.Text)
                    {
                        firstClicked = null;
                        secondClicked = null;
                        return;
                    }
                    Timer1.Start();
                }
    
            }
    
            private void Timer1_Tick(object sender, EventArgs e)
            {
                Timer1.Stop();
                firstClicked.ForeColor = firstClicked.BackColor;
                secondClicked.ForeColor = secondClicked.BackColor;
                firstClicked = null;
                secondClicked = null;
            }
    
            private void CheckForWinner()
            {
                foreach (Control control in TableLayoutPanel1.Controls)
                {
                    Label iconLabel = control as Label;
                    if (iconLabel != null)
                    {
                        if (iconLabel.ForeColor == iconLabel.BackColor) return;
                    }
                }
                MessageBox.Show("You matched all the icons!", "Congratulations");
                Close();
            }
        }
    }
    


  6. Form1コードの解説
    (1) List icons = new List()は変数iconsをList()型で生成し、初期値に{ "!", "!", "N", "N", ",", ",", "k", "k", "b", "b", "v", "v", "w", "w", "z", "z" }を設定します。
    (2)Label firstClicked = null;は変数firstClickedをLabel型で生成し、初期値をnullとします。
    (3)private void AssignIconsToSquares()は各ラベルに乱数でiconsの文字を割り当てます。
    (4)foreach (Control control in TableLayoutPanel1.Controls)はTableLayoutPanel1のControlについて繰り返します。
    (5)Label iconLabel = control as Label;はcontrolがLabel型のときTrue、そうでないときnullをiconLabelに設定します。
    (6)if (iconLabel != null)はiconLabelがnullでないとき実行します。
    (7)int randomNumber = random.Next(icons.Count);は0からicons.Countの範囲の乱数が設定されます。
    (8)iconLabel.Text = icons[randomNumber];でiconLabel.Textに乱数番目の文字が代入されます。
    (9)icons.RemoveAt(randomNumber);は乱数番目のiconsを除外します。
    (10)private void label_Clickは2回とも同じ文字を選択されたときのみ文字表示を残します。(詳細は省略)
    (11)private void Timer1_Tickで違う文字が選択された場合の文字を消去します。
    (12)private void CheckForWinner()で終了表示します。


    感想:
    (1)Form1のコードが難解なのは、動作が複雑なためです。(動作自体が複雑なためやもえません。)
    (2)VBからC#への変換は以外と簡単にできました。







6章:10 行でズバリ!! コードの作成と配置 (C#)に行く。

トップページに戻る。