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:

Frage zu meinem Programm

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



Anmeldungsdatum: 26.11.2006
Beiträge: 149

BeitragVerfasst am: 10.01.2007, 21:31    Titel: Frage zu meinem Programm Antworten mit Zitat

also hallo nochma
Code:

screen 12
x=10
y=10
Move=0
DO

 a$ = INKEY$
 SLEEP 5

IF MULTIKEY(&h48) THEN Move = 4 ' High
IF MULTIKEY(&h4D) THEN Move = 3 ' Right
IF MULTIKEY(&h50) THEN Move = 1 ' Down
IF MULTIKEY(&h4B) THEN Move = 2 ' Left
    locate x,y
      print"."
       if Move=4 then
            locate x,y
            ?"  "
            locate x-1,y
            ?"."
        end if
        if Move=3 then
            locate x,y
            ?"  "
            locate x,y+1
            ?"."
        end if
LOOP UNTIL a$ = CHR$(27)

also das programm soll einfach nur das "."(püncktchen) über den bildschirm laufen lassen, jenachdem was für eine pfeiltase hedrückt wurde, aber ich muss dsa so machen, und irgendwie müsste ich im de programm zählen wie oft die die jeweiligen tasten gedrückt wurden,nur das bekomme ich net so hin. zum zweiten problem wollte ich fragen, wie ich es machen kann, das der punkt dann auf der neuen position weiter"läuft" vielei könnt ihr mir helfen.???
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Eastler_dart



Anmeldungsdatum: 25.09.2005
Beiträge: 177
Wohnort: Baden-Würtemberg + Sachsen

BeitragVerfasst am: 10.01.2007, 22:19    Titel: Antworten mit Zitat

Hab mal n bisserl rumprobiert
Folgender Code würde das tun, was du erklärt hattest:
Code:
screen 12

DIM Move AS INTEGER
DIM A$

DECLARE SUB TuEs(Bewegung AS INTEGER)

Move=0


DO
 a$ = INKEY$
 SLEEP 50
  IF MULTIKEY(&h48) THEN CALL TuEs(4)
  IF MULTIKEY(&h4D) THEN CALL TuEs(3)
  IF MULTIKEY(&h50) THEN CALL TuEs(1)
  IF MULTIKEY(&h4B) THEN CALL TuEs(2)
LOOP UNTIL a$ = CHR$(27)


SUB TuEs(Bewegung AS INTEGER)
  STATIC X AS INTEGER, Y AS INTEGER, PktX AS INTEGER, PktY AS INTEGER
  STATIC MaxLinks AS INTEGER,MaxRechts AS INTEGER
  STATIC MaxOben AS INTEGER, MaxUnten AS INTEGER

  'Hier die Begrenzungen, wie weit der Punkt jeweils wandern darf
  MaxLinks=1 : MaxRechts=60
  MaxOben=1  : MaxUnten=24

  SELECT CASE Bewegung
    CASE 4
       'Hoch
       IF Y > MaxOben THEN
          PktY=Y-1
          ELSE
          PktY=MaxOben
       END IF
    CASE 3
       'Rechts
       IF X < MaxRechts THEN
          PktX=X+1
          ELSE
          PktX=MaxRechts
       END IF
    CASE 1
       'runter
       IF Y < MaxUnten THEN
          PktY=Y+1
          ELSE
          PktY=MaxUnten
       END IF
    CASE 2
       'links
       IF X > MaxLinks THEN
          PktX=X-1
          ELSE
          PktX=MaxLinks
       END IF
  END SELECT
  'Punkt Löschen
  LOCATE Y,X
  PRINT " ";
  'neuer Punkt setzen
  LOCATE PktY, PktX
  PRINT ".";
  X = PktX
  Y = PktY
END SUB

Hoffe, das Listing ist noch einfach genug, um es zu verstehen
Mit den Max-Variablen begrenze ich das Feld, in dem der Punkt wandern darf, also links, oben, rechts und unten, keinesfalls aus dem Bildschirm raus.
Eigentlich sollten diese Werte aus dem Screen-Befehl errechnet werden, damit du ggf. eine größere Auflösung einstellen kannst, ohne die Max-Werte anzupassen

Eastler
_________________
Kaum macht mans richtig, schon geht's
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen Yahoo Messenger
WinterStorm



Anmeldungsdatum: 14.11.2005
Beiträge: 198
Wohnort: Linz

BeitragVerfasst am: 14.01.2007, 03:31    Titel: Antworten mit Zitat

hm, also so ne ähnliche frage hatte ich auch mal gestellt und ne tolle
antwort bekommen, thx nebenbei grinsen
aber wenn du ein ascii-spiel machen möchtest, wäre
folgende lösung vielleicht besser:

Code:

cls
screen 12

x = 2
y = 2

do
   
    locate x, y
     color 15, 0
      ? "."

    do: t$ = inkey$: loop until t$ <> ""
     locate x, y
      ? " "

select case right$(t$, 1)
    case "H": x = x - 1
    case "K": y = y - 1
    case "M": y = y + 1
    case "P": x = x + 1
    case chr$(27): end
end select

    if x < 1 then x = 1
    if y < 1 then y = 1
    if y > 79 then y = 79
    if x > 29 then x = 29

loop


[EDIT:]

jetzt hat mich auch mal wieder die lust gepackt, ein ascii adventure zu schreiben, und diesmal etwas ordentlicher.
natürlich bin ich sofort auf mein erstes problem gestoßen.
ich wollte die karte in eine datei: "map.txt" speichern.
es soll auf der karte ein rand sein mit: chr$(218), chr$(196), chr$(191), chr$(192), chr$(179), chr$(217) und dann die karte mit einigen bäumen chr$(006) und einigen anderen ascii zeichen.
aber ich kann die datei so leider nicht einlesen, weil sie im unicode abgespeichert werden muss um alles korrekt anzuzeigen.
nebenbei: ich hab noch nie eine karte in eine externe datei gespeichert, ich hoffe ihr könnt mir helfen. THX

mfg
_________________
Me
lastfm...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
General



Anmeldungsdatum: 26.11.2006
Beiträge: 149

BeitragVerfasst am: 14.01.2007, 11:00    Titel: Antworten mit Zitat

ja das is au gut, nur ich habe das gefühl in deinem code, wird nicht realisiert was passiert wenn man zwei pfeiltasten drückt, was bei dem obrigen finde ich besser gemacht wurde, aber ich finde beide ideen gut, besonders deine weil die um einiges kürzer is, aber halt nicht 2 drücke abpasst
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Michael712
aka anfänger, programmierer


Anmeldungsdatum: 26.03.2005
Beiträge: 1593

BeitragVerfasst am: 14.01.2007, 13:31    Titel: Antworten mit Zitat

Da FreeBASIC seit einiger Zeit auch OOP eingebaut hat, kann man sich das ganze einfacher machen grinsen

Code:
Namespace text_adventure
    Type punkttype
        Private:
            x_ As Integer
            y_ As Integer
            col_ As Integer
            mx As Integer
            my As Integer
        Public:
            Declare Constructor(tmp_x As Integer, tmp_y As Integer, max_x As Integer, max_y As Integer, tmp_col As Integer)
                       
            Declare Property x As Integer
            Declare Property x(neu As Integer)
           
            Declare Property y As Integer
            Declare Property y(neu As Integer)
           
            Declare Property col As Integer
            Declare Property col(neu As Integer)
           
            Declare Sub Draw
            Declare Sub Clear
    End Type
   
    Constructor punkttype(tmp_x As Integer, tmp_y As Integer, max_x As Integer, max_y As Integer, tmp_col As Integer)
        x_ = tmp_x
        y_ = tmp_y
        col_ = tmp_col
        mx = max_x
        my = max_y
        Cls
        draw
    End Constructor
   
    Property punkttype.x As Integer
        Return x_
    End Property
   
    Property punkttype.x(neu As Integer)
        clear
        x_ = iif(neu<=mx, iif(neu>0, neu, 1), mx)
        draw
    End Property
   
    Property punkttype.y As Integer
        Return y_
    End Property
   
    Property punkttype.y(neu As Integer)
        clear
        y_ = iif(neu<=my, iif(neu>0, neu, 1), my)
        draw
    End Property
   
    Property punkttype.col As Integer
        Return col_
    End Property
   
    Property punkttype.col(neu As Integer)
        col_ = neu
        draw
    End Property
   
    Sub punkttype.clear
        Locate y,x: Print " ";
    End Sub
   
    Sub punkttype.draw
        Locate y,x: Print ".";
    End Sub
End Namespace
   
Dim punkt As text_adventure.punkttype = text_adventure.punkttype(10,10, 80, 24, 6)

Do
    With punkt
        If Multikey(&h50) Then .y = .y+1
        If Multikey(&h48) Then .y = .y-1
        If Multikey(&h4D) Then .x = .x+1
        If Multikey(&h4B) Then .x = .x-1
    End With
    Sleep 50, 1
Loop


Verschafft Überblick in einem großen Projekt, sieht man ja an der kurzen Do:Loop schleife zwinkern
_________________
Code:
#include "signatur.bi"
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Mao



Anmeldungsdatum: 25.09.2005
Beiträge: 4409
Wohnort: /dev/hda1

BeitragVerfasst am: 14.01.2007, 13:36    Titel: Antworten mit Zitat

OOP in einer Sprache wie BASIC macht irgendwie Angst. durchgeknallt lachen
_________________
Eine handvoll Glück reicht nie für zwei.
--
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Michael712
aka anfänger, programmierer


Anmeldungsdatum: 26.03.2005
Beiträge: 1593

BeitragVerfasst am: 14.01.2007, 14:05    Titel: Antworten mit Zitat

Wieso?

Also bei kleinen Sachen bringt das nichts, aber wenn man ein größeres Programm hat, dann ist das genial zwinkern
_________________
Code:
#include "signatur.bi"
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Mao



Anmeldungsdatum: 25.09.2005
Beiträge: 4409
Wohnort: /dev/hda1

BeitragVerfasst am: 14.01.2007, 14:13    Titel: Antworten mit Zitat

Weiß net. durchgeknallt
Bin im BASIC-Style halt einfach keine OOP gewöhnt. Zudem erscheint mir das hier ein bisschen komplizierter als wie in Delphi oder C++. grinsen
_________________
Eine handvoll Glück reicht nie für zwei.
--
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 FreeBASIC. 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