 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
karinvvv

Anmeldungsdatum: 08.03.2007 Beiträge: 5 Wohnort: Obernkirchen (nähe Minden)
|
Verfasst am: 21.06.2007, 08:47 Titel: Ratespiel |
|
|
Hallo..ich bräuchte mal wieder eure Hilfe. Ich habe nämlich so ein Spiel erstellt wo der PC sich eine zahl aussucht und ich sie dann erraten muss:
z = 1
PRINT "Bitte geben S¡e eine Zahl zwischen 1 und 100 ein"
RANDOMIZE TIMER
zufinden = INT(RND * 100) + 1
gefunden = 0
DO
LOCATE 3, 1
PRINT STRING$(100, " ")
LOCATE 3, 1
INPUT "Bitte geben sie nun ihre Zahl ein ", ratezahl
LOCATE 5, 1
PRINT STRING$(100, " ")
SELECT CASE ratezahl
CASE IS < zufinden
LOCATE 8, 1
PRINT "Zahl ist zu klein!"
z = z + 1
.....und so weiter. Nun muss ich das jetzt andersrum machen dass ich mir eine Zahl aussuche und der PC raten soll. Kann mir jemand etwas nachhelfen?
LG
ich eine Zahl ausdenkt und ich sie raten muss. Also mit |
|
Nach oben |
|
 |
