Ονειρολογίτης Δημοσ. 14 Σεπτεμβρίου 2015 Δημοσ. 14 Σεπτεμβρίου 2015 Καλησπερα ! Μαθαινω C# και θελω μια βοηθεια. Προσπαθω να κανω μια κρεμμαλα. Εχω φτιαξει σχεδον τα παντα. Εχω ομως το εξης προβλημα. Εχω βαλει ενα label, που γραφει στον παικτη, ποσες προσπαθειες μενουν ακομα. Θελω καθε φορα που ο παικτης δοκιμαζει λαθος γραμμα, οι προσπαθειες να μειονονται. Αλλα δεν ξερω πως να κανω. Δεν μου ερχετε καμια ιδεα Καμια ιδεα τι μπορω να κανω ?? no hate
Tmark Δημοσ. 14 Σεπτεμβρίου 2015 Δημοσ. 14 Σεπτεμβρίου 2015 Δείξε μας τι έχεις προσπαθήσει ως τώρα από πλευράς κώδικα.
Alithinos Δημοσ. 14 Σεπτεμβρίου 2015 Δημοσ. 14 Σεπτεμβρίου 2015 Καταρχάς φτιάξε μια μεταβλητή int για τον αριθμό προσπαθειών. Κάθε φορά που o χρήστης εισάγει ένα γράμμα, κάνε έλεγχο αν το γράμμα αντιστοιχεί στη λέξη, και αν όχι, μείωσε τη τιμή της μεταβλητής προσπαθειών μια μονάδα. Ίσως να σε βόλευε να φτιάξεις πίνακες τύπου char όπου κάθε στοιχείο θα αντιστοιχεί και σε ένα γράμμα της λέξης, ώστε έτσι να ελέγξεις ότι αν η εισαγωγή χρήστη αντιστοιχεί σε στοιχείο του τρέχων πίνακα, να μειώνεται η μεταβλητή κατά 1
Ονειρολογίτης Δημοσ. 14 Σεπτεμβρίου 2015 Μέλος Δημοσ. 14 Σεπτεμβρίου 2015 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 συνεχεια...
kaliakman Δημοσ. 15 Σεπτεμβρίου 2015 Δημοσ. 15 Σεπτεμβρίου 2015 Δεν ξέρω την γλώσσα και είμαι αρχάριος αλλά υποθέτω ότι βάζεις μια μεταβλητή που έχει τις προσπαθείς πχ 3. Όταν κανείς τον έλεγχο αν αυτό που δίνει υπάρχει θα προσθέσεις όταν δεν αντιστοιχεί κάπου προσπάθειες =προσπαθειεσ -1.. Και όλη η κρεμάλα μέσα σε ένα while προσπάθειες >0
groot Δημοσ. 15 Σεπτεμβρίου 2015 Δημοσ. 15 Σεπτεμβρίου 2015 Έχεις γράμματα μαζί, τα οποία για εσένα είναι μία λέξη. Θέλεις όμως να βρίσκεις (γρήγορα) το γράμμα εάν υπάρχει στη λέξη αλλά και να ξέρεις σε ποια θέση είναι το γράμμα. Κάθε αντικειμενοστρεφής γλώσσα έχει αυτό που λέγεται 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 και όχι ως τι "πραγματικά" είναι.
Ονειρολογίτης Δημοσ. 15 Σεπτεμβρίου 2015 Μέλος Δημοσ. 15 Σεπτεμβρίου 2015 Έχεις γράμματα μαζί, τα οποία για εσένα είναι μία λέξη. Θέλεις όμως να βρίσκεις (γρήγορα) το γράμμα εάν υπάρχει στη λέξη αλλά και να ξέρεις σε ποια θέση είναι το γράμμα. Κάθε αντικειμενοστρεφής γλώσσα έχει αυτό που λέγεται 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. Αλλα μεχρι τωρα, οτι εντολες ξερω τις εχω βαλει, και τις βγαζει λαθος...
groot Δημοσ. 15 Σεπτεμβρίου 2015 Δημοσ. 15 Σεπτεμβρίου 2015 Εάν δεν προσπαθήσεις θα είσαι πάντα αρχάριος. Τα containers και τα interfaces τους είναι πολύ βασικό και ίσως πιο χρήσιμο από το να κάνεις ένα loop σε ένα array.
alan2 Δημοσ. 15 Σεπτεμβρίου 2015 Δημοσ. 15 Σεπτεμβρίου 2015 δεν υπάρχει main στο κώδικα, απο πού ξεκινάει?
Moderators Kercyn Δημοσ. 15 Σεπτεμβρίου 2015 Moderators Δημοσ. 15 Σεπτεμβρίου 2015 δεν υπάρχει main στο κώδικα, απο πού ξεκινάει? Θα κάνω μια μαντεψιά και θα πω από δω private void Form1_Load
παπι Δημοσ. 15 Σεπτεμβρίου 2015 Δημοσ. 15 Σεπτεμβρίου 2015 Θα κάνω μια μαντεψιά και θα πω από δω private void Form1_Load Form1 constructor.
Moderators Kercyn Δημοσ. 15 Σεπτεμβρίου 2015 Moderators Δημοσ. 15 Σεπτεμβρίου 2015 Form1 constructor. Ναιιιιι αλλά πότε βλέπει ο χρήστης κάτι για πρώτη φορά; I win, you lose!
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα