-2

Windows フォームと C# を使用して、2 人のプレイヤー向けの単純な 5 列 (五目並べ) ゲームを作成しようとしています。絵の入ったピクチャーボックスを置き、フォームに伸ばしました。ここで、ユーザーがクリックして背景色を黒または白に変更できるように、画像ボードのすべての交差点にラベルを配置したいと考えています。

  1. 作成したラベルをフォーム上でクリック可能にするにはどうすればよいですか?

    public partial class Form1 : Form
    {
        int labelCount = 0;
        int iteration = 0;
    
        public Form1()
        {
            InitializeComponent();
            Label[] board = new Label[361];
    
            for (int i = 0; i < 361; i++)
            {
                board[i] = new Label
                {
                    Name = "label" + i,
                    Height = 55,
                    Width = 55,
                    MinimumSize = new Size(55, 55),
                    Text = "label " + i
                };
            }
    
            int x = 0;
            int y = 0;
    
            foreach (var Label in board)
            {
                if (x >= 580)
                {
                    x = 0;
                    y = y + Label.Height + 55;
                }
    
                Label.Location = new Point(x, y);
                this.Controls.Add(Label);
                x += Label.Width;
            }        
        }
    }
    
  2. [{A,1}, {A,2}....{D,1}]勝者を簡単に確認するには、1 次元 [361] または 2 次元の配列を作成する必要がありますか? 配列データがボード上のオブジェクトに対応するように、作成したラベルに接続するにはどうすればよいですか?

4

2 に答える 2

0

周囲のボックスをチェックしたい場合は簡単なので、2D 配列を使用することをお勧めします。

フォームデザイン:

ここに画像の説明を入力

完全なソース:

using System;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApplication6
{
    public enum Player
    {
        Empty = 0,
        White,
        Black
    }

    public partial class Form1 : Form
    {
        // initialize board of 5x5
        private Player[,] board = new Player[5, 5];

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            DrawBoard();
        }

        private void DrawBoard()
        {
            for (var i = 0; i <= board.GetUpperBound(0); i++)
            {
                for (var j = 0; j <= board.GetUpperBound(1); j++)
                {
                    // for name and text
                    var name = string.Format("{0}, {1}", i, j);

                    var label = new Label()
                    {
                        Name = name, // name of label
                        Size = new Size(55, 55),
                        BorderStyle = BorderStyle.FixedSingle,
                        Location = new Point(i * 55, j * 55), // location depends on iteration
                        Text = name
                    };

                    label.Click += ClickLabel; // subscribe the Click event handler

                    pictureBox1.Controls.Add(label); // add label to a container
                }
            }
        }

        // this event handler will handle all the labels click event
        private void ClickLabel(object sender, EventArgs e)
        {
            var label = (Label)sender; // this is the label that you click
            var x = Convert.ToInt32(label.Name.Split(',')[0]);
            var y = Convert.ToInt32(label.Name.Split(',')[1]);

            // change the color
            if (radPlayerBlack.Checked)
            {
                // Player Black
                label.ForeColor = Color.White;
                label.BackColor = Color.Black;
                board[x, y] = Player.Black;
            }
            else
            {
                // Player White
                label.ForeColor = Color.Black;
                label.BackColor = Color.White;
                board[x, y] = Player.White;
            }
        }
    }
}

黒または白の 2D 配列の値を確認できます。Visual Studio で QuickWatch したときの値を次に示します。

ここに画像の説明を入力 ここに画像の説明を入力

于 2015-11-06T03:51:43.757 に答える