types kapier ich nicht

Übersicht BlitzBasic Allgemein

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

 

Eisrabe

Betreff: types kapier ich nicht

BeitragFr, Jan 23, 2004 7:48
Antworten mit Zitat
Benutzer-Profile anzeigen
also, ich habe eine einfache aufgabe mit arrays einfach lösen können
hier listing mit erläuterungen
Code: [AUSKLAPPEN]
Graphics 800,600,16,2
schrift_arial$=LoadFont ("Arial",14,0,0,0)
SetFont schrift_arial
SeedRnd MilliSecs()

Dim kwert(52) ; je ein array für den wert einer der 52 karten
Dim kn$(52)   ; je ein array für den namen jeder karte
Dim farb$(4)  ; karo, herz, pik, kreuz gekommen je einen array

For f=1 To 4    ; die 4 farben werden eingelesen
 Read farb$(f)
Next

For t=1 To 13   ; jede der 52 karten bekommt hier ihren namen
 Read ktemp$
 kn$(t)=farb$(1)+ktemp$
 kn$(t+13)=farb$(2)+ktemp$
 kn$(t+26)=farb$(3)+ktemp$
 kn$(t+39)=farb$(4)+ktemp$
Next


For t=1 To 13    ; und hier ihren wert
 Read kwert(t)
 kwert(t+13)=kwert(t)
 kwert(t+26)=kwert(t)
 kwert(t+39)=kwert(t)
Next

For dg=1 To 5 ; 5x durchmischen ;)

For t=1 To 52 ; statt des swap-befehls
 z=Rand(1,52)
 temp=kwert(t)
 kwert(t)=kwert(z)
 kwert(z)=temp
 te$=kn$(t)
 kn$(t)=kn$(z)
 kn$(z)=te$
Next

Next

For t=1 To 52 ; alle gemischten karten in zufälliger reihenfolge
 Print kn$(t)+" hat einen Wert von: "+kwert(t)
If t=26 Then WaitKey
Next 
WaitKey
End
Data "karo","herz","pik","kreuz"
Data "zwei","drei","vier","fuenf","sechs","sieben"
Data "acht","neun","zehn","bube","dame","koenig","ass"
Data 2,3,4,5,6,7,8,9,10,2,3,4,11


dann hab ich versucht das gleiche mit types zu lösen und bin gescheitert.
beispiele aus der onlinehilfe funktionieren, aber wenn ich es 1:1 in mein schema baue, bekomme ich ne fehlermeldung. grr . hier das listing, wie weit ich gekommen bin, bis ich aufgeben musste.
Code: [AUSKLAPPEN]
Graphics 800,600,16,2
schrift_arial$=LoadFont ("Arial",16,0,0,0)
SetFont schrift_arial

Type karte
 Field name
 Field wert
End Type

For t=1 To 13
 karo.karte = New karte
 herz.karte = New karte
 pik.karte = New karte
 kreuz.karte = New karte
Read a$, a
 karo\name = a$
 karo\wert = a
 herz\name = a$
 herz\wert = a
 pik\name = a$
 pik\wert = a
 kreuz\name = a$
 kreuz\wert = a
Next

For name.karte Each karte  ; <---- hier gibts ne fahlermeldung
 Print karo\name
Next

WaitKey
End
Data "karozwei",2,"karodrei",3,"karovier",4,"karofuenf",5,"karosechs",6,"karosieben",7
Data "karoacht",8,"karoneun",9,"karozehn",10,"karobube",2,"karodame",3,"karokoenig",4,"karoass",11


ich bitte euch, keine sprüche oder lästereien. wenn dir mein code nicht gefällt oder das alles schwachsinn ist, weils kein sinn macht, dann bitte ignoriere es einfach.
diese sinnlosen progs helfen mir zu verstehen, wie alles funktioniert. denn lieber in nem 20 zeilen prog die sache verstehen, als in nem 3000-zeilen-projekt nen gehirn-krampf zu bekommen.

ich will hier kein kurz zu types haben. es wäre mir schon geholfen, wenn jemand mein obriges array-listing mit types umsetzt.
ich habe einCode: [AUSKLAPPEN]
GOTO
und ich bin bereit es einzusetzen!
 

walski

Ehemaliger Admin

BeitragFr, Jan 23, 2004 9:20
Antworten mit Zitat
Benutzer-Profile anzeigen
For name.karte = each karte

und tada, es geht.
So wie du es aber machst ist es fast sinnlos!
Besser wäre es so:
Code: [AUSKLAPPEN]

Type Karte
 field Typ
 field Wert
end type
Global Deck.Karte

;Hier die daten Einlesen. Wobei für Deck\Typ immer n Integer als Bezeichner für die Farbe steht. Also Beispielsweise: 1=Karo,2=Herz etc

