Avatar billede tbrg Novice
07. november 2006 - 02:51 Der er 2 kommentarer og
1 løsning

Bogstaver der forsvinder

For at sætte mig ind i C# er jeg begyndt at programmere et lille spil Hang-Man, og jeg er stødt ind i et, synes jeg, mystisk problem. Visse tegn forsvinder i processen.

Sådan fungerer programmet:
Det eller de skjulte ord, man skal gætte står i een label repræsenteret med bindestreger (-).
Bogstaver som repræsenterer forkerte gæt, står i en anden label.
Det skjulte ord består af uppercase bogstaver.
Input fra keyboardet konverteres til uppercase.

Det fungerer som det skal, bortset fra når inputtet er F. Hvis de skjulte ord er "FREDE FIK FRIKADELLER", og jeg indtaster de relevante tegn, ender der med at stå "-REDE -IK -RIKADELLER".

Jeg har prøvet det samme kode med lowercase. Så forsvinder tegnene e, g, k, o, r, t og æ.

Jeg er mystificeret. Er der nogen, der kan forklare mig, hvad der går galt? Den foreløbige kode er vist herunder:

//KODE
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace Hang_Torben
{
    public partial class Form1 : Form
    {
        private string answer; // ord der skal gættes

        public Form1()
        {
            InitializeComponent();
            initializeGame();
        }

        private void initializeGame()
        {
            lblWrongLetters.Text = "Forkerte gæt: "; // her vises ukorrekte bogstaver
            lblHiddenWord.Text = ""; // her vises de korrekt gættede bogstaver
            getCategory();
        }

        private void getCategory()
        {
            answer = "FREDE FIK FRIKADELLER";

            // sætter streger for hvert bogstav i det eller de skjulte ord og evt. mellemrum
            for (int i = 0; i < answer.Length; i++)
            {
                if (answer.Substring(i,1).Equals(" "))
                    lblHiddenWord.Text += " ";
                else
                    lblHiddenWord.Text += "-";
            }
        }

        private void Form1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
        {
            if(Char.IsLetter(e.KeyChar))
                guess(e.KeyChar);
        }

        private void guess(char c)
        {
            c = Convert.ToChar(c.ToString().ToUpper()); // konverterer til stor char

            if (!lblWrongLetters.Text.Contains(Convert.ToString(c)))
            {
                bool letterFound = false;
                char[] charArrayLabel = lblHiddenWord.Text.ToCharArray();
                char[] charArrayWord = answer.ToCharArray();

                for (int i = 0; i < charArrayLabel.Length; i++)
                {
                    if (charArrayWord[i].Equals(c))
                    {
                        charArrayLabel[i] = c;
                        letterFound = true;
                    }
                }

                if (!letterFound)
                    lblWrongLetters.Text += " " + Convert.ToString(c);
                else
                {
                    string s = "";
                    for (int i=0;i<charArrayLabel.Length;i++)
                        s += Convert.ToString(charArrayLabel[i]);
                    lblHiddenWord.Text = s;
                }     
            }
        }
    }
}
Avatar billede bulgroz Nybegynder
07. november 2006 - 08:00 #1
Der er flere ting som godt kan være anderledes i denne kode, men årsagen til dit egentlige problem er nu ret simpel.

Du starter med at assigne din "lblWrongLetters" til "Forkerte gæt: "

I dit "guess" metode checker du for:
if (!lblWrongLetters.Text.Contains(Convert.ToString(c)))
           
Og da du har assignet lblWrongLetters med teksten "Forkerte gæt:" vil "F" jo allerede figurere som forkert. De øvrige karakterer er små bogstaver og vil ikke fejle.

Løsning...
Så derfor bør du holde dine forkerte karakterer i en streng som kun bliver brugt til dette, og din UI ledetekst "Forkerte gæt:" i en tilsvarende separat label.

Men der er mange andre muligheder, men ovenstående vil løse dit nuværende problem.
Avatar billede bulgroz Nybegynder
07. november 2006 - 10:13 #2
Her en lille hurtig alternativ løsning... (Med baggrund i din egen løsning)


