Autor Beitrag
lukll1
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Do 21.08.14 16:37 
Hallo,

und zwar habe ich momentan folgendes Problem.

Ich erstelle ja wie ihr wisst gerade ein Quiz, habe dazu wie ihr mir schon erklärt habt eine Liste erstellt(mit Datenbankdaten). Jetzt will ich natürlich so machen, dass immer einee Zufallszahl zwischen 1-4 gemacht wird und dann die richtige Antwort einmal im 1. btn drinnen ist, einmal im 4ten usw, denn macht ja keinen Sinn, wenn die richtige Antwrot immer im 1. btn ausgegeben wird und in den anderen 3 btn die falschen antworten drinnen sind...

Leider macht das oben beschriebene, dass sie immer woanders drinnen sind, die Sache nicht einfacher, denn ich will erreichen, wenn der Benutzer die richtige Antwort anklickt, dass dann die richtige Antwort grün eingefärbt wird, und wenn er eine falsche Antwrot anklickt dass rot eingefärbt wird, ich denke, dass mit der Färbung kriege ich dann schon hin, aber wie kann man das machen, dass der Computer das erkennt, das der Benutzer die richtige Antwrot anklickt?

hier sind die fragen gespeichert und die richtige, bzw, die drei falschen antworten

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
 m_lbfrage.Text = auswahl.Fragen;
m_btnauswahl4.Text = auswahl.Antwortrichtig;
m_btnauswahl1.Text = auswahl.Antwortfalsch;
m_btnauswahl2.Text = auswahl.Antwortfalsch1;
m_btnauswahl3.Text = auswahl.Antwortfalsch2;
C#
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: Do 21.08.14 21:53 
Hallo,

ich würde das ganze so angehen, dass ich die 4 Antowrten oder die 4 Buttons in einer Liste oder einem Array ablege und dann Random benutze, um eine Zufallszahl zwischen 0 und 3 zu erhalten. Diese Zahl kannst du dann als Index für deine Liste benutzen.
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
string[] antworten = { auswahl.Antwortrichtig, auswahl.Antwortfalsch, auswahl.Antwortfalsch1, auswahl.Antwortfalsch2 };
int rdm = new Random().Next(04);
m_btnauswahl1.Text = antworten[rdm];
m_btnauswahl2.Text = antworten[++rdm % 4];
m_btnauswahl3.Text = antworten[++rdm % 4];
m_btnauswahl4.Text = antworten[++rdm % 4];


So in der Art würde ich das angehen. Den Rest solltest du ohne Probleme schaffen ;)

_________________
Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Do 21.08.14 23:12 
Also erst einmal würde ich eine Klasse erstellen, die den Antwort-Text enthält und die Info, ob sie richtig ist oder nicht.
Vier Antwort-Objekte in eine Liste. Beim Anzeigen hältst du das dann bereit und wenn Eines geklickt wird, kannst du nach schauen, ob die Wahl richtig ist.

Was den Zufall angeht, bevorzuge ich diese Variante:

ausblenden C#-Quelltext
1:
2:
3:
var list = new List<int>() { 1234 };
var rnd = new Random();
list.Sort((x1, x2) => rnd.Next(-12));
C#
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: Do 21.08.14 23:29 
Ob die Antwort richtig ist kann er ja via button.Text und Antwortrichtig prüfen. Dein Random Verfahren ist interessant. Hab ich so noch nie verwendet - werde ich mir merken :)
Mein Code sollte nur als Beispiel dienen wie man es machen könnte. Wenn man es richtig machen will, sollte er eine Liste der Buttons und der Antworten anlegen.
Statt
ausblenden C#-Quelltext
1:
2:
3:
4:
auswahl.Antwortrichtig;
auswahl.Antwortfalsch;
auswahl.Antwortfalsch1;
auswahl.Antwortfalsch2;

sollte er einfach
ausblenden C#-Quelltext
1:
auswahl.Antworten					

als Liste anlegen und dabei index 0 als richtige Antwort nehmen.
Dann kann man deine Random-Methode wunderbar auf eine List<Button> anwenden und diese durchwürfeln.

Button.Tag könnte man auch benutzen um die Antowrt als richtig zu markieren.

_________________
Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Fr 22.08.14 05:45 
Die Tag-Property wäre eine Idee, aber wie werden die Information vorher gespeichert?
Wenn ich das richtig verstanden habe, kommen die aus einer Datenbank und dort muss dann auch irgendwie stehen, welche Antwort richtig ist.
Da würde ich dann diese Variante nehmen, also eine Tabelle, wo der Text drin steht und ein Bit-Flag, was an gibt, ob die Antwort richtig ist oder falsch. Und das würde ich dann einfach nur so auf die Objekt-Struktur übertragen.
lukll1 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Fr 22.08.14 09:51 
Hallo und danke für die Antworten!!!!

