[Hilfe] Card Game

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite Zurück  1, 2, 3  Weiter

Neue Antwort erstellen

BladeRunner

Moderator

BeitragFr, Mai 23, 2014 20:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Habe den Code in der Tat nicht genauer angeguckt, da ja als Fehlerzeile dass mit dem Gamestate angegeben war und üblicherweise eine falsch gesetzte Klammer den Fehler auslöst.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

Snowdragon

BeitragFr, Mai 23, 2014 21:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Also heißt es im Klartext, dass ich Case GS_PLAY(), Case GS_TOD usw. nicht abfragen kann, da Blitz3D dies als Funktion interpretiert? Oder ist das doch möglich?

BladeRunner

Moderator

BeitragFr, Mai 23, 2014 21:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Das heisst dass es GS_PLAY gibt, aber GS_PLAY() nicht. Das eine ist eine Konstante, das andere wäre eine Funktion.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

Snowdragon

BeitragFr, Mai 23, 2014 21:42
Antworten mit Zitat
Benutzer-Profile anzeigen
OMG jetzt sehe ich das erst ... vielen Dank!
 

Snowdragon

BeitragSo, Mai 25, 2014 23:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja momentan bin ich am basteln und momentan klappt es mehr oder weniger - allerdings kümmer ich mich noch nicht um das wirkliche Kampsystem. Eher um Unterprogramme wie Zufallskarten aus einem Pack bekommen, das Menü zum erstellen eines Decks und und und.

Dabei hängt jetzt mehr oder weniger alles von dieser Frage ab, da ich mir eigentlich vorgestellt habe, ein Kartenspiel für 2 Spieler zu erstellen. Es geht zunächst wirklich nur um folgende 2 Fragen:
- Ist es möglich das Kartenspiel netzwerkfähig zu machen, so dass ich auch mit Freunden spielen kann?
- Ist dazu ein Server oder kann ein direkte Port- zu Port-Verbindung zwischen 2 Rechnern hergestellt werden

Ich habe davon wirklich keine Ahunung und kenne nur die Unterschiede zwischen UDP und TCP und einige weitere Details, doch von der Realisierung habe ich keine Ahnung. Deshalb würde es mich freuen wenn mir jemand die Fragen beantworten könnte.

BladeRunner

Moderator

BeitragMo, Mai 26, 2014 6:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Um deine Fragen zu beantworten:
Ja, man kann es netzwerkfähig machen.
Nein, man benötigt keinen externen Server dafür, er ist aber möglich, muss dann aber mit was anderem als BB realisiert werden, wenn es nicht grade ein Windows-Server ist.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

DAK

BeitragMo, Mai 26, 2014 10:45
Antworten mit Zitat
Benutzer-Profile anzeigen
@Server oder nicht:
Hier kommt's drauf an, was du möchtest. Wenn du hauptsächlich im LAN spielst oder mit Leuten, die du kennst, dann brauchst du keinen dedizierten Server. Da baust du den Server-Code in das normale Spiel ein. Einer der Spieler hostet, die anderen joinen. Dazu würdest du das Spiel so bauen, dass es den Code für Server und Client drinnen hat, und je nach dem was der Spieler auswählt ist er ein Server (=Host) oder Client.

Vorteil bei der Sache ist, dass es einfacher zu machen ist (kein stand-alone-Server nötig) und du dafür keinen Computer brauchst, auf dem der Server rennt. Nachteil ist, dass du die IP vom Server für jedes Spiel eingeben musst, und Hosten eventuell durch eine Firewall blockiert wird, bzw. der Host bei seinem Router ein Port-Forwarding einrichten muss, wenn man über's Internet hosten muss.

Die Alternative ist ein Server, der irgendwo im Internet rennt. Dafür brauchst du hald einen Computer, der dauerhaft rennt und den Service zur Verfügung stellt. Ist der off, dann kann keiner spielen. Der Vorteil dabei ist aber, dass jeder über's Internet spielen kann, ohne erst umständlich Port-Forwarding einrichten zu müssen. Außerdem kannst du über diesen Server eine Art Lobby einrichten, wo alle offenen Spiele angezeigt werden, und man somit auch mit Fremden spielen kann. Ist aber hald insgesamt mehr Aufwand (da du ein dediziertes Server-Programm schreiben musst) und du brauchst einen (Hardware-)Server dafür.

Kartenspiele brauchen ja keine schnelle Verbindung (da rundenbasiert und vergleichsweise langsames Gameplay) also könntest du den Server in PHP schreiben und regelmäßig (z.B. 1x pro Sekunde) vom Client aus bei Server den momentanen Spielstand abfragen. PHP-Server gibt es heutzutage sehr oft gratis zu haben (z.B. www.lima-city.de, bin schon lange bei denen und sehr zufrieden).

@TCP/UDP:
TCP ist im Grunde UDP plus Überwachung dass verlorene Pakete nachgeschickt werden, doppelte Pakete ignoriert werden und Pakete, die in der falschen Reihenfolge angekommen sind, richtig geordnet an das Programm weiter geleitet werden.
Dafür ist TCP aber auch langsamer als UDP. Der Datendurchsatz ist ähnlich hoch, aber die Latenz ist merkbar höher.
UDP verwendet man für Daten, die nicht so wichtig sind, aber schnell ankommen müssen. Beispiele dafür sind z.B. Voice-over-IP, wobei es vergleichsweise egal ist, ob der Ton kurz aussetzt und es sehr wichtig ist, dass die Verzögerung möglichst gering ist. Die "Sicherheit", die TCP liefert, dass jedes Paket ankommt, wäre hier kontraproduktiv, da ein Geräuschfetzen von vor einer Sekunde jetzt mehr stört als nutzt. Deswegen UDP. Ein anderes Beispiel ist bei einem Echtzeit-Spiel, wenn dort die Position des Spielers dauerhaft gesendet wird. Da ist es auch wichtiger, dass es schnell ankommt als dass es genau ist.

TCP verwendet man bei Daten, die nicht notwendigerweise schnell ankommen müssen, sondern wo es wichtig ist, dass sie ankommen. Beispiele dafür sind Chat-Nachrichten, alles Rundenbasierte oder Downloads.

Wenn du einen PHP-Server machst, dann kannst du nur TCP verwenden.
Gewinner der 6. und der 68. BlitzCodeCompo
 

Kruemelator

BeitragMo, Mai 26, 2014 13:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Es ist auch möglich eine Verbindung über das Internet aufzubauen ohne Port-Forwarding nutzen zu müssen. Die beiden Programme müssen jeweils die Internet-IP und Port des anderen Computers kennen. Wenn sich jetzt beide Programme gleichzeitig etwas schicken kommen die Daten an. Das los schicken der Daten "öffnet" sozusagen den Port für die ankommenden Daten.
Vor dem starten der Verbindung muss dann nur die eigene Internet-Ip ermittelt und an die anderen weitergegeben werden. Wenn du mit Freunden spielst kannst du die mit irgendeinem Chatprogramm, Facebook, Rauchzeichen oder sonst etwas durchgeben.
 

Snowdragon

BeitragMo, Mai 26, 2014 20:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay cool! Wink

Ehm da bin ich schon wieder ... Razz
Ich bin gerade dabei ein Shop einzurichten (im Spiel), in dem man zufällig generierte Karten bekommt. Klappt soweit alles, dann wollte ich versuchen die Anzahl der Karten zu speichern. Ich verwende ein Array mit "10 Unterboxen" die für den Namen, Effekte usw reserviert sind. Die letzte Unterbox soll die Anzahl der Karten die man besitzt angeben.

Momentan stehe ich auf dem Schlau, obwohl das öffnen, lesen und schreiben kaum von der Syntax aus php abweicht.

Was mein Ziel ist, ist quasi zuerst auszulesen, ob eine Datei für die Anzahl der Karten vorhanden ist, wenn nicht soll die Anzahl der Karten auf 0 gesetzt werden. Hier habe ich dies manuel gemacht. Ich denke über eine for-next-schleife sollte das machbar sein wenn man jede Karte überprüft und den Wert hineinschreibt, wenn denn auch wirklich eine Datei exestiert, die die Anzahl der Karten angibt, ansonsten kann man davon ausgehen, dass man keine Karten besitzt.

Abschließend nachdem die zufälligen Karten gezogen wurden, sollen diese natürlich in eine Datei geschrieben werden, so dass beim nächsten Ausführen auch die tatsächliche Anzahl ausgelesen werden kann.


Hier mal der Code:
Wie gesagt ich stehe gerade auf dem Schlauch - was mirn bisschen peinlich ist. Meine bisherigen Versuche scheiterten, deshalb habe ich die Lese- & Schreibbefehle usw. heruasgenommen und die Anzahl manuel auf 0 gesetzt. Über Hilfe würde ich mich freuen, sonst setze ich mich später mal wieder dran.

Code: [AUSKLAPPEN]
;Array:
;0- Name
;1- Leben
;2-
;3-
;4-
;5-
;6-
;7-
;8-
;9-
;10- Anzahl der Karte

Dim Karte$(9,11)
karte$(0,0)="Hund" ; Set the array data
karte$(0,1)="Hund" ; Set the array data
karte$(0,2)="Hund" ; Set the array data
karte$(0,3)="Hund" ; Set the array data
karte$(0,4)="Hund" ; Set the array data
karte$(0,5)="Hund" ; Set the array data
karte$(0,6)="Hund" ; Set the array data
karte$(0,7)="Hund" ; Set the array data
karte$(0,8)="Hund" ; Set the array data
karte$(0,9)="Hund" ; Set the array data
karte$(0,10)= 0

karte$(1,0)="Löwe" ; Set the array data
karte$(1,1)="Löwe" ; Set the array data
karte$(1,2)="Löwe" ; Set the array data
karte$(1,3)="Löwe" ; Set the array data
karte$(1,4)="Löwe" ; Set the array data
karte$(1,5)="Löwe" ; Set the array data
karte$(1,6)="Löwe" ; Set the array data
karte$(1,7)="Löwe" ; Set the array data
karte$(1,8)="Löwe" ; Set the array data
karte$(1,9)="Löwe" ; Set the array data
karte$(1,10)= 0

karte$(2,0)="Stier" ; Set the array data
karte$(2,1)="Stier" ; Set the array data
karte$(2,2)="Stier" ; Set the array data
karte$(2,3)="Stier" ; Set the array data
karte$(2,4)="Stier" ; Set the array data
karte$(2,5)="Stier" ; Set the array data
karte$(2,6)="Stier" ; Set the array data
karte$(2,7)="Stier" ; Set the array data
karte$(2,8)="Stier" ; Set the array data
karte$(2,9)="Stier" ; Set the array data
karte$(2,10)= 0

karte$(3,0)="Käfer" ; Set the array data
karte$(3,1)="Käfer" ; Set the array data
karte$(3,2)="Käfer" ; Set the array data
karte$(3,3)="Käfer" ; Set the array data
karte$(3,4)="Käfer" ; Set the array data
karte$(3,5)="Käfer" ; Set the array data
karte$(3,6)="Käfer" ; Set the array data
karte$(3,7)="Käfer" ; Set the array data
karte$(3,8)="Käfer" ; Set the array data
karte$(3,9)="Käfer" ; Set the array data
karte$(3,10)= 0

karte$(4,0)="Fliege" ; Set the array data
karte$(4,1)="Fliege" ; Set the array data
karte$(4,2)="Fliege" ; Set the array data
karte$(4,3)="Fliege" ; Set the array data
karte$(4,4)="Fliege" ; Set the array data
karte$(4,5)="Fliege" ; Set the array data
karte$(4,6)="Fliege" ; Set the array data
karte$(4,7)="Fliege" ; Set the array data
karte$(4,8)="Fliege" ; Set the array data
karte$(4,9)="Fliege" ; Set the array data
karte$(4,10)= 0

karte$(5,0)="Kroko" ; Set the array data
karte$(5,1)="Kroko" ; Set the array data
karte$(5,2)="Kroko" ; Set the array data
karte$(5,3)="Kroko" ; Set the array data
karte$(5,4)="Kroko" ; Set the array data
karte$(5,5)="Kroko" ; Set the array data
karte$(5,6)="Kroko" ; Set the array data
karte$(5,7)="Kroko" ; Set the array data
karte$(5,8)="Kroko" ; Set the array data
karte$(5,9)="Kroko" ; Set the array data
karte$(5,10)= 0


karte$(6,0)="Affe" ; Set the array data
karte$(6,1)="Affe" ; Set the array data
karte$(6,2)="Affe" ; Set the array data
karte$(6,3)="Affe" ; Set the array data
karte$(6,4)="Affe" ; Set the array data
karte$(6,5)="Affe" ; Set the array data
karte$(6,6)="Affe" ; Set the array data
karte$(6,7)="Affe" ; Set the array data
karte$(6,8)="Affe" ; Set the array data
karte$(6,9)="Affe" ; Set the array data
karte$(6,10)= 0

karte$(7,0)="Tiger" ; Set the array data
karte$(7,1)="Tiger" ; Set the array data
karte$(7,2)="Tiger" ; Set the array data
karte$(7,3)="Tiger" ; Set the array data
karte$(7,4)="Tiger" ; Set the array data
karte$(7,5)="Tiger" ; Set the array data
karte$(7,6)="Tiger" ; Set the array data
karte$(7,7)="Tiger" ; Set the array data
karte$(7,8)="Tiger" ; Set the array data
karte$(7,9)="Tiger" ; Set the array data
karte$(7,10)= 0


karte$(8,0)="Krebs" ; Set the array data
karte$(8,1)="Krebs" ; Set the array data
karte$(8,2)="Krebs" ; Set the array data
karte$(8,3)="Krebs" ; Set the array data
karte$(8,4)="Krebs" ; Set the array data
karte$(8,5)="Krebs" ; Set the array data
karte$(8,6)="Krebs" ; Set the array data
karte$(8,7)="Krebs" ; Set the array data
karte$(8,8)="Krebs" ; Set the array data
karte$(8,9)="Krebs" ; Set the array data
karte$(8,10)= 0


karte$(9,0)="Maus" ; Set the array data
karte$(9,1)="Maus" ; Set the array data
karte$(9,2)="Maus" ; Set the array data
karte$(9,3)="Maus" ; Set the array data
karte$(9,4)="Maus" ; Set the array data
karte$(9,5)="Maus" ; Set the array data
karte$(9,6)="Maus" ; Set the array data
karte$(9,7)="Maus" ; Set the array data
karte$(9,8)="Maus" ; Set the array data
karte$(9,9)="Maus" ; Set the array data
karte$(9,10)= 0



SeedRnd MilliSecs()
Booster1 = Rand(0,9)
Print   "Karte " + Karte(Booster1,0) + " erhalten."
   
Booster2 = Rand(0,9)
Print "Karte " + Karte(Booster2,0) + " erhalten."

Booster3 = Rand(0,9)
Print "Karte " + Karte(Booster3,0) + " erhalten."

Booster4 = Rand(0,9)
Print "Karte " + Karte(Booster4,0) + " erhalten."

Booster5 = Rand(0,9)
Print "Karte " + Karte(Booster5,0) + " erhalten."




WaitKey   






DAK

BeitragMo, Mai 26, 2014 21:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Was mir mal als Erstes auffällt ist, dass du ein String-Array verwendest und dort Zahlen rein schreiben willst. Das geht so nicht. Sollte der Compiler nicht direkt meckern, dann wird er 0 (z.B. in der Zeile karte$(1,10)= 0) nach "0" umwandeln, also in einen String. Das klappt da noch so, nur wenn du 0+1 rechnest (um die Zahl zu erhöhen), dann wird daraus "0" + 1. String plus Zahl wird so verarbeitet als wäre die Zahl ein String, also als "0" + "1", was nicht 1 ergibt, sondern "01". Das als Zahl interpretiert würde wieder 1 sein, aber rechne das dann noch mal +1 und du hast ein Problem: "01"+1 = "01"+"1" = "011".

Was du bräuchtest ist entweder ein separates Integer-Array:

BlitzBasic: [AUSKLAPPEN]
Dim Karte$(10,9)
Dim KartenAnzahl(10)