namespace Hang_Torben
{
    using System;
    using System.Text;
    using System.Collections.Generic;
    using System.Windows.Forms;

    public partial class Form1 : Form
    {
        private string answer = "Frede Fik Frikadeller";

        private System.Collections.Generic.List<char> rightGuesses = new List<char>();
        private System.Collections.Generic.List<char> currentRightGuesses = new List<char>();
        private System.Collections.Generic.List<char> currentWrongGuesses = new List<char>();
     
        public Form1()
        {
            this.InitializeComponent();
            this.initializeGame();
        }

        /// <summary>
        /// Ord som skal gættes.
        /// </summary>
        public string Ansver
        {
            get
            {
                // Bør naturligvis returnere den teksten fra den kontrol hvor du taster dit hemmelige svar.
                return this.answer;
            }
        }

        private void initializeGame()
        {
            #region Slet tidligere spil

            this.currentWrongGuesses = new List<char>();
            this.rightGuesses = new List<char>();
            this.currentRightGuesses = new List<char>();

            #endregion // Slet tidligere spil

            #region Gem mulige rigtige svar

            string answer = this.Ansver.ToUpper();

            foreach (char c in answer.ToCharArray())
            {
                if (Char.IsLetter(c) && !this.rightGuesses.Contains(c))
                {
                    this.rightGuesses.Add(c);
                }
            }

            #endregion // Gem mulige rigtige svar

            this.UpdateHiddenWord();
            this.UpdateWrongAnswers();
        }

        /// <summary>
        /// Opdaterer label med rigtige svar.
        /// </summary>
        private void UpdateHiddenWord()
        {
            StringBuilder stringBuilder = new StringBuilder();
            string answer = this.Ansver.ToUpper();

            bool gameEnded = true;
            int index = 0;

            foreach (char c in answer.ToCharArray())
            {
                string charToAppend = string.Empty;

                if (this.currentRightGuesses.Contains(c))
                {
                    stringBuilder.Append(this.answer[index]);
                }
                else
                {
                    if (Char.IsLetter(c))
                    {
                        stringBuilder.Append("-");
                        gameEnded = false;
                    }
                    else
                    {
                        stringBuilder.Append(" ");
                    }
                }

                this.lblHiddenWord.Text = stringBuilder.ToString();

                index++;
            }

            if (gameEnded)
            {
                DialogResult dialogResult = MessageBox.Show("Nyt Spil?", "Hangman", MessageBoxButtons.OKCancel);

                if (dialogResult == DialogResult.OK)
                {
                    this.initializeGame();
                }
            }
        }

        /// <summary>
        /// Opdaterer label med forkerte svar.
        /// </summary>
        private void UpdateWrongAnswers()
        {
            StringBuilder stringBuilder = new StringBuilder();

            foreach (char c in this.currentWrongGuesses)
            {
                stringBuilder.AppendFormat("{0} ", c);
            }

            this.lblWrongLetters.Text = stringBuilder.ToString();
        }

        private void Form1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
        {
            this.Guess(e.KeyChar);
        }

        private void Guess(char c)
        {
            char pressedChar = Char.ToUpper(c);

            if (!Char.IsLetter(pressedChar))
            {
                MessageBox.Show(" Gæt kun med bogstaver!");
                return;
            }

            if (this.currentRightGuesses.Contains(pressedChar) || this.currentWrongGuesses.Contains(pressedChar))
            {
                MessageBox.Show(string.Format("Du har allerede gættet på bogstavet {0}", pressedChar));
            }
            else
            {
                if (this.rightGuesses.Contains(pressedChar))
                {
                    this.currentRightGuesses.Add(pressedChar);
                }
                else
                {
                    this.currentWrongGuesses.Add(pressedChar);
                }
            }

            this.UpdateHiddenWord();
            this.UpdateWrongAnswers();
        }
    }
}
Avatar billede tbrg Novice
07. november 2006 - 12:44 #3
Som Homer ville sige: D'oh! Den havde jeg ikke tænkt ordenligt igennem. Tusind tak for hjælpen. Du er super effektiv. Din kodeforslag ser god og overskuelig ud, så den arbejder jeg videre med.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester