@vladimirinput

Как сделать, что бы после закрытия messageboxа не открывались следующие?

Добрый день, нужно было написать программу для отгадывания числа, и сценарий выполняется не так как нужно. Открывается messagebox, выдает информацию, и после того как я его закрываю, открываются последовательно остальные messageboxы, а мне надо что бы после закрытия messageboxа, я снова мог ввести число.
я ввожу число на форме, когда kolvopotytok = 3: открывается messagebox, выдается такая то инфа, и когда я его закрываю я попадаю не на форму, а открывается следующий messagebox, из цикла где kolvopotytok = 2, и т.д.

надеюсь понятно объяснил

Как сделать так что бы меня возвращало на форму после закрытия messageboxа

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 template
{
    public partial class Form2 : Form
    {
        private int r;
        public Form2(int digitfrom, int digitto)
        {
            Random rnd = new Random();
            r = rnd.Next(digitfrom, digitto);
            InitializeComponent();
        }
        bool IsDigitsOnly(string str)
        {
            foreach (char c in str)
            {
                if (c < '0' || c > '9')
                    return false;
            }
            return true;
        }
        private void button1_Click(object sender, EventArgs e)
        {
            if (IsDigitsOnly(answer.Text) == false)
            {
                MessageBox.Show("Некорректный ввод данных", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                answer.Text = "";
            }
            else
            {
                int a = Convert.ToInt32(answer.Text);
                int kolvopotytok = 3;
                if (kolvopotytok == 3)
                {
                    if (a > r)
                    {
                        MessageBox.Show("Число которое загадал ИИ меньше вашего!\nУ вас осталось 2 попытки.");
                        answer.Text = "";
                        kolvopotytok--;
                    }
                    else if (a < r)
                    {
                        MessageBox.Show("Число которое загадал ИИ больше вашего!\nУ вас осталось 2 попытки.");
                        kolvopotytok--;
                        answer.Text = "";
                    }
                    else
                    {
                        MessageBox.Show("Поздравляем!!! Вы угадали число с первого раза.");
                        goto here;
                    }
                }
                if (kolvopotytok == 2)
                {
                    if (a > r)
                    {
                        MessageBox.Show("Число которое загадал ИИ меньше вашего!\n\nУ вас осталась 1 попытка.");
                        answer.Text = "";
                        kolvopotytok--;
                    }
                    else if (a < r)
                    {
                        MessageBox.Show("Число которое загадал ИИ больше вашего!\nУ вас осталась 1 попытка.");
                        kolvopotytok--;
                        answer.Text = "";
                    }
                    else
                    {
                        MessageBox.Show("Поздравляем!!! Вы угадали число со второго раза.");
                        goto here;
                    }
                }
                if (kolvopotytok == 1)
                {
                    if (a > r)
                    {
                        MessageBox.Show("Число которое загадал ИИ меньше вашего!\nУ вас осталось 0 попыток.");
                        answer.Text = "";
                        kolvopotytok--;
                    }
                    else if (a < r)
                    {
                        MessageBox.Show("Число которое загадал ИИ больше вашего!\nУ вас осталось 0 попыток.");
                        kolvopotytok--;
                        answer.Text = "";
                    }
                    else
                    {
                        MessageBox.Show("Поздравляем!!! Вы угадали число с третьего раза.");
                        goto here;
                    }
                }
                if (kolvopotytok == 0)
                {
                    MessageBox.Show("К сожелению вы проиграли\nЗагаданное число: " + r);
                    goto here;
                }

            here:;
                this.Close();

            }
        }
    }
}
  • Вопрос задан
  • 594 просмотра
Решения вопроса 1
FoggyFinder
@FoggyFinder
Не уверен что правильно понял проблему, поэтому если окажется что мой ответ не подходит не стесняйтесь уточнять и спрашивать в комментариях, будем разбираться как починить.

Код в обработчике button1_Click выполняется последовательно. После того как сработает первое условие вы уменьшаете значение на единицу и следующий if тоже становится верным.

Первое что вам нужно сделать это вынести количество попыток в приватную переменную.
kolvopotytok не самое подходящее название (и хотя я, например, могу понять что тут имеется ввиду количество попыток) лучше использовать названия на английском. Давайте возьмем countOfAttempts . Так как вы хотите отслеживать количество, то вам нужно завести еще одну переменную для учета их изначального (максимального) числа:

public Form2(int digitfrom, int digitto)
{
    InitializeComponent();

    Random rnd = new Random();
    r = rnd.Next(digitfrom, digitto);
    maxCountOfAttempts = countOfAttempts = 3;
}
private int r;
private int maxCountOfAttempts, countOfAttempts;


Затем вы можете заметить что каждый раз код внутри проверочного условия одинаковый.
А теперь представьте, что диапазон будет достаточно широкий (скажем около сотни), а количество попыток увеличиться до 10. Копировать один и тот-же участок раз за разом не слишком эффективно. Давайте тогда вынесем весь код в отдельную функцию, которая будет принимать значение и в зависимости от него выводить информационное сообщение. Если пользователь угадал, то функция вернет true, в противном случае - false:

private bool CheckResult(int a)
{
    if (a == r)
    {
        MessageBox.Show($"Поздравляем!!! Вы угадали число с {countOfAttempts - 1} раза.");
        return true;
    }
    else if (a > r)
    {
        MessageBox.Show($"Число которое загадал ИИ меньше вашего!\nУ вас осталось {countOfAttempts - 1} попытки.");
        return false;
    }
    else
    {

        MessageBox.Show($"Число которое загадал ИИ больше вашего!\nУ вас осталось {countOfAttempts - 1} попытки.");
        return false;
    }
}


Теперь немного изменим сам обработчик:

private void button1_Click(object sender, EventArgs e)
{
    if (IsDigitsOnly(answer.Text))
    {
        int a = Convert.ToInt32(answer.Text);
        if (CheckResult(a))
            this.Close();
        else
        {
            countOfAttempts--;
            if (countOfAttempts == 0)
            {
                MessageBox.Show("К сожелению вы проиграли\nЗагаданное число: " + r);
                this.Close();
            }
        }
    }
    else
    {
        MessageBox.Show("Некорректный ввод данных", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
    answer.Clear();
}


Должно работать. Как видите код достаточно близкий к вашему, но в то-же время немного понятнее.

И, если позволите, небольшой совет на будущее: старайтесь избегать использования goto.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы