C# gomoku Массив игровых меток
Я пытаюсь сделать простую игру "пять в ряд" (гомоку) для двух игроков, используя формы Windows и C#. Я положил коробку с картинкой и растянул ее на бланке. Теперь я хочу разместить надписи на всех пересечениях на картинной доске, чтобы пользователь мог щелкнуть по ним и изменить цвет фона на черный или белый.
Как я могу сделать ярлыки, созданные кликабельно на форме?
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; } } }
Должен ли я сделать одномерный [361] или двумерный массив
[{A,1}, {A,2}....{D,1}]
легко проверить на победителя? Как я могу подключить его к созданным меткам, чтобы данные массива соответствовали объектам на доске?
2 ответа
Ну извините, если не понимаю ваш вопрос. Для Q.1, чтобы добавить 361 ярлык, вы можете попробовать код ниже. Я надеюсь, что это поможет вам.
public int x = 0;
public int y = 0;
private Label[] moku = new Label[361];
private void Form1_Load(object sender, EventArgs e)
{
try
{
for (int i = 0; i < 361; i++)
{
moku[i] = new Label();
moku[i].Parent = pictureBox1;//make the picturebox parent
moku[i].Location = new Point(x, y);
moku[i].Text = "O";
moku[i].Name = "moku" + i;
moku[i].BackColor = Color.Transparent;
pictureBox1.Controls.Add(moku[i]);
y += 55;
if (y >= 361) { x += 55; y = 0; x+=55; }
}
}catch(Exception er)
{
MessageBox.Show(er.ToString());
}
}
Я предпочитаю использовать 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-массива для черного или белого. Вот значение, когда я QuickWatch это в Visual Studio.