Suren97 Ответов: 1

C# простая шахматная ошибка


у меня есть шахматная доска,в правой части у меня есть Combobox, textbox и кнопки, из combobox я должен выбрать тип фигуры,например` слон, пешка и так далее,в текстовом поле я должен написать ее координаты,например ' D5,а затем нажать на кнопку Create,но у меня есть также кнопка Test, которая проверяет, существуют ли все фигуры на доске, например, если у меня есть все фигуры на доске, кроме пешки, когда я нажимаю на кнопку Test, это даст мне ошибку MessageBox.
Как я могу это проверить?
Спасибо.

Что я уже пробовал:

Я пробовал это сделать, но это ложь.

private void Test_Click(object sender, EventArgs e)
        {
            if(comboBox1.SelectedItem != "Bishop" || comboBox1.SelectedItem != "Pawn")
            {
                MessageBox.Show("Error");
            }
        }



private void Form1_Paint(object sender, PaintEventArgs e)//This is my Chess board
        {
            for (int i = 0; i < 8; i++)
            {
                for (int j = 0; j < 8; j++)
                {
                    if((i+j) % 2 != 0)
                    gf.FillRectangle(Brushes.Black, (j + 1) * 50, (i+1)*50, 50, 50);
                }
                Label lb = new Label();
                lb.Text = Convert.ToChar('A' + i).ToString();
                lb.Font = new Font("Tahoma", 18);
                lb.Location = new Point(50 * (i + 1), 450);
                lb.Width = 50;
                lb.Height = 26;
                this.Controls.Add(lb);
            }
            for (int i = 8; i > 0; i--)
            {
                Label lab = new Label();
                lab.Text = i.ToString();
                lab.Font = new Font("Tahoma", 18);
                lab.Location = new Point(0, 50 *(9- i));
                lab.Width = 50;
                lab.Height = 26;
                this.Controls.Add(lab);
            }
        }


 private void create_Click_1(object sender, EventArgs e) //This is my Create button
        {
           
            if (comboBox1.SelectedItem == "Bishop")
            {
                string position = textBox1.Text;
                string first_letter = position[0].ToString().ToUpper();
                int x = (int)(first_letter[0] - 64);
                int y = int.Parse(position[1].ToString());
                gf.DrawImage(Properties.Resources.Bishop, x * 50, (8 - y + 1) * 50, 50, 50);
            }
            else if(comboBox1.SelectedItem == "Pawn")
            {
                string position = textBox1.Text;
                string first_letter = position[0].ToString().ToUpper();
                int x = (int)(first_letter[0] - 64);
                int y = int.Parse(position[1].ToString());
                gf.DrawImage(Properties.Resources.Pawn, x * 50, (8 - y + 1) * 50, 40, 50);
            }
        }

Richard MacCutchan

Этот логический оператор должен быть &&, нет || Но как насчет всех остальных частей?

Suren97

мне не нужны все части, теперь мне нужно только проверить, что две части ' Pawn и Бишоп, я также попробовал оператор && но это тоже не работает

Richard MacCutchan

Тогда вы делаете что-то не так. Но поскольку вы не дали никаких подробностей, мы не можем догадаться, что именно.

Suren97

я могу отправить вам свою функцию Form1_Paint

Richard MacCutchan

Если у вас есть полезная информация о вашей проблеме, то, пожалуйста, воспользуйтесь Улучшить вопрос ссылка выше, и добавить его к исходному запросу.

Suren97

Я обновил, можете посмотреть.

Richard MacCutchan

Почему ты звонишь ToString на веревочках?

Suren97

Что ты имеешь в виду? потому что мне нужно позвонить Тапперу()

Richard MacCutchan

нет никакой необходимости звонить ToString на элементе, который уже является строкой. В этом нет никакого смысла.

Вы также дублируете код без всякой причины. Независимо от того, является ли выбор "слоном" или "пешкой", требования одинаковы. Поэтому напишите один метод, который может быть вызван независимо от того, на какую часть вы ссылаетесь.

Suren97

но я не могу написать позицию[0].Таппер();

Richard MacCutchan

Перейдите в MSDN и ознакомьтесь с документацией по классам String и Char.

Suren97

ладно,я думаю,теперь это не важно, не поможете ли вы мне, что я должен написать в методе Test_click?

Richard MacCutchan

Я все еще не понимаю, что вы пытаетесь с этим сделать. Шахматная программа обычно создается путем рисования доски с изображениями в виде фигур, позволяя пользователю перетаскивать их для каждой игры.

Suren97

хорошо,спасибо :)

PeejayAdams

Попробуйте посмотреть на свойство SelectedValue, а не SelectedItem. && это определенно правильный оператор.

Suren97

хорошо я попробую сейчас

Suren97

Нет,он дает мне ошибку во всех случаях, теперь у меня есть Слон и пешка на доске, он не должен давать мне ошибку, но он снова дает мне ошибку

Suren97

Послушайте, у меня есть Слон и пешка в combobox, если я поставлю их на доску, а затем нажму на кнопку Test, это не должно дать мне ошибку messageBox

Suren97

Но если я не поставил никого из этого он должен дать мне ошибку messageBox

1 Ответов

Рейтинг:
2

OriginalGriff

Ричардс меняется, это правильно: подумайте о том, что происходит, когда вы используете "||" вместо этого:

If the selected item is "Bishop" than it isn't "Pawn" - result == true.
If the selected item is "Pawn" than it isn't "Bishop" - result == true.
If the selected item neither "Bishop" nor "Pawn" - result == true.

С "&&" вместо этого он работает лучше:
If the selected item is "Bishop" - result == false.
If the selected item is "Pawn" - result == false.
If the selected item is neither "Bishop" nor "Pawn" - result == true.


Но это не поможет вам в том, что вы пытаетесь сделать, так как значения остаются в поле со списком, если ваш код специально не удаляет их.

Что вам нужно сделать, так это сохранить "шахматную доску" - массив фигур 8 х 8 - в вашей памяти. Когда он пользователь добавляет кусок, поместите его в соответствующее место массива.
Когда он проверяет кнопку "Тест", сканируйте все фигуры на доске (глядя на массив), чтобы найти, какие элементы размещены на ней.


Suren97

Где и как я должен объявить массив 8 x 8 штук?

OriginalGriff

MyType[,] board = новый MyType{8,8];

Где "MyType" - это любой тип, применимый для хранения ваших фигур: вероятно, абстрактный класс шахматной фигуры с конкретными классами пешки, Ладьи, коня, слона, короля и ферзя, производными от него.

mvdk72

Вы можете использовать двумерный массив (см. : https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/arrays/multidimensional-arrays). Лучшее место для объявления этого-глобально, основываясь на том, что я читаю здесь.