Непонятная ошибка в игре Судоку - C#
Формулировка задачи:
Доброго времени суток. Вот решил сделать игру Судоку. Все вроде сделал правильно, но в какой то момент игра просто зависает. Зависает на заполнении числами клеток. Каждый раз на новых цифрах.
Понять не могу в чем проблема.
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApplication3 { public partial class Form1 : Form { public Form1() { InitializeComponent(); buttonS = new Button[9, 3, 3]; } //рисование кнопок static void DrawButtons(Button[,,] buttons, Panel panel1) { int xS = 10, yS = 10, aS = 0;//начальные оси для кнопок, as это контейнеры по 9 ячеек for (int a = 0, s = 0; a < 9; a++) { for (int x = 0; x < 3; x++) { for (int y = 0; y < 3; y++) { buttons[a, x, y] = new Button(); panel1.Controls.Add(buttons[a, x, y]);//добавление на плайн кнопок buttons[a, x, y].Location = new Point(xS, yS);//кординаты кнопок buttons[a, x, y].Text = " "; buttons[a, x, y].Name = x.ToString() + y.ToString();//это имя ячеек по кординатам buttons[a, x, y].Size = new Size(45, 45); buttons[a, x, y].TabIndex = 0; buttons[a, x, y].UseVisualStyleBackColor = true; yS += 45; } xS += 45; yS = 10 + aS;// смещение и сброс кординат, as тут играет роль новых ячеек } s++;//счетчик if (s == 6)//если счетчик равен 6 ячейкам { yS = 270 + 10;// ось y с 7 по 9 ячейки прибавляется 10 потому что начинается с 10 xS = 10; aS = yS - 10;// тут отбавляется 10 потому что после прибавляется 10, потом доработаю глоавное что все работает. } else if (s == 3)// если счетчик равен 3 ячейкам { yS = 135 + 10; xS = 10; aS = yS - 10;//математика мать ее } } } private void button1_Click(object sender, EventArgs e) { DrawButtons(buttonS, panel1); } //алгоритм заполнения static void Algoritm(Button[,,] buttonS)//---------------------------------------------------< Вот здесь { Random random = new Random(); int tempX = 0, tempY = 0; bool b = true; for (int i = 1; i < 10; i++) { for (int a = 0; a < 9; a++) { while (true) { tempX = random.Next(0, 3); tempY = random.Next(0, 3); b = Inspected(i, buttonS, a, tempX, tempY); // запомни что сначало читается Х а потом вниз У if (b == false) { buttonS[a, tempX, tempY].Text = i.ToString(); break; } } b = true; } } } static bool Inspected(int i, Button[,,] buttonS, int a, int x, int y) { if (a>= 6) { //проверка по x for (int aI = 6; aI < 9; aI++) { for (int xI = 0; xI < 3; xI++) { if (buttonS[aI, xI, y].Text == i.ToString()) return true; } } //проверка по y for (int q = 0, aI = a - 6; q < 3; q++) { for (int xI = 0; xI < 3; xI++) { if (buttonS[aI, x, xI].Text == i.ToString()) { //MessageBox.Show(i.ToString()); return true; } } aI += 3; } //проверка по a for (int xI = 0; xI < 3; xI++) { for (int yI = 0; yI < 3; yI++) { if (buttonS[a, xI, yI].Text == i.ToString()) return true; } } } else if (a >= 3) { //проверка по x for (int aI = 3; aI < 6; aI++) { for (int xI = 0; xI < 3; xI++) { if (buttonS[aI, xI, y].Text == i.ToString()) return true; } } //проверка по y for (int q = 0, aI = a - 3; q < 3; q++) { for (int yI = 0; yI < 3; yI++) { if (buttonS[aI, x, yI].Text == i.ToString()) { //MessageBox.Show(i.ToString()); return true; } } aI += 3; } //проверка по a for (int xI = 0; xI < 3; xI++) { for (int yI = 0; yI < 3; yI++) { if (buttonS[a, xI, yI].Text == i.ToString()) return true; } } } else { //проверка по x for (int aI = 0; aI < 3; aI++) { for (int xI = 0; xI < 3; xI++) { if (buttonS[aI, xI, y].Text == i.ToString()) { //MessageBox.Show(i.ToString() + "y" + x.ToString() + y.ToString() ); return true; } } } //проверка по x /*for(int q = 0, aI = a; aI < 3; q++) { for(int xI = 0; xI < 3; xI++) { if (buttonS[aI, xI, y].Text == i.ToString()) { MessageBox.Show(i.ToString() + "x" + x.ToString() + y.ToString()); return true; } } aI += 3; } */ //проверка по a for (int xI = 0; xI < 3; xI++) { for (int yI = 0; yI < 3; yI++) { if (buttonS[a, xI, yI].Text == i.ToString()) { //MessageBox.Show(i.ToString() + "a" + x.ToString() + y.ToString()); return true; } } } } if (buttonS[a, x, y].Text == " ") { MessageBox.Show(i.ToString() + "~" + x.ToString() + y.ToString()); return false; } else return true; } private void button2_Click(object sender, EventArgs e) { Algoritm(buttonS); } } }
Решение задачи: «Непонятная ошибка в игре Судоку»
textual
Листинг программы
while (true)
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д