PMedia
Anmeldungsdatum: 14.08.2006 Beiträge: 2847
|
Verfasst am: 21.06.2007, 09:19 Titel: |
|
|
Hmmm
Code: |
Print "Denken sie sich bitte eine Zahl von 0 bis 100"
Print "Der Computer wird ihnen nun Vorschläge machen."
Print "Sagen sie, ob die Zahl (G)rößer oder (K)leiner ist."
Randomize Timer
Vorschlag = rnd*100+1
Steps = 10 'Schrittweite
Do
Print Vorschlag
Print "Ist ihre Zahl (G)rößer oder (K)leiner? Oder (I)st sie das bereits?"
input erg$
if erg$ = "G" or erg$ = "g" then
Vorschlag = Vorschlag + steps
Steps = Steps - 1
if Steps = 0 then Steps = 1
elseif erg$ = "K" or erg$ = "k" then
Vorschlag = Vorschlag - Steps
Steps = Steps - 1
if Steps = 0 then Steps = 1
elseif erg$ = "I" or erg$ = "i" then
Gefunden = 1
else
Print "Geben sie bitte G für Größer oder K für Kleiner ein..."
end if
Loop Until Gefunden = 1
|
Ist zwar nicht das optimalste aber ich muss gleich Los (Informatik-Prüfung ) und funktioniert jedenfalls einwandfrei... |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4701 Wohnort: ~/
|
Verfasst am: 21.06.2007, 16:08 Titel: |
|
|
Steigerung von "optimal" gibt es leider nicht
Wenn es sie gäbe, dann hätte ich einen etwas optimalsteren Vorschlag:
Code: | a=0
b=128 ' mit diesen Zahlen lässt sich einfacher halbieren
do
ratezahl = int((a+b)/2)
print "Sie haben bestimmt "; ratezahl; " geraten. Stimmt's?"
input "Ist Ihre Zahl (G)rößer, (K)leiner oder (I)st sie richtig?"; test$
if test$ = "G" or test$ = "g" then a = ratezahl
if test$ = "K" or test$ = "k" then b = ratezahl
loop until test$ = "I" or test$ = "i" |
Wenn die Eingaben richtig getätigt werden, braucht das Programm maximal 7 Versuche. Allerdings rät es auch mal Zahlen, die größer sind als 100. Lässt sich also noch ein bisschen verbessern  _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
AndT
Anmeldungsdatum: 02.04.2007 Beiträge: 481
|
Verfasst am: 26.06.2007, 22:50 Titel: |
|
|
Zwar nicht 100%ig, kommt aber KOMPLETT ohne "RND" klar
Dank "IF RULES"
Edit : Source verbessert aber "< 0" klappt nicht... Weil keine Regeln dafür vorhanden sind, sorry.
Allses was über 0 ist wird gatantiert irgendwann erratern
Code: |
VERALTET!
Guck bitte weiter unten...
|
Zuletzt bearbeitet von AndT am 27.06.2007, 10:20, insgesamt 4-mal bearbeitet |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4701 Wohnort: ~/
|
Verfasst am: 26.06.2007, 23:11 Titel: |
|
|
hmm ... ich habe mir 4 gedacht, und das errät er nicht. Er braucht allein 24 (!) Versuche, bis er zu 3 kommt, und dann rät er er nach Eingabe von 'g' mit -1 weiter. Irgendwann habe ich dann 'i' eingegeben, und das Programm hat ganz frech behauptet, es habe 0 Versuche benötigt.
P. S.: Funktioniert das Programm eigentlich auch unter QBASIC? Da gibt es, so weit ich weiß, z. B. kein input(1), sondern nur ein input$(1)  _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
AndT
Anmeldungsdatum: 02.04.2007 Beiträge: 481
|
Verfasst am: 26.06.2007, 23:30 Titel: |
|
|
Ich habe das zurrückverfolgt und tatsäschlich^^
Ich hab das Problem gefunden:
Die zu erratenden Zahlen unter 50 ist wirken verbuggt und könnten Möglicher weise eine Kettenreaktion auslösen.
Ich arbeite dran..
Zuletzt bearbeitet von AndT am 26.06.2007, 23:46, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4701 Wohnort: ~/
|
Verfasst am: 26.06.2007, 23:43 Titel: |
|
|
Auch das Rateverhalten für z. B. 50 ist seltsam. Nach der Zahl 49 gebe ich "g" ein, trotzdem zählt er erst noch eine Weile nach unten.
Der Bug bei Zahlen kleiner 10 kommt wahrscheinlich daher, weil er in den nagativen Bereich hineinrät und dort nicht mehr hinauskommt. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
AndT
Anmeldungsdatum: 02.04.2007 Beiträge: 481
|
Verfasst am: 27.06.2007, 00:14 Titel: |
|
|
Hi ich habe die Fehler erfogreich ausgemerzt
Das ist zwar FB aber egal.
Mann kann es auch in Qbasic ohne probleme umschreiben.
(Einfach Fehler wie Falsche Syntax in der Hilfe nachschlagen )
Hier die neue Version:
Code: | ' Meine Rate engine
' Das ganze ist zwar nicht ausgereift, kommt aber komplett ohne "RND" klar ;)
Print "Rate engine 0.3 beta ;)"
dim as single min_zahl, max_zahl,startzahl,versuche, start_zahl
dim as string erg
dim as single RateZahl, g1, g2,maxsteps,adder
dim as single kpress, gpress, addzahl
dim as single taste_ok, Debugmode
dim as single mstrg,Finde_Zahl,rtr,rtradd
dim as single alte_startzahl,helfer1
const true=1, false = -1
' Einstellungen
min_zahl=0
max_zahl=100
start_zahl=128
adder=start_zahl
maxsteps=23 ' Wie viele Schritte Maximal hoch und runter??
mstrg=true ' true = manuell spielen , false = automatisches erraten
Debugmode=false ' Debugger auf true stellen für erweiterte Informationen
width 87,25 ' erweitert das consolenfenster etwas nach rechts (nicht nötig aber mein meinen text schon.)
cls
Print "Rateengine 0.3 beta"
Print "Scheissegal welche Zahl... Anhand deiner Angaben finde ich sie xD..."
Taste_OK=1
do
if mstrg=true then
' Programm für manuelle Eingabe
Locate 4,1:Print "Die Zahl ist "+str(CINT(start_zahl))+" oder??? Ist die Zahl (k)leiner , (g)roeser, oder (i)st sie richtig???"
bck:
erg=lcase (input(1)) ' Simple eingabe Engine (abfrage der Tastatur)
if erg="" then goto bck
else
' Programm für automatische Eingabe (Minimale KI xD)
IF Finde_Zahl=0 then Print "Die Zufindende Zahl eingeben...":Input Finde_Zahl
If Finde_Zahl<CINT(start_zahl) then erg="k"
If Finde_Zahl>CINT(start_zahl) then erg="g"
If Finde_Zahl=CINT(start_zahl) then erg="i"
IF Debugmode=true then
locate 5,1
Print "Debug:"
Print "Erg=";erg
end if
end if
If Debugmode=true then
locate 7,1:
Print "Finde_Zahl=";Finde_Zahl
Print "g1=";g1;" "
print "g2=";g2;" "
print "addzahl";addzahl;" "
print "adder=";adder;" "
print "start_zahl=";start_zahl;" " ' sehr nützlicher Debugger
' sleep
end if
' Wenn k gedrückt wird:
if erg="k" Then
if addzahl < 0 then addzahl=0
g1=start_zahl/2
kpress+=1
if g1<0 then g1=start_Zahl
if kpress > maxsteps then kpress = 1
addzahl=addzahl-kpress
end if
' Wenn g gedrückt wird:
if erg="g" Then
if addzahl > 0 then addzahl=0
g2=adder + g1*2
gpress+=1
if g1<start_zahl then g1=start_zahl+ 2
if gpress > maxsteps then gpress = 1
addzahl=addzahl+gpress
end if
'locate 6,1:print "Hauptprg :";g1,g2,addzahl,adder,start_zahl ' sehr nützlicher Debugger
Versuche=Versuche+1
if erg="i" then exit do
' Rateengine ("IF RULEZ" :D )
DO
rtradd=INT(RND * 10)
IF RTR>10 THEN RTR=0
IF alte_startzahl=start_zahl then rtr=rtr+rtradd
If RTR=2 then addzahl=maxsteps-INT(RND* 3) :rtr=0' Nur debugging
ADDER+=addzahl
if g2 < g1 then g2=g1 + 2
if start_zahl < -20 then adder=0:start_zahl=0
IF ADDER < -10 then adder = start_zahl-maxsteps
IF ADDER > g2 then rtr=0:exit do
IF ADDER < g2 then adder+=addzahl:g2=g1+maxsteps:rtr=0:exit do
If G2=0 Then G2=G1+1
if inkey=chr(27) then exit do
LOOP
IF TASTE_OK = 1 then start_zahl=ADDER
alte_startzahl=start_zahl
if inkey=chr(27) then exit do
loop
print start_zahl
IF ERG="i" then Print "Ich habe die Zahl in";Versuche;" Versuch(en) gefunden hehehe...":sleep else Print "Das Programm wurde manuell beendet.":sleep
|
Das funzt jetzt richtig
Zitat: |
trotzdem zählt er erst noch eine Weile nach unten.
|
Das Programm geht davon aus, das mann mitten im Ratespiel sich eine neue Zahl ausgedach hat
Nee, es sind noch viele Bugs drinn, von die ich noch zu lösen versuche.. |
|
Nach oben |
|
 |
