Проблемы с генерацией поля для судоку. C#
Делаю курсовую, тема - генерация поля для игры в судоку, с возможностью выбора уровня сложности. Поле выводится в WinForms и представляет из себя набор кнопок с рандомно сгенерированными числами. В зависимости от уровня сложности, нужное количество кнопок скрывается. Нужное число выбирается через нажатие на кнопку, т.е. изначально кнопка пустая, 1 нажатие - значение 1, еще одно - 2 и тд. Остальные нескрытные кнопки, по идее, должны быть не кликабельны, но почему-то если их кол-во меньше 26, некоторые остаются кликабельными. Что я делаю не так? Заранее спасибо
public partial class Form1 : Form
{
const int n = 3;
const int sizeButton = 50;
public int[,] map = new int[n * n, n * n];
public Button[,] buttons = new Button[n * n, n * n];
public Form1()
{
InitializeComponent();
}
public void GenerateMap()
{
for (int i = 0; i < n * n; i++)
{
for (int j = 0; j < n * n; j++)
{
map[i, j] = (i * n + i / n + j) % (n * n) + 1;
buttons[i, j] = new Button();
}
}
Random r = new Random();
for (int i = 0; i < r.Next(100, 1000); i++)
{
ShuffleMap(i % 5);
}
CreateMap();
}
public void ShuffleMap(int i)
{
switch (i)
{
case 0:
MatrixTransposition();
break;
case 1:
SwapRowsInBlock();
break;
case 2:
SwapColumnsInBlock();
break;
case 3:
SwapBlocksInRow();
break;
case 4:
SwapBlocksInColumn();
break;
default:
MatrixTransposition();
break;
}
}
public void SwapBlocksInColumn()
{
Random r = new Random();
var block1 = r.Next(0, n);
var block2 = r.Next(0, n);
while (block1 == block2)
block2 = r.Next(0, n);
block1 *= n;
block2 *= n;
for (int i = 0; i < n * n; i++)
{
var k = block2;
for (int j = block1; j < block1 + n; j++)
{
var temp = map[i, j];
map[i, j] = map[i, k];
map[i, k] = temp;
k++;
}
}
}
public void SwapBlocksInRow()
{
Random r = new Random();
var block1 = r.Next(0, n);
var block2 = r.Next(0, n);
while (block1 == block2)
block2 = r.Next(0, n);
block1 *= n;
block2 *= n;
for (int i = 0; i < n * n; i++)
{
var k = block2;
for (int j = block1; j < block1 + n; j++)
{
var temp = map[j, i];
map[j, i] = map[k, i];
map[k, i] = temp;
k++;
}
}
}
public void SwapRowsInBlock()
{
Random r = new Random();
var block = r.Next(0, n);
var row1 = r.Next(0, n);
var line1 = block * n + row1;
var row2 = r.Next(0, n);
while (row1 == row2)
row2 = r.Next(0, n);
var line2 = block * n + row2;
for (int i = 0; i < n * n; i++)
{
var temp = map[line1, i];
map[line1, i] = map[line2, i];
map[line2, i] = temp;
}
}
public void SwapColumnsInBlock()
{
Random r = new Random();
var block = r.Next(0, n);
var row1 = r.Next(0, n);
var line1 = block * n + row1;
var row2 = r.Next(0, n);
while (row1 == row2)
row2 = r.Next(0, n);
var line2 = block * n + row2;
for (int i = 0; i < n * n; i++)
{
var temp = map[i, line1];
map[i, line1] = map[i, line2];
map[i, line2] = temp;
}
}
public void MatrixTransposition()
{
int[,] tMap = new int[n * n, n * n];
for (int i = 0; i < n * n; i++)
{
for (int j = 0; j < n * n; j++)
{
tMap[i, j] = map[j, i];
}
}
map = tMap;
}
public void CreateMap()
{
for (int i = 0; i < n * n; i++)
{
for (int j = 0; j < n * n; j++)
{
Button button = new Button();
buttons[i, j] = button;
button.Size = new Size(sizeButton, sizeButton);
button.Text = map[i, j].ToString();
button.Click += OnCellPressed;
button.Location = new Point(j * sizeButton, i * sizeButton);
this.Controls.Add(button);
if (j != 3
&& j != 4
&& j != 5
&& i != 4
&& i != 3
&& i != 4
&& i != 5)
{
button.BackColor = Color.LightBlue;
};
if (i != 0
&& i != 1
&& i != 2
&& i != 6
&& i != 7
&& i != 8
&& j != 0
&& j != 1
&& j != 2
&& j != 6
&& j != 7
&& j != 8)
{ button.BackColor = Color.LightBlue; }
}
}
}
public void OnCellPressed(object sender, EventArgs e)
{
Button pressedButton = sender as Button;
string buttonText = pressedButton.Text;
if (string.IsNullOrEmpty(buttonText))
{
pressedButton.Text = "1";
}
else
{
int num = int.Parse(buttonText);
num++;
if (num == 10)
num = 1;
pressedButton.Text = num.ToString();
}
}
private void button1_Click(object sender, EventArgs e)
{
for (int i = 0; i < n * n; i++)
{
for (int j = 0; j < n * n; j++)
{
var btnText = buttons[i, j].Text;
if (btnText != map[i, j].ToString())
{
MessageBox.Show("Неверно!");
return;
}
}
}
MessageBox.Show("Верно!");
for (int i = 0; i < n * n; i++)
{
for (int j = 0; j < n * n; j++)
{
this.Controls.Remove(buttons[i, j]);
}
}
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
}
private void button2_Click(object sender, EventArgs e)
{
int N = 0;
string Hide = comboBox1.Text;
switch (Hide)
{
case "Демо":
N = 6;
break;
case "Легкий":
N = 26;
break;
case "Средний":
N = 35;
break;
case "Тяжелый":
N = 45;
break;
default:
MessageBox.Show("Не выбран уровень сложности");
break;
};
if (N > 0)
{
InitializeComponent();
GenerateMap();
}
Random r = new Random();
while (N > 0)
{
for (int i = 0; i < n * n; i++)
{
for (int j = 0; j < n * n; j++)
{
if (!string.IsNullOrEmpty(buttons[i, j].Text))
{
int a = r.Next(0, 5);
buttons[i, j].Text = a == 0 ? "" : buttons[i, j].Text;
buttons[i, j].Enabled = a == 0 ? true : false;
if (a == 0)
N--;
if (N <= 0)
break;
}
}
if (N <= 0)
break;
}
}
}
private void button3_Click(object sender, EventArgs e)
{
for (int i = 0; i < n * n; i++)
{
for (int j = 0; j < n * n; j++)
{
this.Controls.Remove(buttons[i, j]);
}
}
}
private void button4_Click(object sender, EventArgs e)
{
Close();
}
private void button5_Click(object sender, EventArgs e)
{
MessageBox.Show("Курсовой проект Генератор судоку ");
}
}