oder besser du beschäftigst dich mit Types. Dort kannst du dann jede Karte als eine Ansammlung beliebiger Variablen definieren, was das Ganze auch deutlich lesbarer macht:

BlitzBasic: [AUSKLAPPEN]
;Type-Schema definieren:
Type Karte
Field name$
Field leben%
Field haeufigkeit#
Field anzahl%
End Type

Dim hand.Karte(10) ;erzeugt ein Array mit 10 Elementen des Types Karte
hand(0) = New Karte ;erzeugt eine Karte, die in das Array an Stelle 0 gespeichert wird
hand(0)\name$ = "Hund" ;Felder des Objekts befüllen
hand(0)\leben% = 100
hand(0)\haeufigkeit# = 0.7
hand(0)\anzahl% = 5


@Kruemelator: Wenn jemand nach dem Unterschied zwischen UDP und TCP fragt, sowie sich darüber informiert, wie das mit der Server-Client-Architektur ausschaut, dann ist UDP-Hole-Punching wohl nicht ganz der richtige Ratschlag.
Gewinner der 6. und der 68. BlitzCodeCompo
 

Snowdragon

BeitragMo, Mai 26, 2014 21:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Jow danke ich schau mir das mal genauer an! Danke!
Aber wofür ist die Häufigkeit?


Und ist es möglich die Types durch das Auslagern in beispielsweise eine Dextdatei auch für das Hauptprogramm beziehungsweise das Duellprogramm verwendbar zu machen, um z.B. abzufragen ob ein Effekt bereits verwendet wurde oder nicht - oder sind dafür Globale Types notwendig - oder erzähle ich hier nur quatsch und liege völlig daneben?
  • Zuletzt bearbeitet von Snowdragon am Mo, Mai 26, 2014 23:28, insgesamt 2-mal bearbeitet

DAK

BeitragMo, Mai 26, 2014 23:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Häufigkeit war nur irgendwas um mehr Felder aufzufüllen.

Ja, 0 wird mit gezählt, deswegen macht man normalerweise einfach um 1 weniger. Willst du 16 Elemente machst du "Dim foo(15)".

Bei den Types hast du ja die Struktur (das was zwischen Type und EndType steht) und einzelne Objekte. Die Struktur gibt vor, welche Felder es für jedes einzelne Objekt gibt. Die Struktur ist dabei für jedes Objekt eines Types gleich. Die lässt sich nicht auslagern. Der Inhalt der Objektvariablen lässt sich natürlich auslagern. Dazu muss man sich eine Funktion schreiben, die den Type in einen String umwandelt (serialisiert) und eine zweite für das Gegenteil (deserialisieren).

Als Beispiel:

BlitzBasic: [AUSKLAPPEN]
karte1.Karte= New Karte ;erzeugt eine Karte, die in das Array an Stelle 0 gespeichert wird
karte1\name$ = "Hund" ;Felder des Objekts befüllen
karte1\leben% = 100
karte1\haeufigkeit# = 0.7
karte1\anzahl% = 5

;Musst du umwandeln in:

karteSerial$ = "Hund;100;0.7;5"


Man kann statt Strichpunkten natürlich auch andere Zeichen verwenden. Am besten nimmt man dabei ein Zeichen, dass nie den Strings im Type vorkommt.

Ein so ein String repräsentiert somit den gesamten Inhalt eines Objekts und kann als Zeile in eine Textdatei geschrieben werden.

Zum Zurück-Umwandeln klappert man den String mit Instr nach Strichpunkten (oder sonstigen Trennzeichnen) ab, trennt ihn mit Left, Right und Mid in die einzelnen Tokens auf und speichert sie nach einander in die einzelnen Felder.
Gewinner der 6. und der 68. BlitzCodeCompo
 

Snowdragon

BeitragMo, Mai 26, 2014 23:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Wow das Forum braucht wirklich ein "Thanks-Button"! Wink

Dann hab ich das Poblem, dass sich lediglich das Tier Maus ausgeben lässt. Beim Versuch Kuh (wie angegeben) oder Affe auszugeben kommt folgende Meldung: object does not exist!
Code: [AUSKLAPPEN]
;Type-Schema definieren:
Type Karte
     
   Field name$


End Type

Dim spielkarte.Karte(2) ;erzeugt ein Array mit 10 Elementen des Types Karte
spielkarte(0) = New Karte ;erzeugt eine Karte, die in das Array an Stelle 0 gespeichert wird
spielkarte(0)\name$ = "Affe" ;Felder des Objekts befüllen



Dim spielkarte.Karte(2) ;erzeugt ein Array mit 10 Elementen des Types Karte
spielkarte(1) = New Karte ;erzeugt eine Karte, die in das Array an Stelle 0 gespeichert wird
spielkarte(1)\name$ = "Kuh" ;Felder des Objekts befüllen



Dim spielkarte.Karte(2) ;erzeugt ein Array mit 10 Elementen des Types Karte
spielkarte(2) = New Karte ;erzeugt eine Karte, die in das Array an Stelle 0 gespeichert wird
spielkarte(2)\name$ = "Maus" ;Felder des Objekts befüllen





Print spielkarte(1)\name$



DAK

BeitragDi, Mai 27, 2014 7:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Dim erstellt ein neues, leeres Array und löscht vorhandene Arrays mit dem gleichen Namen. Das heißt, du erstellst ein Array mit drei leeren Plätzen für Karten, gibst eine Karte rein und erstellst ein neues leeres Array. So bleibt im Endeffekt nur die letzte Karte übrig, was die Maus ist.

Noch ein paar Sachen zu Types:
-) BB hat keinen Garbage Collector, das heißt, du musst jedes Objekt, dass du erstellst, manuell löschen (Delete()) wenn du es nicht mehr brauchst, sonst bekommst du Memory Leaks.
-) Die Variablen, in denen Objekte gespeichert werden sind nur Referenzen. Du kannst mehrere Referenzen auf das gleiche Objekt haben. Was also gut geht ist, dass du die Karten jeweils nur ein mal erstellst und dann in dem Array, dass die Hand des Spielers repräsentierst einfach zwei oder mehr mal rein schreibst.
-) Alle Objekte eines Types werden automatisch in eine Liste geschrieben, die man mit den Befehlen First, Last, After, Before und Each durchlaufen kann, wenn man irgendeine Operation auf alle Objekte eines Types anwenden will (so kann man z.B. jeder KI-gesteuerten Spielfigur sagen, dass sie sich bewegen soll).
Gewinner der 6. und der 68. BlitzCodeCompo
 

Snowdragon

BeitragDo, Mai 29, 2014 18:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habs jetzt zunächst so gelöst:

Code: [AUSKLAPPEN]

;Type-Schema definieren:
Type Karte
    Field card_nummer%
   Field name$
   Field leben%
   Field anzahl_karte%
       ; usw ...
End Type

For a = 0 To 9
   Dim spielkarte.Karte(a)
Next

;Dann halt jede Karte die entsprechenden Eigengenschaften zugewiesen => AUßER DIE anzahl_karte%!
;Diese soll sofern keine Speicherdatei exestiert für jede Karte auf 0 gesetzt werden
;Exestiert eine Datei, so soll die Anzhal jeder Karte ermittelt werden


Nun tu ich mich schwer mit dem Schreiben und Laden der Anzahl. Ich will die Anzahl jeder Karten im Besitz auslesen und eventuell überschreiben:
- Wenn man das Spiel startet und keine Speicherdatei vorhanden ist => jede Karte auf 0 setzen quasi =>spielkarte.Karte(0-9)\anzahl_karte% = 0
- Wenn eine Datei vorhanden ist => Die Anzahl für jede Karte ermitteln

Hab mir bereits verschiedene Beispiele angesehen und selbst was probiert aber irgendwie will es nicht so recht.
Würde mich echt freuen!

DAK

BeitragDo, Mai 29, 2014 20:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Zu erst Mal:
BlitzBasic: [AUSKLAPPEN]
For a = 0 To 9 
Dim spielkarte.Karte(a)
Next

Das ist immer noch Blödsinn. Was du hier tust ist Folgendes:

Erstelle ein Array vom Typ karte mit 1 Elementen und speichere es unter dem Namen spielkarte.
Erstelle ein Array vom Typ karte mit 2 Element und speichere es unter dem Namen spielkarte (überschreibe und lösche dadurch das alte Array).
Erstelle ein Array vom Typ karte mit 3 Elementen und speichere es unter dem Namen spielkarte (überschreibe und lösche dadurch das alte Array).
...
Erstelle ein Array vom Typ karte mit 10 Element und speichere es unter dem Namen spielkarte (überschreibe und lösche dadurch das alte Array).

Was du wirklich willst ist Folgendes:

BlitzBasic: [AUSKLAPPEN]
Dim spielkarte.Karte(9)


Das erstellt auf Anhieb ein Array mit 10 Feldern. Du musst nicht jedes Feld einzeln erstellen.


Jetzt zur Datei: Beginnen wir mit Schreiben, Auslesen kommt danach.

Um alle Karten zu speichern mach sowas:
BlitzBasic: [AUSKLAPPEN]
Function saveAllCards(filename$)
stream = WriteFile(filename$)
For spielkarte.Karte = Each Karte
WriteLine(stream, spielkarte.card_number%+";"+spielkarte.name$+";"+spielkarte.leben%+";"+spielkarte.anzahl%)
Next
CloseFile(stream)
End Function


"WriteFile" öffnet eine Datei zum Schreiben.
"For karte.Karte = each Karte" bedeutet, dass diese Schleife ein mal für jede existierende Karte ausgeführt wird. Dabei wird bei jedem Schleifendurchlauf die aktuelle Karte in die Variable karte geschrieben.
"WriteLine(stream, "Text")" schreibt Text als eine Zeile in die Datei.
"CloseFile(stream)" schließt die Datei und beendet somit den Dateizugriff. Sollte man auf jeden Fall machen, da die Datei sonst geöffnet bleibt und für alle anderen Zugriffe (z.B. verschieben oder löschen) gesperrt wird.

Jetzt solltest du eine Datei haben, wo die Daten aller Karten drinnen stehen.

Jetzt zum Auslesen:
BlitzBasic: [AUSKLAPPEN]
Function readAllCards(filename$)
stream = ReadFile(filename$)
While (Not Eof(stream))
Line$ = ReadLine(stream)
If (Len(Line$)>0) Then
Local spielkarte.Karte = New Karte
pos% = Instr(Line$, ";")
spielkarte\card_nummer% = Int(Left(Line$,pos%-1))
lastpos% = pos%
pos% = Instr(Line$, ";", pos%)
spielkarte\name$ = Mid(Line$, lastpos%+1, pos%-1)
lastpos% = pos%
pos% = Instr(Line$, ";", pos%)
spielkarte\leben% = Int(Mid(Line$, lastpos%+1, pos%-1))
spielkarte\anzahl_karte% = Int(Right(Line$, pos%+1))
End If
Wend
CloseFile(stream)
End Function


Wie das funktioniert:
ReadFile funktioniert wie WriteFile, nur zum Lesen, nicht zum Schreiben.
"While (Not Eof(stream))" heißt, dass gelesen wird, solange das Ende der Datei noch nicht erreicht wurde.
"ReadLine(stream)" liest genau eine Zeile aus.
"Len(line$)>0" ist da um eventuelle Leerzeilen herauszufiltern.
Dann wird eine Spielkarte erstellt, und jedes einzelne Tag herausgefiltert.
Mit Instr wird immer die Position des nächsten ";" gesucht und mit Left, Mid und Right werden die passenden Teile herausgeschnitten. Int() castet die Zahlen, die in dem String stehen, nach Int um.
Gewinner der 6. und der 68. BlitzCodeCompo
 

Snowdragon

BeitragDo, Mai 29, 2014 22:16
Antworten mit Zitat
Benutzer-Profile anzeigen
*Nachricht gelöscht

*DAK einfach nur ein herzliches Dankeschön du bist der BESTE! Irgendwie fühl ich mich schlecht weil du dir die Zeit nimmst und mir alles erklärst <,<

