Problem mit einem Quiz
Übersicht

![]() |
J.R.Betreff: Problem mit einem Quiz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo Allerseits,
ich bin momentan dabei ein kleines Quiz zu schreiben. Doch leider habe ich dabei immer gegen einen Logikfehler zu kämpfen, nämlich das eine richtige Antwort als falsch angezeigt wird. Obwohl sie meiner Meinung nach richtig sein müsste. Wenn ich im UP bei der Antwort C die Aufforderung "gosub F" mit ; deaktiviere, dann wird zwar bei der ersten Frage C als richtig gewertet, aber dann stimmt das ganze Programm nicht mehr. Obwohl mein Quiz nur aus ein paar Zeilen besteht, sitze ich schon lange davor und versuche den Fehler zu finden...bloß finde ich ihn einfach nicht. Ich hoffe, Ihr könnt mir weiterhelfen. Hier mein Programm: Code: [AUSKLAPPEN] AppTitle "QUIZ" Graphics 800,600 SetBuffer BackBuffer() Antworttafel = LoadImage("Antworttafel.bmp") Fragetafel = LoadImage("Fragetafel.bmp") Punkteanzeige= LoadImage("Punkte.bmp") Maus = LoadImage("pointer.bmp") P = 0 ;Punkte I = 1 ;Frage-Nr. ; Dim Fragen$(3,6) ;Frage 1 Fragen$(1,0) = "Wann wurde Bismarck entlassen?" Fragen$(1,1) = "A:1870" ;A Fragen$(1,2) = "B:1880" ;B Fragen$(1,3) = "C:1890" ;C Fragen$(1,4) = "D:1900" ;D Fragen$(1,5) = "C" ;= Richtige Antwort ;Frage 2 Fragen$(2,0) = "In welches Land ging Wilhelm II. 1918 ins Exil?" Fragen$(2,1) = "A:Niederlande" ;A Fragen$(2,2) = "B:Belgien" ;B Fragen$(2,3) = "C:England" ;C Fragen$(2,4) = "D:Schweiz" ;D Fragen$(2,5) = "A" ;= Richtige Antwort ;Frage 3 Fragen$(3,0) = "Wann endete der 2.Weltkrieg?" Fragen$(3,1) = "A:1940" ;A Fragen$(3,2) = "B:1942" ;B Fragen$(3,3) = "C:1944" ;C Fragen$(3,4) = "D:1945" ;D Fragen$(3,5) = "D" ;= Richtige Antwort ; hier ins Unterprogramm gehen und die Frage stellen - Frage richtig - Return hierhin zurück und nächste Frage stellen - Frage richtig Gosub UP Gosub UP Gosub UP WaitKey End ; ; ;;;;;;;;;;;;;;Ende des Hauptprogramms, es folgen nun die Unterprogramme;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; .UP ;= Unterprogramm zum Stellen der Fragen Repeat Flip Cls X = MouseX() Y = MouseY() DrawImage Maus,X,Y ; DrawImage Fragetafel,220,120 Text 225,125,Fragen$(I,0) ;Frage ; DrawImage Punkteanzeige,680,30 Text 720,60,P ;Punkteanzeige ; DrawImage Antworttafel,100,300 Text 105,305,Fragen$(I,1) ;Antwort A ; DrawImage Antworttafel,500,300 Text 505,305,Fragen$(I,2) ;Antwort B ; DrawImage Antworttafel,100,400 Text 105,405,Fragen$(I,3) ;Antwort C ; DrawImage Antworttafel,500,400 Text 505,405,Fragen$(I,4) ;Antwort D ; If ImageRectCollide ( Maus,X,Y,0,100,300,200,50) And MouseDown(1) = 1 And Fragen$(I,5) = "A" Then ;Antwort A richtig? Text 400,300,"Richtig"P = P + 1 I = I +1 Return ElseIf ImageRectCollide ( Maus,X,Y,0,100,300,200,50) And MouseDown(1) = 1 And Fragen$(I,5) <> "A" Then ;Antwort A falsch? Text 400,300,"Falsch, die richtige Antwort lautet " + Fragen$(I,5) Gosub F ; ElseIf ImageRectCollide ( Maus,X,Y,0,500,300,200,50) And MouseDown(1) = 1 And Fragen$(I,5) = "B" Then ;Antwort B richtig? Text 400,300,"Richtig" P = P + 1 I = I + 1 Return ElseIf ImageRectCollide ( Maus,X,Y,0,500,300,200,50) And MouseDown(1) = 1 And Fragen$(I,5) <> "B" Then ;Antwort A falsch? Text 400,300,"Falsch, die richtige Antwort lautet " + Fragen$(I,5) Gosub F EndIf ; If ImageRectCollide ( Maus,X,Y,0,100,400,200,50) And MouseDown(1) = 1 And Fragen$(I,5) = "C" Then ;Antwort C richtig? Text 400,300,"Richtig" P=P+1 I=I+1 Return ElseIf ImageRectCollide ( Maus,X,Y,0,100,400,200,50) And MouseDown(1) = 1 And Fragen$(I,5) <> "C" Then ;Antwort A falsch? Text 400,300,"Falsch, die richtige Antwort lautet " + Fragen$(I,5) Gosub F EndIf ; If ImageRectCollide ( Maus,X,Y,0,500,400,200,50) And MouseDown(1) = 1 And Fragen$(I,5) = "D" Then ;Antwort D richtig? Text 400,300,"Richtig" P = P + 1 I = I + 1 Return ElseIf ImageRectCollide ( Maus,X,Y,0,500,400,200,50) And MouseDown(1) = 1 And Fragen$(I,5) <> "D" Then ;Antwort A falsch? Text 400,300,"Falsch, die richtige Antwort lautet " + Fragen$(I,5) Gosub F EndIf Until KeyHit(1) ; ; .F ;=UP für Fragen, die falsch beantwortet wurden Repeat Flip Cls X = MouseX() Y = MouseY() ; Text 300,200,"Leider falsch, die richtige Antwort lautet " + Fragen$(I,5) ; DrawImage Maus,X,Y ; DrawImage Fragetafel,220,120 Text 225,125,Fragen$(I,0) ;Frage ; DrawImage Punkteanzeige,680,30 Text 720,60,P ;Punkteanzeige ; DrawImage Antworttafel,100,300 Text 105,305,Fragen$(I,1) ;Antwort A ; DrawImage Antworttafel,500,300 Text 505,305,Fragen$(I,2) ;Antwort B ; DrawImage Antworttafel,100,400 Text 105,405,Fragen$(I,3) ;Antwort C ; DrawImage Antworttafel,500,400 Text 505,405,Fragen$(I,4) ;Antwort D Until KeyHit(1) End |
||
![]() |
sbrog |
![]() Antworten mit Zitat ![]() |
---|---|---|
ich habe mir das ganze nicht genau angesehen, aber es kann sein, dass es daran liegt, dass du irgendwo bei 1 anfängst zu zählen anstatt bei 0, sodass sich alles um 1 verschiebt.
Tipp : benutze select...case verzweigungen für solche Dinge, das ist viel übersichtlicher und auch noch schneller. |
||
![]() |
Ctuchik |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hab den Fehler behoben und das mal ein bissl modifiziert, kein schöner Code aber er läuft:
Code: [AUSKLAPPEN] AppTitle "QUIZ" Graphics 800,600 SetBuffer BackBuffer() Global Antworttafel = LoadImage("Antworttafel.bmp") Global Fragetafel = LoadImage("Fragetafel.bmp") Global Punkteanzeige = LoadImage("Punkte.bmp") Global Maus = LoadImage("pointer.bmp") Global P = 0 ;Punkte Global I = 1 ;Frage-Nr. Global X,Y ; Dim Fragen$(3,6) ;Frage 1 Fragen$(1,0) = "Wann wurde Bismarck entlassen?" Fragen$(1,1) = "A:1870" ;A Fragen$(1,2) = "B:1880" ;B Fragen$(1,3) = "C:1890" ;C Fragen$(1,4) = "D:1900" ;D Fragen$(1,5) = "C" ;= Richtige Antwort ;Frage 2 Fragen$(2,0) = "In welches Land ging Wilhelm II. 1918 ins Exil?" Fragen$(2,1) = "A:Niederlande" ;A Fragen$(2,2) = "B:Belgien" ;B Fragen$(2,3) = "C:England" ;C Fragen$(2,4) = "D:Schweiz" ;D Fragen$(2,5) = "A" ;= Richtige Antwort ;Frage 3 Fragen$(3,0) = "Wann endete der 2.Weltkrieg?" Fragen$(3,1) = "A:1940" ;A Fragen$(3,2) = "B:1942" ;B Fragen$(3,3) = "C:1944" ;C Fragen$(3,4) = "D:1945" ;D Fragen$(3,5) = "D" ;= Richtige Antwort ; hier ins Unterprogramm gehen und die Frage stellen - Frage richtig - Return hierhin zurück und nächste Frage stellen - Frage richtig Gosub UP timer = MilliSecs() + 2000 While (MouseDown(1) Or MilliSecs() < timer) Text 400,300,"Richtig" Render() Wend I = I + 1 Gosub UP timer = MilliSecs() + 2000 While (MouseDown(1) Or MilliSecs() < timer) Text 400,300,"Richtig" Render() Wend I = I + 1 Gosub UP ;End des Spiels While (Not KeyHit(1)) Text 400,300,"Richtig" Render() Wend End ; ; ;;;;;;;;;;;;;;Ende des Hauptprogramms, es folgen nun die Unterprogramme;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; .UP ;= Unterprogramm zum Stellen der Fragen Repeat Render() ; If ImageRectCollide ( Maus,X,Y,0,100,300,200,50) And MouseDown(1) Then ;Antwort A angeklickt? If Fragen$(I,5) = "A" Then ;Antwort A richtig? P = P + 1 : Return Else ;Antwort A falsch? Goto F End If ; ElseIf ImageRectCollide ( Maus,X,Y,0,500,300,200,50) And MouseDown(1) Then ;Antwort B angeklickt? If Fragen$(I,5) = "B" Then ;Antwort B richtig? P = P + 1 : Return Else ;Antwort B falsch? Goto F End If EndIf ; If ImageRectCollide ( Maus,X,Y,0,100,400,200,50) And MouseDown(1) Then ;Antwort C angeklickt? If Fragen$(I,5) = "C" Then ;Antwort C richtig? P = P + 1 : Return Else ;Antwort C falsch? Goto F End If EndIf ; If ImageRectCollide ( Maus,X,Y,0,500,400,200,50) And MouseDown(1) Then ;Antwort D angeklickt? If Fragen$(I,5) = "D" Then ;Antwort D richtig? P = P + 1 : Return Else ;Antwort D falsch? Goto F End If EndIf Until KeyHit(1) ;Ende von UP .F ;Frage falsch beantwortet Repeat Text 300,200,"Leider falsch, die richtige Antwort lautet " + Fragen$(I,5) Render() Until KeyHit(1) End ; Ende von F Function Render() DrawImage Fragetafel,220,120 Text 225,125,Fragen$(I,0) ;Frage ; DrawImage Punkteanzeige,680,30 Text 720,60,P ;Punkteanzeige ; DrawImage Antworttafel,100,300 Text 105,305,Fragen$(I,1) ;Antwort A ; DrawImage Antworttafel,500,300 Text 505,305,Fragen$(I,2) ;Antwort B ; DrawImage Antworttafel,100,400 Text 105,405,Fragen$(I,3) ;Antwort C ; DrawImage Antworttafel,500,400 Text 505,405,Fragen$(I,4) ;Antwort D X = MouseX() Y = MouseY() DrawImage Maus,X,Y ;Mauscursor Flip Cls End Function Das Problem war übrigens, dass dadurch, dass man die Maus immer eine (für den Computer) lange Weile gedrückt hält und somit sofort die nächste Frage beantwortet, bei der C natürlich falsch ist! |
||
![]() |
J.R. |
![]() Antworten mit Zitat ![]() |
---|---|---|
Besten Dank für die schnelle Hilfe und die Modifizierung.
Ich habe jetzt in meinem ursprünglichen Code immer nach gosub ein delay(100) gesetzt, dann funktioniert das Quiz auch. Wie sähe denn vom Prinzip her ein schöner Code aus? Mit Select/Case oder mit Funktionen? |
||
![]() |
dominik |
![]() Antworten mit Zitat ![]() |
---|---|---|
keines von beide is ein ERSATZ für das andere.
mit select überprüft man variablen. und mit fuctionen kann man seinen code übersichtlicher in einzelne abschnitte einteilen. aber umsomehr du von beiden verwendest um so übersichtlicher un schöner wird dein code natürlich. |
||
![]() |
J.R. |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich meinte ja auch auf mein Quiz bzw. allgemein für Quizspiele.
Da ja mein Code wohl bei weitem alles andere als optimal ist. |
||
Ensign Joe |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
du solltest außerdem die ganzen fragen in eine textdatei und nicht direkt im quellcode speichern | ||
Ich habe jetzt eine Pommesbude aufgemacht am Münchner Hauptbahnhof.
Und da ich Herbert Görgens heiße, heißt diese Pommesbude Herbert's Pommesbude ![]() |
![]() |
Ctuchik |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also die Fragen kann man am Anfang zum Test im Quellcode lassen und später dann aus Textdateien lesen!
Aber man sollte ein Programm von Anfang an richtig strukturieren! Also ne Hauptschleife, die dann Unterfunktionen (oder auch Gosubs) aufruft, wobei ich Gosub und Goto nicht benutze, weil es meiner Meinung nach der Übersichtlichkeit schadet und Funktionen sind auch nur minimal langsamer und denen kann man sogar noch Parameter übergeben und Rückgabewerte erhalten! Gerade diesen Teil (der ist jetzt durch meine Veränderungen natürlich komplizierter geworden, hab da auch dann nur Copy&Paste gemacht statt gleich ne Schleife zu bauen!): Code: [AUSKLAPPEN] Gosub UP timer = MilliSecs() + 2000 While (MouseDown(1) Or MilliSecs() < timer) Text 400,300,"Richtig" Render() Wend I = I + 1 Gosub UP timer = MilliSecs() + 2000 While (MouseDown(1) Or MilliSecs() < timer) Text 400,300,"Richtig" Render() Wend I = I + 1 Gosub UP ;End des Spiels While (Not KeyHit(1)) Text 400,300,"Richtig" Render() Wend End solltest du durch eine ordentliche Hauptschleife ersetzen, die die Fragen nacheinander abarbeitet! Und die großen If-Anweisungen gefallen mir auch nicht, da ist meine übersichtlicher und schneller: Code: [AUSKLAPPEN] If ImageRectCollide ( Maus,X,Y,0,100,300,200,50) And MouseDown(1) = 1 And Fragen$(I,5) = "A" Then ;Antwort A richtig? Text 400,300,"Richtig"P = P + 1 I = I +1 Return ElseIf ImageRectCollide ( Maus,X,Y,0,100,300,200,50) And MouseDown(1) = 1 And Fragen$(I,5) <> "A" Then ;Antwort A falsch? Text 400,300,"Falsch, die richtige Antwort lautet " + Fragen$(I,5) Gosub F Code: [AUSKLAPPEN] If ImageRectCollide ( Maus,X,Y,0,500,400,200,50) And MouseDown(1) Then ;Antwort D angeklickt? If Fragen$(I,5) = "D" Then ;Antwort D richtig? P = P + 1 : Return Else ;Antwort D falsch? Goto F End If EndIf |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group