WPF c # Hangman game: отключить неправильные буквы и показать сообщение об ошибке и еще 2 вопроса - PullRequest
0 голосов
/ 11 мая 2018

Хорошо, ребята, вот мой код:

private void btn_Click(object sender, RoutedEventArgs e)
{
    MessageBoxResult confirmatBoxResult = System.Windows.MessageBox.Show(
        "Êtes-vous sûr ?", "Confirmer", System.Windows.MessageBoxButton.YesNo);

    if (confirmatBoxResult == MessageBoxResult.Yes)
    {
        for (char c = 'a'; c <= 'z'; c++)
        {
            char ch = c;
            Button btn = new Button();
            btn.Content = c;
            btn.Width = 60;
            btn.Height = 60;
            btn.FontSize = 36;

            panel_lettre.Children.Add(btn);
            lookupLetters[ch] = new List<Label>();
            btn.Click += new RoutedEventHandler(btnLetter_Click);

            void btnLetter_Click(object sender2, RoutedEventArgs e2)
            {
                if (lookupLetters.TryGetValue(ch, out List<Label> textList))
                {
                    foreach (var el in textList)
                    {
                        el.Content = ch;
                        btn.IsEnabled = false;
                    }
                }
                else
                {
                    foreach (var el in textList)
                    {
                        el.Content = ch;
                        btn.IsEnabled = false;
                        // not correct
                    }
                }
            }
        }

        foreach (char ch in txtMot.Text)
        {
            Label Lbl = new Label();
            Lbl.Content = ch;
            Lbl.Content = "_";
            Lbl.FontSize = 36;
            Lbl.Width = 30;
            lookupLetters[ch].Add(Lbl);
            panel_label.Children.Add(Lbl);
        }

        btnMotProposé.IsEnabled = false;
    }
}

Со словарем:

public Dictionary<char, List<Label>> lookupLetters = new Dictionary<char, List<Label>>();

Мне удалось показать 26 букв алфавита.Все они являются кнопками и динамически отображаются в ярлыке при нажатии: btnClick .

Еще раз, событие, исходящее из btnLetter_Click , запускается после нажатия на каждуюbutton.

Здесь идет словарь: он переопределяет содержимое метки, (_) , чтобы заменить ее буквой угадываемого слова.


Так что в основном,

Если слово тестовое:

  1. Показывает: _ _ _ _
  2. Как только я нажимаю на правильные буквы алфавита, которые являются кнопками, он показывает буквы слова шаг за шагом, пока все буквы не будут полностью показаны.

Вот мои вопросы :

  1. Какмогу ли я сделать так, чтобы, если я нажму на любую букву, которая не совпадает в моем слове, здесь test , это делает букву отключенной, ( btn.IsEnabled = false; ),затем приведите MessageBox.Show ("Неверная буква!); ?
  2. Если слово найдено, оно произнесет: MessageBox.Show (" Хорошо сделайтеne, вы нашли слово!)
  3. И, скажем, после 4 попыток, если пользователь продолжит произносить ошибки, он показывает слово "угадать"?

1 Ответ

0 голосов
/ 11 мая 2018

Вот моя грубая версия того, что вы ищете:

public partial class MainWindow : Window
{
    private int MaxAttempts = 4;

    public MainWindow()
    {
        InitializeComponent();
    }

    private void btnMotPropose_Click(object sender, RoutedEventArgs e)
    {
        MessageBoxResult confirmatBoxResult = System.Windows.MessageBox.Show(
            "Êtes-vous sûr ?", "Confirmer", System.Windows.MessageBoxButton.YesNo);

        var lookupLetters = new Dictionary<char, List<Label>>();

        if (confirmatBoxResult == MessageBoxResult.Yes)
        {
            int attemptCounter = 0;

            for (char c = 'a'; c <= 'z'; c++)
            {
                char ch = c;
                Button btn = new Button();
                btn.Content = c;
                btn.Width = 60;
                btn.Height = 60;
                btn.FontSize = 36;

                panel_lettre.Children.Add(btn);
                lookupLetters[ch] = new List<Label>();
                btn.Click += new RoutedEventHandler(btnLetter_Click);

                void btnLetter_Click(object sender2, RoutedEventArgs e2)
                {
                    if (lookupLetters.TryGetValue(ch, out List<Label> textList))
                    {
                        attemptCounter++;

                        foreach (var el in textList)
                        {
                            el.Content = ch;
                            btn.IsEnabled = false;
                        }

                        if (!textList.Any())
                        {
                            btn.IsEnabled = false;
                            MessageBox.Show("Wrong letter!");
                        }

                        if (attemptCounter == MaxAttempts)
                        {
                            MessageBox.Show("Max attempts reached!");
                            ShowAnswer(lookupLetters);
                        }

                        if (AreAllLettersUncovered())
                        {
                            MessageBox.Show("Well done, you've found the word !!");
                        }
                    }
                }
            }

            foreach (char ch in txtMot.Text)
            {
                Label Lbl = new Label();                    
                Lbl.Content = "_";
                Lbl.FontSize = 36;
                Lbl.Width = 30;
                lookupLetters[ch].Add(Lbl);
                panel_label.Children.Add(Lbl);
            }

            btnMotPropose.IsEnabled = false;
        }
    }

    private bool AreAllLettersUncovered()
    {
        return panel_label.Children.Cast<Label>().All(p => (string)p.Content != "_");
    }

    private void ShowAnswer(Dictionary<char, List<Label>> lookupLetters)
    {
        var lettersWithLabels = lookupLetters.Where(p => p.Value.Any());
        foreach (var letterWithLabel in lettersWithLabels)
        {
            foreach (var label in letterWithLabel.Value)
            {
                label.Content = letterWithLabel.Key.ToString();
            }
        }
    }
}

В качестве дополнительных комментариев - я бы разделил динамический обработчик события нажатия на отдельный метод - это сделало бы код более читабельным. Основной метод onClick довольно длинный и не легко читаемый. Ваше соглашение об именах отличается от переменной слишком переменная (иногда смешивается с подчеркиванием, английский / не английский). Код легче читать, когда соглашение об именах не меняется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...