also:
user profile iconC# hat folgendes geschrieben Zum zitierten Posting springen:

ausblenden C#-Quelltext
1:
2:
3:
4:
m_btnauswahl1.Text = antworten[rdm];
m_btnauswahl2.Text = antworten[++rdm % 4];
m_btnauswahl3.Text = antworten[++rdm % 4];
m_btnauswahl4.Text = antworten[++rdm % 4];



Dass mit den Zufallszahlen und Array erstellen verstehe ich ohne Probleme(ich verstehe auch was dieser Ausdruck macht, also im ganzen), aber was mmacht dieses[++rdm %4]? ist dass eine verkürze Form für eine for-schleife? also dass rdm die Zufallszahl ist ist schon klar, aber die anderen sachen in dieser Klammer verstehe ich leider nicht, und ich denke einfach reinkopieren hat ja auch keinen sinn, man soll ja schon verstehen was man hier genau macht

Palladin007 ich habe dein Random verfahren auch noch nie gemacht, deshalb habe ich mich für die andere Variante entschieden

Ja, die Daten kommen von einer Datenbank,
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Fr 22.08.14 12:29 
ausblenden C#-Quelltext
1:
++rdm					


Das bedeutet, dass die Zahlum 1 erhöht wird.
Steht das ++ vorne, wird das erhöhte Ergebnis gleich mit verwenden, steht es hinter der Variable, dann wird der Wert erst nach der Verwendung erhöht.


ausblenden C#-Quelltext
1:
%					


Das ist das Modulo-Zeichen.
Es steht für Division mit Rest, der Rest ist das Ergebnis.


Was mein "Random-Verfahren" angeht:

Das ist kein spezielles Verfahren, es ist einfach nur die Sort-Methode von IEnumerable.
Die verlangt eine Methode, die -1, 0, oder 1 zurück gibt. Je nach dem werden die zwei verglichenen Elemente positioniert.
Da hier zufällig -1 bis 1 zurück gegeben wird, ist die Sortierung aus zufällig.


Datenbank:

Steht da drin, welche Antwort richtig ist?
Wenn ja, dann nimm das in einem Objekt mit. Meine Meinung steht oben, du kannst aber auch gerne andere Lösungen finden.
Aber so oder so musst du diese Daten bereit halten und dann dort in dem Objekt schauen, ob die richtige Antwort gewählt wurde.
Wenn das da nicht drin steht, dann gibt es keine Möglichkeit, das sinnvoll heraus zu finden, welche ANtwort nun die Richtig ist.
C#
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: Fr 22.08.14 12:46 
Genau.
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
++rdm;
// oder 
rdm++;
// bedeutet nichts anderes als 
rdm = rdm + 1;

Der Wert wird bei jedem ++ um 1 erhöht, sowie er bei -- um 1 verringert wird. Der neue Wert wird in der gleichen Variable gespeichert
Wann das ++ vor oder hinter der Variable steht hat Palladin007 ja schon gesagt.
Die % 4 macht eine Modulorechnung. Dabei wird die Zahl durch 4 geteilt und der Rest als Ergebnis geliefert, also
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
rdm = 2;
++rdm % 4 // 3 % 4 -> 3 / 4 = 0 -> Rest = 3
++rdm % 4 // 4 % 4 -> 4 / 4 = 1 -> Rest = 0
++rdm % 4 // 5 % 4 -> 5 / 4 = 1 -> Rest = 1
++rdm % 4 // 6 % 4 -> 6 / 4 = 1 -> Rest = 2

Wie du siehst hast du nun alle Zahlen von 0 bis einschließlich 3.

_________________
Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
lukll1 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Fr 22.08.14 12:55 
ok, danke euch beiden für die erklärung, jetzt verstehe ich es.

Ja, in der Datenbank steht schon drinnen welche Antwort die richtige ist, also in einer Spalte der Datenbank sind alle richtigen Antworten drinnen., die richtigen Antworten sind bei mir unter auswahl.Antwortrichtig gespeichert.
lukll1 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: So 24.08.14 09:47 
für alle die später das gleiche problem haben, meine lösung:

ich habe eine globale string variable erstellt(in meinem fall: probieren[weil ich es zuerst probieren wollte :D ]), in diese habe ich die richtigen antworten der datenbank gespeichert, dann habe ich es einfach mit einer if-anweisung gelöst, also
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
if(_btn1.Text==probieren)
{
MessageBox.Show("Richtig");
}
else
{
MeesageBox.Show("Falsch");
}