AndT
Anmeldungsdatum: 02.04.2007 Beiträge: 481
|
Verfasst am: 27.06.2007, 11:34 Titel: |
|
|
Qbasic Version:
Code: | DIM erg AS STRING
' Meine Rate engine
' Das ganze ist zwar nicht ausgereift, kommt aber komplett ohne "RND" klar ;)
PRINT "Rate engine 0.3 beta ;)"
CONST true = 1, false = -1
' Einstellungen
minzahl = 0
maxzahl = 100
startzahl = 128
adder = startzahl
maxsteps = 23' Wie viele Schritte Maximal hoch und runter??
mstrg = true' true = manuell spielen , false = automatisches erraten
Debugmode = false ' Debugger auf true stellen für erweiterte Informationen
'width 87,25 ' erweitert das consolenfenster etwas nach rechts (nicht nötig aber mein meinen text schon.)
CLS
PRINT "Rateengine 0.3 beta"
PRINT "Scheissegal welche Zahl... Anhand deiner Angaben finde ich sie xD..."
TASTEOK = 1
DO
IF mstrg = true THEN
' Programm für manuelle Eingabe
LOCATE 4, 1: PRINT "Die Zahl ist " + STR$(CINT(startzahl)) + " oder??? Ist die Zahl (k)leiner , (g)roeser, oder (i)st sie richtig???"
bck:
ergINP$ = INPUT$(1)
erg = LCASE$(ergINP$)' Simple eingabe Engine (abfrage der Tastatur)
IF erg = "" THEN GOTO bck
ELSE
' Programm für automatische Eingabe (Minimale KI xD)
IF FindeZahl = 0 THEN PRINT "Die Zufindende Zahl eingeben...": INPUT FindeZahl
IF FindeZahl < CINT(startzahl) THEN erg = "k"
IF FindeZahl > CINT(startzahl) THEN erg = "g"
IF FindeZahl = CINT(startzahl) THEN erg = "i"
IF Debugmode = true THEN
LOCATE 5, 1
PRINT "Debug:"
PRINT "Erg="; erg
END IF
END IF
IF Debugmode = true THEN
LOCATE 7, 1:
PRINT "FindeZahl="; FindeZahl
PRINT "g1="; g1; " "
PRINT "g2="; g2; " "
PRINT "addzahl"; addzahl; " "
PRINT "adder="; adder; " "
PRINT "startzahl="; startzahl; " "' sehr nützlicher Debugger
' sleep
END IF
' Wenn k gedrückt wird:
IF erg = "k" THEN
IF addzahl < 0 THEN addzahl = 0
g1 = startzahl / 2
kpress = kpress + 1
IF g1 < 0 THEN g1 = startzahl
IF kpress > maxsteps THEN kpress = 1
addzahl = addzahl - kpress
END IF
' Wenn g gedrückt wird:
IF erg = "g" THEN
IF addzahl > 0 THEN addzahl = 0
g2 = adder + g1 * 2
gpress = gpress + 1
IF g1 < startzahl THEN g1 = startzahl + 2
IF gpress > maxsteps THEN gpress = 1
addzahl = addzahl + gpress
END IF
'locate 6,1:print "Hauptprg :";g1,g2,addzahl,adder,startzahl ' sehr nützlicher Debugger
Versuche = Versuche + 1
IF erg = "i" THEN EXIT DO
' Rateengine ("IF RULEZ" :D )
DO
rtradd = INT(RND * 10)
IF rtr > 10 THEN rtr = 0
IF altestartzahl = startzahl THEN rtr = rtr + rtradd
IF rtr = 2 THEN addzahl = maxsteps - INT(RND * 3): rtr = 0' Nur debugging
adder = adder + addzahl
IF g2 < g1 THEN g2 = g1 + 2
IF startzahl < -20 THEN adder = 0: startzahl = 0
IF adder < -10 THEN adder = startzahl - maxsteps
IF adder > g2 THEN rtr = 0: EXIT DO
IF adder < g2 THEN adder = adder + addzahl: g2 = g1 + maxsteps: rtr = 0: EXIT DO
IF g2 = 0 THEN g2 = g1 + 1
IF INKEY$ = CHR$(27) THEN EXIT DO
LOOP
IF TASTEOK = 1 THEN startzahl = adder
altestartzahl = startzahl
IF INKEY$ = CHR$(27) THEN EXIT DO
LOOP
PRINT startzahl
IF erg = "i" THEN PRINT "Ich habe die Zahl in"; Versuche; " Versuch(en) gefunden hehehe...": SLEEP ELSE PRINT "Das Programm wurde manuell beendet.": SLEEP
|
Viel Spass damit
(Convertiert von Hand^^) |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 27.06.2007, 17:50 Titel: |
|
|
Wenn ich mit Profi-Softwareentwicklern Diskuttiere denk ich mir immer wieder das ich nicht gut Programmieren kann.
Aber derart Verworrener Quellcode zeigt, das auch ich einige Tricks kenne:
Code: | DefSng A-Z
cls
print "Maximale Zahl"
input max
a=log(max)/log(2)
if a<>int(a) then
a=int(a)+1
end if
Print "Maximale Versuchszahl"; a
x=2^(a-1)
b=x/2
do
?
? " Ist die Zahl "; x
? " 1 Groesser"
? " 2 Kleiner"
? " 3 Gleich"
input jn
select case jn
case 1
x=x+b
case 2
x=x-b
case else
?
? "Die Zahl ist "; x
out0=1
end select
if b=1 then
Print "Die Zahl ist ";x
out0=1
else
b=b/2
end if
loop until out0=1
sleep |
_________________ http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight |
|
Nach oben |
|
 |
karinvvv

Anmeldungsdatum: 08.03.2007 Beiträge: 5 Wohnort: Obernkirchen (nähe Minden)
|
Verfasst am: 28.06.2007, 09:21 Titel: |
|
|
Hmm..Danke schön für eure Hilfe musste nur paar Sachen umbenennen weil QBasic diese syntaxfehler anzeigte aber jetzt ist das Programm fertig!
LG Karin |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|