for Deck = each Karte
 if Deck\Typ=1 then ;Wenns ne Herz Karte ist:
  print "Herz: " + str(Deck\Wert)
 endif
next


Sowas in der Art ist halt sinnvoller.
Da du mit deinen 4 Types-Vars eben doch nur ein Type ansprichst und das in BB zu nur EINER Liste wird!
Also wenn du alle Elemente von Karo.Karte durchgehst sind da auch alle Elemente von Herz.Karte dabei!

walski
buh!
 

Eisrabe

BeitragFr, Jan 23, 2004 9:36
Antworten mit Zitat
Benutzer-Profile anzeigen
danke dir. was ein kleines "=" so anrichten kann Smile
hm. ist das Code: [AUSKLAPPEN]
Global Deck.Karte
nur eine andere art von? Code: [AUSKLAPPEN]
deck.karte = New karte

wäre es möglich, dass du das listing so zuende schreibst, dass es das gleiche kann, wie im obrigen?

und wie mischt man mit den types? geht das? ich glaube man liest die ganze liste aus, speichert sie in temp-variablen, mischt sie und schreibt sie wieder in die type-liste, oder? denn man kann die dinger ja so schlecht direkt ansprechen.
und kann man da keine strings speichern? weil du einen umweg über ne integer mit str gemacht hast

EDIT: warum bekomme ich dort den error: VARIABLE TYPE MISMATCH ?!?!
Code: [AUSKLAPPEN]
Type karte
 Field name
 Field wert
End Type

For t=1 To 13
 karo.karte = New karte
Read a$, a
 karo\name = "karo"+a$
 karo\wert = a
Next

For a.karte = Each karte  ; <-- hier kommt die fehlermeldung
 Print a\wert
Next


eigentlich ist das listing fast IDENTISCH mit dem im handbuch. damnit. und es kommt die dusselige fehlermeldung. args.

EDIT2: ok, ich glaub ich habs jetzt. in die type-variablen kann man keine strings ablegen (desshalb heissen sie wohl auch variable Smile )
das macht es aber noch umständlicher, wenn es auch strings zu speichern gibt.
mittlerweile bezweifle ich, dass mein obriges array-listing mit types zu schlagen ist Twisted Evil Twisted Evil Twisted Evil 8)
ich habe einCode: [AUSKLAPPEN]
GOTO
und ich bin bereit es einzusetzen!
 

Eisrabe

BeitragFr, Jan 23, 2004 10:19
Antworten mit Zitat
Benutzer-Profile anzeigen
ich nehme alles zurück, was ich über types gesagt habe Smile
ich habe es eben grad geschafft (statt schlafen. wer braucht schon schlaf? ... zzZZZ)
hier das funktionierende listing. habsch ganz alleine gemacht Smile
Code: [AUSKLAPPEN]
Graphics 800,600,16,2
schrift_arial$=LoadFont ("Arial",14,0,0,0)
SetFont schrift_arial

Type karte
 Field farbe
 Field typ
 Field wert
End Type

For f=1 To 4
 Restore
 For t=1 To 13
  deck.karte = New karte
  Read a, b
  deck\typ = a
  deck\wert = b
  deck\farbe = f
 Next
Next

For deck.karte = Each karte
 If deck\farbe = 1 Then fa$="Karo"
 If deck\farbe = 2 Then fa$="Herz"
 If deck\farbe = 3 Then fa$="Pik"
 If deck\farbe = 4 Then fa$="Kreuz"
 If deck\typ = 1 Then ta$="zwei"
 If deck\typ = 2 Then ta$="drei"
 If deck\typ = 3 Then ta$="vier"
 If deck\typ = 4 Then ta$="fuenf"
 If deck\typ = 5 Then ta$="sechs"
 If deck\typ = 6 Then ta$="sieben"
 If deck\typ = 7 Then ta$="acht"
 If deck\typ = 8 Then ta$="neun"
 If deck\typ = 9 Then ta$="zehn"
 If deck\typ = 10 Then ta$="Bube"
 If deck\typ = 11 Then ta$="Dame"
 If deck\typ = 12 Then ta$="Koenig"
 If deck\typ = 13 Then ta$="Ass"
 Print fa$+ta$+" hat den Wert: "+deck\wert
Next

WaitKey
End

Data 1,2, 2,3, 3,4, 4,5, 5,6, 6,7, 7,8, 8,9, 9,10, 10,2, 11,3, 12,4, 13,11

ok, es werden alle karten mit namen ausgegeben. ABER, wie mische ich die? zwischenspeichern ohne array wird schwer.
da bin ich mal gespannt Twisted Evil Embarassed Laughing
ich habe einCode: [AUSKLAPPEN]
GOTO
und ich bin bereit es einzusetzen!

