Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Ratespiel

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
karinvvv



Anmeldungsdatum: 08.03.2007
Beiträge: 5
Wohnort: Obernkirchen (nähe Minden)

BeitragVerfasst am: 21.06.2007, 08:47    Titel: Ratespiel Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
PMedia



Anmeldungsdatum: 14.08.2006
Beiträge: 2847

BeitragVerfasst am: 21.06.2007, 09:19    Titel: Antworten mit Zitat

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 happy) und funktioniert jedenfalls einwandfrei...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4700
Wohnort: ~/

BeitragVerfasst am: 21.06.2007, 16:08    Titel: Antworten mit Zitat

Steigerung von "optimal" gibt es leider nicht zwinkern
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 zwinkern
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
AndT



Anmeldungsdatum: 02.04.2007
Beiträge: 481

BeitragVerfasst am: 26.06.2007, 22:50    Titel: Antworten mit Zitat

Zwar nicht 100%ig, kommt aber KOMPLETT ohne "RND" klar zwinkern
Dank "IF RULES" zwinkern

Edit : Source verbessert aber "< 0" klappt nicht... Weil keine Regeln dafür vorhanden sind, sorry.
Allses was über 0 ist wird gatantiert irgendwann erratern zwinkern


Code:

VERALTET!
Guck bitte weiter unten...


Zuletzt bearbeitet von AndT am 27.06.2007, 10:20, insgesamt 4-mal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4700
Wohnort: ~/

BeitragVerfasst am: 26.06.2007, 23:11    Titel: Antworten mit Zitat

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. durchgeknallt

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) zwinkern
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
AndT



Anmeldungsdatum: 02.04.2007
Beiträge: 481

BeitragVerfasst am: 26.06.2007, 23:30    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4700
Wohnort: ~/

BeitragVerfasst am: 26.06.2007, 23:43    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
AndT



Anmeldungsdatum: 02.04.2007
Beiträge: 481

BeitragVerfasst am: 27.06.2007, 00:14    Titel: Antworten mit Zitat

Hi ich habe die Fehler erfogreich ausgemerzt zwinkern
Das ist zwar FB aber egal.
Mann kann es auch in Qbasic ohne probleme umschreiben.
(Einfach Fehler wie Falsche Syntax in der Hilfe nachschlagen zwinkern )

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 zwinkern

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 mit den Augen rollen
Nee, es sind noch viele Bugs drinn, von die ich noch zu lösen versuche..
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
AndT



Anmeldungsdatum: 02.04.2007
Beiträge: 481

BeitragVerfasst am: 27.06.2007, 11:34    Titel: Antworten mit Zitat

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 zwinkern
(Convertiert von Hand^^)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Michael Frey



Anmeldungsdatum: 18.12.2004
Beiträge: 2577
Wohnort: Schweiz

BeitragVerfasst am: 27.06.2007, 17:50    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
karinvvv



Anmeldungsdatum: 08.03.2007
Beiträge: 5
Wohnort: Obernkirchen (nähe Minden)

BeitragVerfasst am: 28.06.2007, 09:21    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz