 |
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 |
General
Anmeldungsdatum: 26.11.2006 Beiträge: 149
|
Verfasst am: 10.01.2007, 21:31 Titel: Frage zu meinem Programm |
|
|
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 |
|
 |
Eastler_dart

Anmeldungsdatum: 25.09.2005 Beiträge: 177 Wohnort: Baden-Würtemberg + Sachsen
|
Verfasst am: 10.01.2007, 22:19 Titel: |
|
|
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 |
|
 |
WinterStorm

Anmeldungsdatum: 14.11.2005 Beiträge: 198 Wohnort: Linz
|
Verfasst am: 14.01.2007, 03:31 Titel: |
|
|
hm, also so ne ähnliche frage hatte ich auch mal gestellt und ne tolle
antwort bekommen, thx nebenbei
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 |
|
 |
General
Anmeldungsdatum: 26.11.2006 Beiträge: 149
|
Verfasst am: 14.01.2007, 11:00 Titel: |
|
|
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 |
|
 |
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 14.01.2007, 13:31 Titel: |
|
|
Da FreeBASIC seit einiger Zeit auch OOP eingebaut hat, kann man sich das ganze einfacher machen
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  _________________
Code: | #include "signatur.bi" |
|
|
Nach oben |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 14.01.2007, 13:36 Titel: |
|
|
OOP in einer Sprache wie BASIC macht irgendwie Angst.  _________________ Eine handvoll Glück reicht nie für zwei.
--
 |
|
Nach oben |
|
 |
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 14.01.2007, 14:05 Titel: |
|
|
Wieso?
Also bei kleinen Sachen bringt das nichts, aber wenn man ein größeres Programm hat, dann ist das genial  _________________
Code: | #include "signatur.bi" |
|
|
Nach oben |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 14.01.2007, 14:13 Titel: |
|
|
Weiß net.
Bin im BASIC-Style halt einfach keine OOP gewöhnt. Zudem erscheint mir das hier ein bisschen komplizierter als wie in Delphi oder C++.  _________________ Eine handvoll Glück reicht nie für zwei.
--
 |
|
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.
|
|