Inventar coden

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
saftigerosaft78
User
Beiträge: 1
Registriert: Sonntag 7. April 2024, 17:55

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 ;)
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
nezzcarth
User
Beiträge: 1638
Registriert: Samstag 16. April 2011, 12:47

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.
PierreDole
User
Beiträge: 19
Registriert: Sonntag 21. Mai 2017, 20:31
Wohnort: Hambuach

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.
Benutzeravatar
__blackjack__
User
Beiträge: 13124
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
nezzcarth
User
Beiträge: 1638
Registriert: Samstag 16. April 2011, 12:47

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.
Benutzeravatar
__blackjack__
User
Beiträge: 13124
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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>
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten