Seite 1 von 1

Inventar coden

Verfasst: Sonntag 7. April 2024, 18:41
von saftigerosaft78
Guten Abend!
Ich habe folgendes Problem nach 4h rumprobieren.

Ich bin zur Zeit bei einem text adventure nun hätte ich aber gerne ein inventar! ich kriege das einfach nicht hin. der spieler soll ein item aufsammeln dürfen. das wird dann gespeichert. später im spiel wird dan geschaut ob der spieler dieses item hat und verwenden kann. außerdem soll er abrufen können was er zur zeit drinne hat. ich hätte nach 4h nun sehr gerne einfach ein code der mir erklärt wird wie er funktioniert. danke ;)

Re: Inventar coden

Verfasst: Sonntag 7. April 2024, 20:23
von __deets__
Niemand wird dir das so hinstellen, weil das auch ohne den Rest deines Spiels wenig sinnvoll ist. Das Inventar muss ja mit den Szenen interagieren, wenn da zb der Schraubenschlüssel in der Garage liegt, muss dein Text das so lange erwähnen, bis der Spieler sagt “nehme Schraubenschlüssel “, etc pp. Einen losgelösten Inventarcode gibts also nicht.

Die Chancen auf Hilfe sind dementsprechend höher, wenn du deinen Code zeigst.

Re: Inventar coden

Verfasst: Sonntag 7. April 2024, 20:45
von nezzcarth
Bei den Adventures, die ich so kenne, ist zudem Spiel-intern vordefiniert, welche Items man im Spiel finden kann. Das ist im einfachsten Fall also einfach nur eine Sammlung von Wahrheitswerten/Flags nach dem Schema "hat-Schaubenschlüssel: ja/nein" (was jetzt kein Implementierungsvorschlag ist). Anders als zum Beispiel bei einem Rollenspiel, wo man etwa ein Inventar mit 20 frei belegbaren Slots hat oder so. Die benötigten Strukturen und Mechanismen sind ganz andere. Und du musst für dich klären, was dein Inventar können muss und wie deine Spiellogik damit interagieren soll.

Re: Inventar coden

Verfasst: Donnerstag 18. April 2024, 19:24
von PierreDole
saftigerosaft78 hat geschrieben: Sonntag 7. April 2024, 18:41 Guten Abend!
Ich habe folgendes Problem nach 4h rumprobieren.

Ich bin zur Zeit bei einem text adventure nun hätte ich aber gerne ein inventar! ich kriege das einfach nicht hin. der spieler soll ein item aufsammeln dürfen. das wird dann gespeichert. später im spiel wird dan geschaut ob der spieler dieses item hat und verwenden kann. außerdem soll er abrufen können was er zur zeit drinne hat. ich hätte nach 4h nun sehr gerne einfach ein code der mir erklärt wird wie er funktioniert. danke ;)
Da die Frage sehr allgemein gestellt wurde, hier auch eine allgemeine Antwort. Erstelle die Klassen Item, ItemList und Inventar. Item hat beispielsweise die Properties id, name, type, durability, damage, etc. ItemList hat eine list mit item_id und stack und enthält alle im Spiel verfügbaren Items. Inventar erbt von ItemList. Damit nach dem Spielen nichts verloren geht, kannst du eine Datenbank mit gleichem Schema erstellen. Ob nun als JSON oder SQL, ist erstmal egal. Nun kannst du aus der ItemList die entsprechenden item_ids in die Inventar-Klasse übertragen, die dein Char haben soll / aufsammelt. Hat der Char mehrere Items gleichen Typs, z.B. Gold, dann erhöhst du die stack-Zahl. Danach ist es einfach alle Items aus dem Inventar auszulesen.

Was sehr sinnvoll wäre, ist Code lesen. Es gibt Spiele, die mit pygame realisiert wurden. Da kann man sich Vieles abgucken. Bestensfalls gibt es dazu auch noch ein Youtube-Video, in dem das Game live programmiert wurde.

Re: Inventar coden

Verfasst: Samstag 20. April 2024, 15:43
von __blackjack__
@PierreDole: Das klingt irgendwie nach Java und nicht nach Python, und selbst da wäre der Umweg über eine ID, statt da einfach das zugehörige Objekt zu speichern, ungewöhnlich. Eine Identität haben Objekte übrigens schon so, ohne das man ihnen noch künstlich so ein Attribut verpassen muss.

`stack` weckt als Name andere Erwartungen beim Leser als eine Anzahl.

Im einfachsten Fall wenn es nur um Vorhandensein oder nicht geht, wäre das ein `set` mit Gegenständen. Die Gegenstände wären im einfachen Fall Werte eines Aufzählungstyps (`enum`-Modul). Denen kann man sogar konstante Eigenschaften wie Typ, Verteidigungspunkte, Angriffspunkte usw. mitgeben. Wenn man mehr als Vorhandensein, also beispielsweise auch die Anzahl braucht, bietet sich ein Wörterbuch als Datentyp an, der die Enum-Werte auf die Anzahl abbildet.

Das kann man in eine Klasse kapseln, aber `Inventory` sollte davon eher nicht erben. Komposition ist in der Regel besser für so etwas, weil man dann keine allgemeinen Methoden hat, die da mitgeerbt werden, aber auf einem `Inventory` keinen Sinn machen.

Re: Inventar coden

Verfasst: Samstag 20. April 2024, 16:25
von nezzcarth
PierreDole hat geschrieben: Donnerstag 18. April 2024, 19:24 Da die Frage sehr allgemein gestellt wurde, hier auch eine allgemeine Antwort.
Wobei ich ja finde, dass die Antwort dann doch eher in Richtung RPG-Inventar geht, also wo man n Slots hat, Items gestapelt werden können, man die Slots durch den Zukauf von Taschen erweitern kann, Items ein Gewicht haben, verderben können usw. Während klassische Text- oder Point-and-Click-Adventure "Inventare" letztendlich – und wenn man ganz anachronistisch unterwegs ist – wohl sogar mit einem simplen Bitfeld auskommen würden, was nur heute niemand mehr macht und in Python schon doppelt nicht; was __blackjack__ beschreibt, ist ja die zeitgemäße Variante dessen.

Re: Inventar coden

Verfasst: Samstag 20. April 2024, 17:38
von __blackjack__
@nezzcarth: Jetzt wo Du's erwähnst: Im `enum`-Modul gibt es auch `IntFlag`, was ja quasi ein Bitfeld darstellt.

Code: Alles auswählen

In [39]: Items = enum.IntFlag("Item", "HELMET SWORD BOILER_ROOM_KEY TOWEL")

In [40]: Items.HELMET
Out[40]: <Item.HELMET: 1>

In [41]: Items.SWORD
Out[41]: <Item.SWORD: 2>

In [42]: Items.BOILER_ROOM_KEY
Out[42]: <Item.BOILER_ROOM_KEY: 4>

In [43]: Items.TOWEL
Out[43]: <Item.TOWEL: 8>

In [44]: inventory = Items(0)

In [45]: Items.TOWEL in inventory
Out[45]: False

In [46]: inventory |= Items.HELMET | Items.TOWEL

In [47]: inventory
Out[47]: <Item.TOWEL|HELMET: 9>

In [48]: Items.TOWEL in inventory
Out[48]: True

In [49]: Items.SWORD in inventory
Out[49]: False

In [50]: Items.HELMET in inventory
Out[50]: True

In [51]: int(inventory)
Out[51]: 9

In [52]: inventory.bit_count()  # Quasi `len()`.
Out[52]: 2

In [53]: inventory &= ~Items.HELMET

In [54]: inventory
Out[54]: <Item.TOWEL: 8>