Ich hab das Schreiben versucht und bekam die Meldung ')' expect oder sowas. Dann habe ich die Schreibweise geändert (kein . sondern ein \). Danach kam die Meldung: Identifier Karte may be not used like this oder etwas in der Art.

Dann habe ich es folgendermaßen gelöst:

Code: [AUSKLAPPEN]

Function saveAllCards(filename$)
   stream = WriteFile(filename$)
   For tb = 0 To 9 Step 1
      WriteLine (stream,spielkarte.Karte(tb)\name$+";"+spielkarte.Karte(tb)\anzahl_karte%)
   Next
   CloseFile(stream)
End Function



Was ich aber mit dem Each schöner finden würde und nicht weiß, weshalb es nicht funktioniert. Ist die schreibweise mit dem \ auch richtig? Und wieso wird keine Speicherdatei angelegt? Denn es wäre ganz schön, wenn das Spiel geschlossen wird und die Daten von vorherigen Mal noch exestieren würden.

Tennisball

BeitragDo, Mai 29, 2014 23:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe irgendwie das Gefühl, dass du dich noch nicht ausreichend viel mit den absoluten Grundlagen beschäftigt hast. Arbeite am besten mal dieses Tutorial durch: http://de.wikibooks.org/wiki/B...y-Tutorial (Insbesondere den Teil "Grundlagen" gründlichst durcharbeiten)
 

Snowdragon

BeitragFr, Mai 30, 2014 0:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja das simmt schon. Momentan ist es so, dass ich bis Mitte nächster Woche nur gelegentlich nebenbei programmieren kann und ich will so schnell wie möglich neue Erfolge verbuchen und schraube darum am Spiel, obwohl natürlich nicht alle Grundlagen da sind. Keine Sorge das ändert sich mit der kommenden Woche.

Auf die Seite bin ich auch schon gestoßen und werde sie mir aufjedenfall genauer ansehen, bzw. durcharbeiten. Ich suche jetzt auch Leute im BB-Stellenmarkt, die eventuell Interesse hätten mitzuarbeiten, dann nerve ich vermutlich nicht mehr so.^^
 

Snowdragon

BeitragFr, Jun 27, 2014 14:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Kann mir vlt. jemand helfen, denn irgendwie stehe ich auf dem Schlauch.

Ausgangssituation:
Das Deck besteht aus 5 unterschiedlichen Karten.
Später aus 40 Karten - zu Testzwecken auf 5 reduziert.

Ich möchte nämlich, dass keine Karte 2x gezogen werden kann.
Alle 5 Karten sollen gezogen werden.

Alles drumherum, die Anzeige der Karten etc. funktioniert. Mein Problem ist nur, dass ich seltsamerweise 5x die selbe Zufallszahl erhalte, obwohl ich dachte es mit dem folgenden Code verhindern zu können.


Code: [AUSKLAPPEN]

....

Dim Kartenziehen(5)
   
For i = 1 To 5
   Kartenziehen(i) = True
Next
   
   
   SeedRnd MilliSecs()
               
   Handkarte1 = Rand(1,5)
   Kartenziehen(Handkarte1) = False 
   Print Handkarte1

   Handkarte2 = Rand(1,5)
   While Kartenziehen(Handkarte2) = True
      Handkarte2 = Rand(1,5)
   Wend
   Kartenziehen(Handkarte2) = False    
   Print Handkarte2            
         
   Handkarte3 = Rand(1,5)
   While Kartenziehen(Handkarte3) = True
      Handkarte3 = Rand(1,5)
   Wend
   Kartenziehen(Handkarte3) = False    
   Print Handkarte3   
   
   Handkarte4 = Rand(1,5)
   While Kartenziehen(Handkarte4) = True
      Handkarte4 = Rand(1,5)
   Wend
   Kartenziehen(Handkarte4) = False    
   Print Handkarte4
   
   Handkarte5 = Rand(1,5)
   While Kartenziehen(Handkarte5) = True
      Handkarte5 = Rand(1,5)
   Wend
   Kartenziehen(Handkarte5) = False    
   Print Handkarte5   

Gehe zu Seite Zurück  1, 2, 3  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group