bruZard

BeitragFr, Jan 23, 2004 10:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Es muss nicht immer der eingeschlagene Weg derjenige sein der in alle Richtungen führt Wink

Lege alle Karten in ein Array, dann erzeugst Du Dein Type per Zufall:
Code: [AUSKLAPPEN]

Type karte
  Field wert
End Type

Dim blatt(31)

; -> Hier die Karten aus einem Data-Block oder einer
; externen Datei einlesen

SeedRnd MilliSecs()

For i=0 to 31
  deck.karte=New Karte
  deck\wert=Rnd(31)
Next

Der Code ist sicher nicht komplett, mischt die Karten aber zuverlässig Wink
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32

User posted image
 

Eisrabe

BeitragFr, Jan 23, 2004 16:12
Antworten mit Zitat
Benutzer-Profile anzeigen
wenn ich mich nicht irre würde dein code nur 31 zufällige karten von 31 möglichkeiten liefern aber nicht mischen! denn es gibt auch doppelte usw.
ich habe einCode: [AUSKLAPPEN]
GOTO
und ich bin bereit es einzusetzen!

bruZard

BeitragFr, Jan 23, 2004 16:19
Antworten mit Zitat
Benutzer-Profile anzeigen
mein Code mischt einfach nur 32 Blätter ... Du müsstest ihn natürlich soweit ausbauen dass Du Deine Unterteilungen wieder hast. Das erreichst Du durch Zufallszahlen aus den verschiedenen Data-Blöcken.
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32

User posted image
 

Eisrabe

BeitragFr, Jan 23, 2004 17:31
Antworten mit Zitat
Benutzer-Profile anzeigen
kann es sein dass du dich irrst?
Code: [AUSKLAPPEN]
For i=0 to 31
  deck.karte=New Karte
  deck\wert=Rnd(31)
Next

das würde nur 32 zufallskarten mit doppelten und demnach auch fehlenden karten bewirken.
sieh dir mein listing mit array an. das lasse ich ein komplettes set karten mit namen und wert GEMISCHT auflisten. keine doppelt und keine fehlt. weil es wirklich gemischt ist und nicht x-mal karte(rnd(1,x)).
ich habe einCode: [AUSKLAPPEN]
GOTO
und ich bin bereit es einzusetzen!

Kryan

BeitragFr, Jan 23, 2004 18:36
Antworten mit Zitat
Benutzer-Profile anzeigen
merk dir in nem Array , ob du den schon verwendest hattest:

Dim schonverwendet(32)
...
Repeat
zufall=Rand(1,32)
Until schonverwendet(zufall)=0
schonverwendet(zufall)=1
 

Eisrabe

BeitragFr, Jan 23, 2004 19:31
Antworten mit Zitat
Benutzer-Profile anzeigen
die frage war doch, ob es ohne arrays geht!
denn mit arrays habe ich die perfekte lösung schon... ok, mit dem qbasic-befehl SWAP wars nen 3-zeiler. in BB siehts so aus:
Code: [AUSKLAPPEN]
For nt=1 To 32
 z=Rand(1,32)
 temp=kwert(t)      ; kartenwert wird zwischengespeichert
 kwert(t)=kwert(z) ; karte n-te bekommt den wert von einer zufallskarte
 kwert(z)=temp     ;  diese zufallskarte bekommt nun den wert n-ten karte
 te$=kn$(t)            ; das gleiche mit dem kartennamen
 kn$(t)=kn$(z)
 kn$(z)=te$
Next

voila, 32 gemische karten mit namen und wert

Kryan

BeitragFr, Jan 23, 2004 19:46
Antworten mit Zitat
Benutzer-Profile anzeigen
du kannst doch auch Type UND Arrays verwenden oder wolltest du das nur mit Types schaffen?
Zitat:

Code: [AUSKLAPPEN]

For nt=1 To 32
 z=Rand(1,32)
 temp=kwert(t)      ; kartenwert wird zwischengespeichert
 kwert(t)=kwert(z) ; karte n-te bekommt den wert von einer zufallskarte
 kwert(z)=temp     ;  diese zufallskarte bekommt nun den wert n-ten karte
 te$=kn$(t)            ; das gleiche mit dem kartennamen
 kn$(t)=kn$(z)
 kn$(z)=te$
Next 



Wo wird denn dort der schleifenwert nt verwendet? Irgendwas stimmt dort nicht! Außerdem verwendest du dort wieder Array!
 

Eisrabe

BeitragFr, Jan 23, 2004 21:01
Antworten mit Zitat
Benutzer-Profile anzeigen
das n bei nt ist mit reingerutscht. orginallisting im obersten post dieses threads.
und dieses listing soll zeigen, dass man zum mischen keine types braucht bzw es garnicht möglich ist. aber ich lasse mich gerne eines besseren belehren, falls doch.
ich fühle mich geächtet wegen der verwendung von GOTO und DIM. hehe

es kamen immer nur schlagworte wie: "nimm types" oder "scheiss code". aber es kommt nur wenig besseres
ich habe einCode: [AUSKLAPPEN]
GOTO
und ich bin bereit es einzusetzen!

Markus2

BeitragSa, Jan 24, 2004 1:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,
klar kann man Types einfach vertauschen Smile

sieht so aus

Function Tauschen(d1.karte,d2.karte)

if d1= null then return
if d2= null then return

local d3.karte = new Karte
d3\wert=d2\wert
d3\name=d2\name

d2\wert=d1\wert
d2\name=d1\name

d1\wert=d3\wert
d1\name=d3\name

delete d3

end function
 

walski

Ehemaliger Admin

BeitragSa, Jan 24, 2004 1:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Markus2 hat Folgendes geschrieben:

Function Tauschen(d1.karte,d2.karte)

if d1= null then return
if d2= null then return

local d3.karte ;<- KEIN = new weil es ist ja schon da !!!
d3\wert=d2\wert
d3\name=d2\name

d2\wert=d1\wert
d2\name=d1\name

d1\wert=d3\wert
d1\name=d3\name

end function


Uiuiui... da wär ich GANZ vorsichtig!
Das sind nämlich Seiteneffekte die kaum noch verkraftbar sind Wink
Außerdem wird folgendes passieren:
Selbst wenn d1 und d2 GLOBAL sind, werden sie durch die Definition als Parameter der Function LOCAL in eben dieser Function.
Dadurch tauscht du n paar Werte lokal in der Funktion und hast KEINERLEI Effekt nach Außen Wink

Aber der generelle Weg stimmt natürlich!
Werte von 2 Listenfeldern tauschen geht Problemlos!
Außerdem musst du ja nicht die Listen in sich tauschen sondern kannst jeder Karte ne ID geben und gibst den Spielern dann zufällige IDs.
Das wäre wohl der sauberere Weg.

walski
buh!

Jolinah

BeitragSa, Jan 24, 2004 13:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Man könnte es evtl. auch mit den After, Before, First und Last Befehlen irgendwie machen. Müsste man allerdings sich ne gute Funktion ausdenken die nach Zufall die Karten irgendwohin verschiebt.

Markus2

BeitragSa, Jan 24, 2004 18:24
Antworten mit Zitat
Benutzer-Profile anzeigen
@walski

War nen Denkfehler , hatte ich direkt korrigiert aber du
warst mal wieder schneller bevor ich das editieren konnte Wink

Wenn man Types in der Function verändert wirken die auch nach außen .
 

walski

Ehemaliger Admin

BeitragSa, Jan 24, 2004 21:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Ough sorry Markus, dann lag der Fehler wohl doch bei mir.
Ich hab das mit den Types nicht ganz geplant, aber ist ja logisch, ein Type=1 Liste in BB.

Sorry für den Quatsch den ich geschrieben hab! Embarassed

walski
buh!
 

Eisrabe

BeitragMo, Jan 26, 2004 14:18
Antworten mit Zitat
Benutzer-Profile anzeigen
hm, seid IHR sicher dass IHR die types kapiert habt?

ich seh da im moment noch keinen vorteil gegenüber dim-arrays (die ich liebe)

ach übrigens. was spricht dagegen ALLE variablen global zu machen?
ich habe einCode: [AUSKLAPPEN]
GOTO
und ich bin bereit es einzusetzen!
 

walski

Ehemaliger Admin

BeitragMo, Jan 26, 2004 15:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Was dagegen spricht?
Seiteneffekte bis zum Abwinken und daraus ein UNDEBUGGBARES Programm.

Außerdem kannst du uns ruhig glauben, dass wir das verstanden haben und ich würde das nicht in Frage stellen, wenn du ernsthaft fragst was an einer globalen Deklarierung aller Variablen falsch ist...

Zum Thema Arrays <-> Types:
Types sind einfach dynamischer. Das ist ihr einziger Vorteil.
Arrays mögen schneller sein, also entscheide einfach nach Bedarf was du brauchst.
Eine immer gültige Antwort gibt es da einfach nicht!

walski
buh!
 

storzi

BeitragMo, Jan 26, 2004 20:17
Antworten mit Zitat
Benutzer-Profile anzeigen
jo, types sind dynamisch!
also praktisch zum beispiel bei einem strategiespiel wo immer neue einheiten dazukommen und verschwinden und so.

aber bei einem kartenspiel wo du immer genau 32 karten hast kannst du doch ohne nachteile arrays verwenden Smile
http://www.splattergamez.de

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group