Problem mit einem Quiz

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

J.R.

Betreff: Problem mit einem Quiz

BeitragSo, Jul 11, 2004 20:07
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Jul 11, 2004 20:31
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Jul 11, 2004 23:53
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

BeitragMo, Jul 12, 2004 17:29
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Jul 12, 2004 17:32
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

BeitragMo, Jul 12, 2004 17:56
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Jul 12, 2004 18:54
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile

Ctuchik

BeitragMo, Jul 12, 2004 19:28
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group