Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπερα ! Μαθαινω C# και θελω μια βοηθεια. Προσπαθω να κανω μια κρεμμαλα. Εχω φτιαξει σχεδον τα παντα. Εχω ομως το εξης προβλημα. Εχω βαλει ενα label, που γραφει στον παικτη, ποσες προσπαθειες μενουν ακομα. Θελω καθε φορα που ο παικτης δοκιμαζει λαθος γραμμα, οι προσπαθειες να μειονονται. Αλλα δεν ξερω πως να κανω. Δεν μου ερχετε καμια ιδεα :(

 

 Καμια ιδεα τι μπορω να κανω ??

 

no hate

Δημοσ.

Καταρχάς φτιάξε μια μεταβλητή int για τον αριθμό προσπαθειών. Κάθε φορά που o χρήστης εισάγει ένα γράμμα, κάνε έλεγχο αν το γράμμα αντιστοιχεί στη λέξη, και αν όχι, μείωσε τη τιμή της μεταβλητής προσπαθειών μια μονάδα. Ίσως να σε βόλευε να φτιάξεις πίνακες τύπου char όπου κάθε στοιχείο θα αντιστοιχεί και σε ένα γράμμα της λέξης, ώστε έτσι να ελέγξεις ότι αν η εισαγωγή χρήστη αντιστοιχεί σε στοιχείο του τρέχων πίνακα, να μειώνεται η μεταβλητή κατά 1

Δημοσ.

 

namespace kremala

{

 

 

 

    public partial class Form1 : Form

    {

 

 

     

 

        String word = "ΑΓΑΠΑΩ";

 

        public Form1()

        {

            InitializeComponent();

        }

 

        List<Label> letters = new List<Label>();

 

        private void Form1_Load(object sender, EventArgs e)

        {

            letters.Add(label1);

            letters.Add(label2);

            letters.Add(label3);

            letters.Add(label4);

            letters.Add(label5);

            letters.Add(label6);

        }

      

        private void check_letter(char a)

        {

 

            a = Char.ToUpper(a);

           

 

            for (int i = 0; i < word.Length; i++)

            {

                if (word == a)

                {

                    letters.Text = a.ToString();

                  

                }

               

                if (word == a)

                {

 

                    MessageBox.Show("Το βρήκες, μπράβο !!");

                }

                

            }

 

        }

        public void Disable_Check()

    {

            if(textBox1.Text.Length == 0)

            {

                Button1.Enabled = false;

            }

            else

            {

                Button1.Enabled = true;

            }

    }

 

        public void Check_Letter()

        {

 

        }

        

        

        private void Button1_Click(object sender, EventArgs e)

        {

 

            char ch = '\0';

           

           

 

            if (textBox1.Text.Length > 0)

            {

                ch = textBox1.Text[0];

            }

            else {

                MessageBox.Show("Δώσε ενα γράμμα!");

            }

            

            

            check_letter(ch);

 

            

            /*

            for (int a = 0; a < letters.Count; a++)

            {

                letters[a].Text = a.ToString();

            }

 

            label1.Text = "0";

            label2.Text = "1";

            label3.Text = "2";

            label4.Text = "3";

            label5.Text = "4";

            label6.Text = "5";

             */

            

        }

 

        private void textBox1_TextChanged(object sender, EventArgs e)

        {

            Disable_Check();

        }

    }

}

 

Αυτος ειναι ο κωδικας. Ειναι ΓΤΠ αλλα τελος παντων. Οι προσπαθειες ειναι στο label 9. Εγω αυτο που σκεφτηκα, ειναι να γραψω, εκει που γραφει:

 

for (int i = 0; i < word.Length; i++)

            {

                if (word == a)

                {

                    letters.Text = a.ToString();

                  

                }

               

                if (word == a)

                {

 

                    MessageBox.Show("Το βρήκες, μπράβο !!");

                }

Κατω απο το "το βρηκες μπραβο" ενα else που να μειωνει τις προσπαθειες. Αλλα δεν ξερω πως να το γραψω.... μου βγαζει error συνεχεια...

Δημοσ.

Δεν ξέρω την γλώσσα και είμαι αρχάριος αλλά υποθέτω ότι βάζεις μια μεταβλητή που έχει τις προσπαθείς πχ 3. Όταν κανείς τον έλεγχο αν αυτό που δίνει υπάρχει θα προσθέσεις όταν δεν αντιστοιχεί κάπου

προσπάθειες =προσπαθειεσ -1.. Και όλη η κρεμάλα μέσα σε ένα while προσπάθειες >0

Δημοσ.

Έχεις γράμματα μαζί, τα οποία για εσένα είναι μία λέξη. Θέλεις όμως να βρίσκεις (γρήγορα) το γράμμα εάν υπάρχει στη λέξη αλλά και να ξέρεις σε ποια θέση είναι το γράμμα. 

 

 

Κάθε αντικειμενοστρεφής γλώσσα έχει αυτό που λέγεται containers. Δηλαδή, κλάσεις που έχουν φτιαχτεί για να κρατάνε μέσα τους πολλά αντικείμενα. Ότι είναι ένα κοντέινερ για τα αντικείμενα στην "πραγματική ζωή", έτσι είναι αυτές οι κλάσεις για τα αντικείμενα/δεδομένα στον OOP. 

 

 

Αντί λοιπόν να έχεις ένα char[], μπορείς (π.χ.) να έχεις αυτό που στην Java λέγεται HashMap και στην C# dictionary. Αυτή την κλάση μπορείς να την δεις σαν τον associative array της PHP. Δηλαδή, έναν πίνακα που έχεις συσχετίσεις (π.χ.): 

"first element" => Object

Έτσι, θα μπορούσες να βάλεις το κάθε γράμμα να έχει την θέση του, δηλαδή:

"S" => 1,
"A" => 2, 
"G" => 3, 
"A" => 4, 
"P" => 5, 
"0" => 6

Γιατί να το κάνεις αυτό όμως;

 

 

Θες να βρεις εάν το γράμμα που δόθηκε υπάρχει στην λέξη; Αντί να κάνεις ένα for loop, θα έχεις:

Dictionary<string, string> theLetters = new Dictionary<string, int>();
 
// Γεμίζεις το dictionary
// Παίρνεις το letter στην μεταβλητή: userInputLetter
 
if ( theLetters.ContainsKey(userInputLetter) && theLetters.item[userInputLetter] != -1 /* Ελέγχεις ότι δεν το έχει ξαναβρεί */) {
  // Τύπωσε ότι βρήκε ένα γράμμα και
  int indexOfLetterInWord = theLetters.item[userInputLetter]; //Παίρνείς το που είναι το γράμμα στην λέξη
  theLetters.item[userInputLetter] = -1; /* Σημαδεύεις ότι το βρήκε */
} else {
  // Κάνε ότι θέλεις όταν δεν το βρίσκει, π.χ. μείωσε προσπάθειες */
}

Εάν δηλώσεις το Dictionary ως 

Dictionary<string, ArrayList>();

Τότε θα μπορείς να έχεις για κάθε ένα γράμμα και πολλαπλές εμφανίσεις μέσα στην λέξη και στην περίπτωση που ένα γράμμα έχει βρεθεί, κάνεις το length του ArrayList 0 είτε του βάζεις ένα στοιχείο και ίσο με -1. 

 

Το λάθος που έχεις στον κώδικά σου είναι, με μία πρώτη ματιά, λογικό λάθος στις συνθήκες που έχεις στο for loop για τον έλεγχο του εάν υπάρχει το γράμμα στην λέξη. Με έναν container θα ξενοιάσεις. 


Υ.Γ. Επειδή δεν είμαι της C#, ενδεχομένως να έχει Interfaces για τα containers όπως η JAVA για τα δικά της. Έτσι, θα μπορούσες να δηλώσεις (π.χ.) το dictionary ως

Map<string, List> = new Dictionary<string, ArrayList>

Μην μπερδευτείς... σκέψου ότι το Map είναι ένα συμβόλαιο που υπογράφουν πολλά containers (ή collections όπως λέγονται) για να μπορείς εσύ να λες ότι "έχω Map" (και άρα έχεις standard μεθόδους) και στην πραγματικότητα να έχεις όποια κλάση θέλεις η οποία έχει υπογράψει αυτό το συμβόλαιο. 

 

Εάν όντως έχει (που θα μου φανεί περίεργο να μην έχει), τότε καλύτερα να χρησιμοποιήσεις τα interfaces παρά τις actual classes. 

 

Π.χ., σε JAVA το παραπάνω γράφεται ως:

 

 

Map<String, List<Integer>> theLetters;
theLetters = new HashMap<String, List<Integer>>();

 

Αυτό δίνει την ευκαιρία αργότερα να γίνει η αλλαγή:

 

 

theLetters = new TreeMap<String, List<Integer>>();

 

χωρίς να αλλάξεις ΤΙΠΟΤΑ άλλο στον κώδικά σου, επειδή βλέπεις την μεταβλητή theLetters ως Map και όχι ως τι "πραγματικά" είναι.

Δημοσ.

Έχεις γράμματα μαζί, τα οποία για εσένα είναι μία λέξη. Θέλεις όμως να βρίσκεις (γρήγορα) το γράμμα εάν υπάρχει στη λέξη αλλά και να ξέρεις σε ποια θέση είναι το γράμμα. 

 

 

Κάθε αντικειμενοστρεφής γλώσσα έχει αυτό που λέγεται containers. Δηλαδή, κλάσεις που έχουν φτιαχτεί για να κρατάνε μέσα τους πολλά αντικείμενα. Ότι είναι ένα κοντέινερ για τα αντικείμενα στην "πραγματική ζωή", έτσι είναι αυτές οι κλάσεις για τα αντικείμενα/δεδομένα στον OOP. 

 

 

Αντί λοιπόν να έχεις ένα char[], μπορείς (π.χ.) να έχεις αυτό που στην Java λέγεται HashMap και στην C# dictionary. Αυτή την κλάση μπορείς να την δεις σαν τον associative array της PHP. Δηλαδή, έναν πίνακα που έχεις συσχετίσεις (π.χ.): 

"first element" => Object

Έτσι, θα μπορούσες να βάλεις το κάθε γράμμα να έχει την θέση του, δηλαδή:

"S" => 1,
"A" => 2, 
"G" => 3, 
"A" => 4, 
"P" => 5, 
"0" => 6

Γιατί να το κάνεις αυτό όμως;

 

 

Θες να βρεις εάν το γράμμα που δόθηκε υπάρχει στην λέξη; Αντί να κάνεις ένα for loop, θα έχεις:

Dictionary<string, string> theLetters = new Dictionary<string, int>();
 
// Γεμίζεις το dictionary
// Παίρνεις το letter στην μεταβλητή: userInputLetter
 
if ( theLetters.ContainsKey(userInputLetter) && theLetters.item[userInputLetter] != -1 /* Ελέγχεις ότι δεν το έχει ξαναβρεί */) {
  // Τύπωσε ότι βρήκε ένα γράμμα και
  int indexOfLetterInWord = theLetters.item[userInputLetter]; //Παίρνείς το που είναι το γράμμα στην λέξη
  theLetters.item[userInputLetter] = -1; /* Σημαδεύεις ότι το βρήκε */
} else {
  // Κάνε ότι θέλεις όταν δεν το βρίσκει, π.χ. μείωσε προσπάθειες */
}

Εάν δηλώσεις το Dictionary ως 

Dictionary<string, ArrayList>();

Τότε θα μπορείς να έχεις για κάθε ένα γράμμα και πολλαπλές εμφανίσεις μέσα στην λέξη και στην περίπτωση που ένα γράμμα έχει βρεθεί, κάνεις το length του ArrayList 0 είτε του βάζεις ένα στοιχείο και ίσο με -1. 

 

Το λάθος που έχεις στον κώδικά σου είναι, με μία πρώτη ματιά, λογικό λάθος στις συνθήκες που έχεις στο for loop για τον έλεγχο του εάν υπάρχει το γράμμα στην λέξη. Με έναν container θα ξενοιάσεις. 

Υ.Γ. Επειδή δεν είμαι της C#, ενδεχομένως να έχει Interfaces για τα containers όπως η JAVA για τα δικά της. Έτσι, θα μπορούσες να δηλώσεις (π.χ.) το dictionary ως

Map<string, List> = new Dictionary<string, ArrayList>

Μην μπερδευτείς... σκέψου ότι το Map είναι ένα συμβόλαιο που υπογράφουν πολλά containers (ή collections όπως λέγονται) για να μπορείς εσύ να λες ότι "έχω Map" (και άρα έχεις standard μεθόδους) και στην πραγματικότητα να έχεις όποια κλάση θέλεις η οποία έχει υπογράψει αυτό το συμβόλαιο. 

 

Εάν όντως έχει (που θα μου φανεί περίεργο να μην έχει), τότε καλύτερα να χρησιμοποιήσεις τα interfaces παρά τις actual classes. 

 

Π.χ., σε JAVA το παραπάνω γράφεται ως:

Map<String, List<Integer>> theLetters;
theLetters = new HashMap<String, List<Integer>>();

Αυτό δίνει την ευκαιρία αργότερα να γίνει η αλλαγή:

theLetters = new TreeMap<String, List<Integer>>();

χωρίς να αλλάξεις ΤΙΠΟΤΑ άλλο στον κώδικά σου, επειδή βλέπεις την μεταβλητή theLetters ως Map και όχι ως τι "πραγματικά" είναι.

Ουαου ! Ευχαριστω πολυ που εκανες τοσο κοπο για να μου τα εξηγισεις ολα αυτα, αλλα ειμαι πολυ αρχαριος γι'αυτα που μου λες. Χρειαζομε κατι πιο απλο. Κατι για dummies. ΠΧ μια  else εδω: http://prntscr.com/8gndxh στην οποια θα λεει να μειωσει τον αριθμο στο label. Αλλα μεχρι τωρα, οτι εντολες ξερω τις εχω βαλει, και τις βγαζει λαθος...

Δημοσ.

Εάν δεν προσπαθήσεις θα είσαι πάντα αρχάριος.

 

Τα containers και τα interfaces τους είναι πολύ βασικό και ίσως πιο χρήσιμο από το να κάνεις ένα loop σε ένα array.

  • Moderators
Δημοσ.

δεν υπάρχει main στο κώδικα, απο πού ξεκινάει?

 

Θα κάνω μια μαντεψιά και θα πω από δω

 

   private void Form1_Load

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...