myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Grundlagen von C# » Warum mal Hangman-Spiel bei jedem Buchstabendruck oder gar nicht mehr?
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Warum mal Hangman-Spiel bei jedem Buchstabendruck oder gar nicht mehr?

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
axelfxxx axelfxxx ist männlich
myCSharp.de-Mitglied

avatar-2105.gif


Dabei seit: 05.05.2006
Beiträge: 138
Entwicklungsumgebung: MS C# Express
Herkunft: Berlin, Deutschland


axelfxxx ist offline

Warum mal Hangman-Spiel bei jedem Buchstabendruck oder gar nicht mehr?

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo an Alle ;)

Aus lauter Langeweile hab ich mir mal das Spiel Hangman vorgenommen... (Ich weis dies gibts schon tausend mal)

Zum Programm: Ich lese eine Textdatei ein, welche mit Fragen und Antworten gefüllt ist. Der AW kriegt die Frage zu sehen, und in einer Listview ist die Antwort maskiert mit "__". Die Antwort wird in Buchstaben zerstückelt und in item.Tag hinterlegt.
Wenn der AW also nun einen falschen Buchstaben drückt (Buttons mit ClickEvent, welche bei jedem Click die Function CheckAufSieg abfragt), soll ein erster Balken gemalt werden. Ich habe nun gedacht: Wenn es keins mehr von den "__" da ist, hat man gewonnen, im anderen Fall wenn ein falscher Buchstabe hinter item.Tag steckt das dann ein Balken konmt.
Aber entweder malt der den Balken jetzt bei jedem Buchstaben, oder gar nicht !? Wo ist der Fehler?

Danke für die Hilfe ...

C#-Code:
private void CheckAufSieg()
        {
             ListViewItem itemx = listView1.FindItemWithText("__");
             if (itemx == null)
             {
                 MessageBox.Show("Gewonnen");
             }
             else if (itemx.Tag.Equals("__"))
             {
                 Galgen(galgenzaehler);
             }
        }

//und dies ist mein Galgen

private void Galgen(int Zustand)
        {
            Graphics g = pictureBox1.CreateGraphics();
            switch (Zustand)
            {
                case 1:
                    //unterster Balken
                    _ = pictureBox1.CreateGraphics();
                    g.DrawLine(new Pen(new SolidBrush(Color.Red), 12), 200, 600, 20, 600);
                    break;
                case 2:
                    //LinkerBalken
                    _ = pictureBox1.CreateGraphics();
                    g.DrawLine(new Pen(new SolidBrush(Color.Red), 12), 20, 600, 20, 200);
                    break;
                case 3:
                    //1. Balken oben
                    _ = pictureBox1.CreateGraphics();
                    g.DrawLine(new Pen(new SolidBrush(Color.Red), 12), 200, 200, 20, 200);
                    break;
                case 4:
                    //Strick
                    _ = pictureBox1.CreateGraphics();
                    g.DrawLine(new Pen(new SolidBrush(Color.Red), 12), 200, 200, 200, 250);
                    break;
                case 5:
                    //der Kopf
                    //1.nach rechts
                    //2.Höhe von oben
                    _ = pictureBox1.CreateGraphics();
                    g.DrawEllipse(new Pen(new SolidBrush(Color.Red), 12), new RectangleF(190, 245, 20, 20));
                    break;
                case 6:
                    //Hals
                    _ = pictureBox1.CreateGraphics();
                    g.DrawLine(new Pen(new SolidBrush(Color.Red), 12), 200, 300, 200, 270);
                    break;
                case 7:
                    //der Körper
                    //1.nach rechts
                    //2.Höhe von oben
                    _ = pictureBox1.CreateGraphics();
                    g.DrawEllipse(new Pen(new SolidBrush(Color.Red), 12), new RectangleF(190, 300, 20, 50));
                    break;
                case 8:
                    //erster Arm links
                    _ = pictureBox1.CreateGraphics();
                    g.DrawLine(new Pen(new SolidBrush(Color.Red), 12), 150, 240, 200, 330);
                    break;
                case 9:
                    //zweiter Arm rechts
                    _ = pictureBox1.CreateGraphics();
                    g.DrawLine(new Pen(new SolidBrush(Color.Red), 12), 250, 245, 200, 330);
                    break;
                case 10:
                    //erster Bein links
                    _ = pictureBox1.CreateGraphics();
                    g.DrawLine(new Pen(new SolidBrush(Color.Red), 12), 190, 330, 130, 400);
                    break;
                case 11:
                    //zweites Bein rechts
                    _ = pictureBox1.CreateGraphics();
                    g.DrawLine(new Pen(new SolidBrush(Color.Red), 12), 300, 380, 210, 330);
                    break;
            }

        }

//Wenn z.B. der A Buton gedrückt wird ...
private void Btn_A_Click(object sender, EventArgs e)
        {
            galgenzaehler += 1;
            foreach (ListViewItem items in listView1.Items)
            {
                if (!items.Tag.Equals("a") | items.Tag.Equals("A"))
                {

                    Galgen(galgenzaehler);
                }
                else
                {
                    items.Text = "A";
                    CheckAufSieg();
                }
            }
        }

Dieser Beitrag wurde 6 mal editiert, zum letzten Mal von axelfxxx am 11.01.2021 22:46.

Neuer Beitrag 11.01.2021 20:31 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
hypersurf hypersurf ist männlich
myCSharp.de-Mitglied

Dabei seit: 16.10.2008
Beiträge: 500
Entwicklungsumgebung: VS Studio 2019, Android Studio
Herkunft: Münster


hypersurf ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Neuer Beitrag 11.01.2021 22:01 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
axelfxxx axelfxxx ist männlich
myCSharp.de-Mitglied

avatar-2105.gif


Dabei seit: 05.05.2006
Beiträge: 138
Entwicklungsumgebung: MS C# Express
Herkunft: Berlin, Deutschland

Themenstarter Thema begonnen von axelfxxx

axelfxxx ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von hypersurf:
Hier steht die Lösung:  https://www.mycsharp.de/wbb2/thread.php?threadid=21782

Danke aber das war nicht meine Frage ... Mir fiel bei der Wahl des Titels nichts besseres ein, aber es geht nicht darum, das die PictureBox nicht richtig zeichnet, sondern das ich irgendwie einen Fehler in der Interaktion mit den Funktionen der Buttons und der Zeichnung des Galgens habe.

Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von axelfxxx am 11.01.2021 22:53.

Neuer Beitrag 11.01.2021 22:18 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Jamikus Jamikus ist männlich
myCSharp.de-Mitglied

Dabei seit: 15.11.2012
Beiträge: 238
Entwicklungsumgebung: MS Visual
Herkunft: Oberhausen (NRW)


Jamikus ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Würde meinen, dass Dein If in der Buchstaben-Prüfung nicht so arbeitet, wie gedacht.

Hätte eher folgendes erwartet:

C#-Code:
if (!items.Tag.Equals("a") || !items.Tag.Equals("A"))

bzw.

C#-Code:
if (!items.Tag.ToLower().Equals("a"))

Aber die Prüfung/den Programmablauf kannst Du einfach via Debugger nach schauen:  [Artikel] Debugger: Wie verwende ich den von Visual Studio?

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Jamikus am 12.01.2021 06:22.

Neuer Beitrag 12.01.2021 06:21 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
chilic
myCSharp.de-Poweruser/ Experte

Dabei seit: 12.02.2010
Beiträge: 2.061


chilic ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Vermutung rein vom ansehen deines Codes.
Wenn man einen Buchstaben eingibt, prüfst du für JEDE Stelle, ob sie diesen Buchstaben enthält oder nicht. Wenn nicht, zeichnest du den Galgen für JEDE falsche Stelle ein Stück weiter.
Das heißt, ein Wort mit 5 Buchstaben von denen einer der gedrückte ist, zeichnet den Galgen trotzdem um 4 Teile weiter.
Tatsächlich solltest du zuerst prüfen ob es eine Stelle mit dem Buchstaben gibt. Wenn ja, ALLE passenden Buchstaben aufdecken. Wenn nein, den Galgen um EIN Stück erweitern.


Was soll "_ = pictureBox1.CreateGraphics();" sein? Das kann m.M. raus.

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von chilic am 12.01.2021 06:33.

Neuer Beitrag 12.01.2021 06:32 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
axelfxxx axelfxxx ist männlich
myCSharp.de-Mitglied

avatar-2105.gif


Dabei seit: 05.05.2006
Beiträge: 138
Entwicklungsumgebung: MS C# Express
Herkunft: Berlin, Deutschland

Themenstarter Thema begonnen von axelfxxx

axelfxxx ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat:
Vermutung rein vom ansehen deines Codes.
Wenn man einen Buchstaben eingibt, prüfst du für JEDE Stelle, ob sie diesen Buchstaben enthält oder nicht. Wenn nicht, zeichnest du den Galgen für JEDE falsche Stelle ein Stück weiter.
Das heißt, ein Wort mit 5 Buchstaben von denen einer der gedrückte ist, zeichnet den Galgen trotzdem um 4 Teile weiter.
Tatsächlich solltest du zuerst prüfen ob es eine Stelle mit dem Buchstaben gibt. Wenn ja, ALLE passenden Buchstaben aufdecken. Wenn nein, den Galgen um EIN Stück erweitern.

Zitat von chilic:
Was soll "_ = pictureBox1.CreateGraphics();" sein? Das kann m.M. raus.

//Danke, für den Tip :) Intellisense spuckte mir das aus, hatte auch das Gefühl, das das doppelt gemoppelt ist.

Danke an Alle, wenn ich aber so mache:

C#-Code:
private void Btn_A_Click(object sender, EventArgs e)
        {
            galgenzaehler += 1;
            foreach (ListViewItem items in listView1.Items)
            {
                if (items.Tag.Equals("a") || items.Tag.Equals("A"))
                {
                  items.Text = "A";
                    CheckAufSieg();
                }
            }
        }

Dann weis ich nicht wie ich den Galgen weiter malen soll. Jetzt macht die Abfrage nämlich genau was sie soll: Sie prüft ob der Buchstabe richtig ist, für ALLE und weiter ? Ich glaube das bei CheckAufSieg der Galgen rein muss, aber ich weis gerade nicht wie ...

C#-Code:
private void CheckAufSieg()
        {
             ListViewItem itemx = listView1.FindItemWithText("__");
             if (itemx == null)
             {
                 MessageBox.Show("Gewonnen");
             }
             else if (itemx.Tag.Equals("__"))
             {
                 Galgen(galgenzaehler);
             }
        }

Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von axelfxxx am 12.01.2021 10:10.

Neuer Beitrag 12.01.2021 10:03 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
JimStark
myCSharp.de-Mitglied

avatar-1005.jpg


Dabei seit: 10.03.2020
Beiträge: 177
Entwicklungsumgebung: Visual Studio 6.0 Enterprise


JimStark ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Es wäre einfacher wenn du das mit Linq machst:
Pseudocode:

C#-Code:
// Gibt es in der Liste noch den Buchstaben "A":
if items.Any(c => c.Tag=="A"){
// alle aufdecken
   items.Where(c=>c.Tag=="A").Select(d=>d.Text = "a")
   ...
}else{
// gibt keine in der Liste ==> eins weiter zeichnen
   Galgenzaehler++;
   ...
}

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von JimStark am 12.01.2021 10:39.

Neuer Beitrag 12.01.2021 10:38 Beiträge des Benutzers | zu Buddylist hinzufügen
axelfxxx axelfxxx ist männlich
myCSharp.de-Mitglied

avatar-2105.gif


Dabei seit: 05.05.2006
Beiträge: 138
Entwicklungsumgebung: MS C# Express
Herkunft: Berlin, Deutschland

Themenstarter Thema begonnen von axelfxxx

axelfxxx ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Danke werde ich mal trsten ;)
Neuer Beitrag 12.01.2021 12:47 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
axelfxxx axelfxxx ist männlich
myCSharp.de-Mitglied

avatar-2105.gif


Dabei seit: 05.05.2006
Beiträge: 138
Entwicklungsumgebung: MS C# Express
Herkunft: Berlin, Deutschland

Themenstarter Thema begonnen von axelfxxx

axelfxxx ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Sorry ListViewItems können kein Linq, habs getestet...
Neuer Beitrag 12.01.2021 12:51 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
JimStark
myCSharp.de-Mitglied

avatar-1005.jpg


Dabei seit: 10.03.2020
Beiträge: 177
Entwicklungsumgebung: Visual Studio 6.0 Enterprise


JimStark ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ja, war natürlich auch gedacht dass man das in eine eigene Klasse steckt und so die Schichten etwas trennt.

Beispiel:

C#-Code:
interface HangmanGame()
{
   void CheckLetter(char eingabe);
   string HiddenWord; // A _ _ _ ...
   int RemainingLetters;
   bool IsGameWon;
   event EventHandler NoLettersLeft;
...
}

// Edit:
und doch, das geht schon, wenn man das denn so machen möchte:
 https://stackoverflow.com/questions/6640...ions-in-c-sharp

Dieser Beitrag wurde 4 mal editiert, zum letzten Mal von JimStark am 12.01.2021 14:16.

Neuer Beitrag 12.01.2021 14:00 Beiträge des Benutzers | zu Buddylist hinzufügen
chilic
myCSharp.de-Poweruser/ Experte

Dabei seit: 12.02.2010
Beiträge: 2.061


chilic ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Na endlich auch hier der Hinweis "das geht auch mit Linq" ;-)
Neuer Beitrag 12.01.2021 19:17 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
axelfxxx axelfxxx ist männlich
myCSharp.de-Mitglied

avatar-2105.gif


Dabei seit: 05.05.2006
Beiträge: 138
Entwicklungsumgebung: MS C# Express
Herkunft: Berlin, Deutschland

Themenstarter Thema begonnen von axelfxxx

axelfxxx ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Danke Leute für Eure Hilfe :)

Mein Problem ist NICHT, das ich die Objekte in der Listview nicht selektieren und dementsprechen verändern /ansprechen kann sondern, das mir der Übergang vom gedrückten Buchstaben zum Sieg fehlt.

Ich denke so:
User drückt Buchstabe -> Hab ich
Code checkt ob Buchstabe vorhanden ist und deckt diesen auf -> Hab ich und nun kommts: Wie frage ich jetzt, in C# ,was passiert wenn der Buchstabe NICHT dem gedrückten entspricht ??? Wenn dann muss ich jetzt den Balken malen.

C#-Code:
if (item.Tag.Equals("A")
/alles toll
else if not
{
  ///male den Balken
}

Ich habs mit tausend Varianten probiert )Nach meinen geringen Kenntnisstand) Aber egal wie ich den Code drehe und wende ich komme NIE dahin das er erst dann den Balken malt, wenn der Buchstabe falsch ist...

Ich weis mit Linq könnte man die Sache vereinfachen, aber es geht mir gerade nicht ums vereinfachen, sonder wie ich mit meinem Code eine Lösung hinbekomme

Ich stecke im C# nicht so drin -> leider

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von axelfxxx am 14.01.2021 19:09.

Neuer Beitrag 14.01.2021 19:03 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
chilic
myCSharp.de-Poweruser/ Experte

Dabei seit: 12.02.2010
Beiträge: 2.061


chilic ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat:
was passiert wenn der Buchstabe NICHT dem gedrückten entspricht ???

Dann wird er nicht "aufgedeckt". Ansonsten passiert erst mal nichts.

Gehen wirs mal durch. Man gibt ein A ein.
Du prüfst die erste Stelle. Die ist kein A. Wird jetzt schon der Galgen weiter gezeichnet? Nein!
Du prüfst die zweite Stelle. Die ist auch kein A. Es wird immer noch nicht gezeichnet.
Du prüfst die ... Stelle. Die ist ein A. Gut dass du den Galgen noch nicht weiter gezeichnet hast!

Oder: du hast alle Stellen geprüft und nirgends war ein A dabei. DANN kannst du den Galgen weiter zeichnen.

Während du die einzelnen Stellen durchgehst, musst du dir merken ob mindestens eine davon den eingegebenen Buchstaben enthält. Am besten in einem Bool, den du für jede passende Stelle auf true setzt.
Nach der Schleife über die Stellen weißt du dann ob dieser Buchstabe ein Treffer war.

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von chilic am 14.01.2021 19:19.

Neuer Beitrag 14.01.2021 19:16 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
axelfxxx axelfxxx ist männlich
myCSharp.de-Mitglied

avatar-2105.gif


Dabei seit: 05.05.2006
Beiträge: 138
Entwicklungsumgebung: MS C# Express
Herkunft: Berlin, Deutschland

Themenstarter Thema begonnen von axelfxxx

axelfxxx ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Danke @ chillic

ich gehe diesen Ansatz mal durch ... Danke für die Mühe ;)

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von axelfxxx am 14.01.2021 19:31.

Neuer Beitrag 14.01.2021 19:31 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum
Antwort erstellen


© Copyright 2003-2021 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 17.01.2021 04:50