Rundenbasiertes Spiel, Preise usw. sinnvoll fortschreiben

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
Makke
Beiträge: 156
Registriert: 24.08.2011 18:00
Computerausstattung: AMD Ryzen 7 5700X - AMD Radeon RX 6800 XT - 32 GB DDR4 SDRAM
Wohnort: Ruhrpott
Kontaktdaten:

Rundenbasiertes Spiel, Preise usw. sinnvoll fortschreiben

Beitrag von Makke »

Hallo zusammen,

die Überschrift ist etwas cryptisch, aber leider hat man nicht genug Platz um ausführlicher zu werden.

Hier also mein Problem und die Fragen dazu:

Ich schreibe gerade an einem rundenbasierten Wirtschaftsspiel. Das ganze ist als Übung für mich gedacht, von daher habe ich keinen eigenen kreativen Ansatz, sondern versuche ein Remake des Spiele-Klassikers HANSE zu erstellen.

Das Grundgerüst steht soweit das ich mich nun mit dem Rundenende befasse. Hier sind zig Variablen (Preise, Wetter, Ereignisse) zu setzen um dann die nächste Runde beginnen zu können. Bisher habe ich das alles mit Random gemacht, aber irgendwie ist das seltsam. Ein Beispiel:

Es gibt vier Wetterlagen: stille See, ruhige See, bewegte See und stürmische See. Das Ur-Hanse hat einen Zug einem Jahr gleich gesetzt. Ich jedoch setze einen Zug einem Monat gleich. Es ist also wahrscheinlicher, dass im Januar stürmische See ist als im Juni.

Ursprünglich habe ich das Wetter mit

Code: Alles auswählen

Random(3)
ermittelt, also nicht sehr schön. Nunmehr müsste ich den Wetterfaktor nach dem jeweiligen Monat gewichten, aber soll hierin trotzdem noch der Zufall eine Rolle spielen oder ist es besser das Wetter quasi fortzuschreiben, allerdings würde zB eine Wetterrecherche der letzten 900 Jahre den Übungsansatz des Hanse Remakes sprengen, zudem ich plane das Spielchen netzwerkfähig zu machen ?

Also so:

Code: Alles auswählen

If Monat = "Januar"
  Wetter = Random(9)
  if Wetter = 0 or Wetter = 1 or Wetter = 2 or Wetter = 3
    WetterText = "stürmisch"
  elseif Wetter = 4 or Wetter = 5 or Wetter = 6
    WetterText = "bewegte"
  elseif Wetter = 7 or Wetter = 8
    WetterText = "ruhige"
  else
    WetterText = "stille"
  endif
endif
oder doch ganz anders ?

Das nächste Problem sind die Preise zB für die Waren, normalerweise würde ich man Preise nach Angebot und Nachfrage bestimmen, aber wie soll das hier in einem Einzelspieler-Modus funktionieren ? Bestimmte Waren werden ja lediglich verkauft (Wolle usw.). Hier könnte auch der Jahreszyklus eine Rolle spielen (Wolle und Pelze im Winter, Leinen im Sommer, Tran und Honig das ganze Jahr). Ehrlich gesagt, da bin ich recht ratlos.

Also dachte ich mir ich stelle die ganze Thematik hier für alle interessierten mal zu Diskussion. Ich danke schonmal für etwaige Lösungansätze und natürlich schreibe ich meine eigenen vielleicht mir noch einfallenden ebefalls hier hinein.
---
Windows 11 (64 bit)
Benutzeravatar
Bisonte
Beiträge: 2471
Registriert: 01.04.2007 20:18

Re: Rundenbasiertes Spiel, Preise usw. sinnvoll fortschreibe

Beitrag von Bisonte »

Je "echter" es werden soll, je mehr Aufwand....

Damals bei dem Ur-Hanse auf dem C64 ;) war es wohl so wie Du es gerade beschreibst.
Zufallsgenerator (vielleicht nur mit etwas höheren Werten also Prozentchancen mein ich eher).
Und eine Rückfrage, wie das Wetter des Zuges vorher war... Auf Sturm folgt erstmal mit sehr
hoher Wahrscheinlichkeit raue See.

Bei Preisen ist es schon anders. Da eine Angebot-Nachfrage reinzuhämmern muss man dann schon
für den Einzelspielermodus, Spieler simulieren. Netzwerkmodus ist da ein klein wenig einfacher ...

Das ganze wandert ja dann doch schon in Richtung "KI".
Dabei tu ich mich immer schwer, weil das Programm weiss alles, aber wieviel weiss der
Spieler... (beispiel: KI in Schiffe versenken ;) ) soll ja nicht zu schwer oder gar unspielbar
werden. Nur Zufallsgeneratoren ist da zu banal und wirkt dann auch nicht richtig...
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Rundenbasiertes Spiel, Preise usw. sinnvoll fortschreibe

Beitrag von STARGÅTE »

bezüglich des Wetters:

Wenn ich ein gewichtetes Zufallsergebnis haben möchte, nutze ich zB diese Prozedure:

Code: Alles auswählen

Procedure RandomField(Field1.f, Field2.f, Field3.f=0, Field4.f=0, Field5.f=0, Field6.f=0, Field7.f=0, Field8.f=0)
	Protected Total.f = Field1+Field2+Field3+Field4+Field5+Field6+Field7+Field8
	Protected Value.f = Random(2147483647)/2147483648.0*Total
	If Value < Field1
		ProcedureReturn 1
	ElseIf Value < Field1+Field2
		ProcedureReturn 2
	ElseIf Value < Field1+Field2+Field3
		ProcedureReturn 3
	ElseIf Value < Field1+Field2+Field3+Field4
		ProcedureReturn 4
	ElseIf Value < Field1+Field2+Field3+Field4+Field5
		ProcedureReturn 5
	ElseIf Value < Field1+Field2+Field3+Field4+Field5+Field6
		ProcedureReturn 6
	ElseIf Value < Field1+Field2+Field3+Field4+Field5+Field6+Field7
		ProcedureReturn 7
	Else
		ProcedureReturn 8
	EndIf
EndProcedure
Damit kannst du dann zB. mit Prozentzahlen, Faktoren usw. gewichtete Zufallsergebnisse bekommen.
Als Parameter wird dabei die Gewichtung des jeweiligen Feldes angegeben:

Code: Alles auswählen

For Test = 1 To 10
	Debug RandomField(75, 25)
Next
Dieser Code würde also ein Zufallsergebnis produzieren, wo zu 75% 1 und zu 25% 2 zurückgegeben wird.
Für dein Wetterbeispiel wäre es dann:

Code: Alles auswählen

Wetter = Random(4, 3, 2, 1)
Select Wetter
   Case 1 : WetterText = "stürmisch"
; [...]
   Case 4 : WetterText = "stille"
Die Gewichtung liegt also wie bei dir so, dass "stürmisch" vier mal so oft kommt wie "stille"
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Makke
Beiträge: 156
Registriert: 24.08.2011 18:00
Computerausstattung: AMD Ryzen 7 5700X - AMD Radeon RX 6800 XT - 32 GB DDR4 SDRAM
Wohnort: Ruhrpott
Kontaktdaten:

Re: Rundenbasiertes Spiel, Preise usw. sinnvoll fortschreibe

Beitrag von Makke »

@Stargate: Vielen Dank für die Procedur, habe sie direkt eingebaut. Wenn ich mich dunkel an Mathe erinnere, ist das die Produktmethode bei Wahrscheinlichkeitsrechnung ?

@Bisonte:

Also die Preise habe ich nun folgendermaßen gestaltet, zunächst habe ich die Bevölkerungszahl von Lübeck ab 1350 recherchiert und dann die Bevölkerung bis 1500 linear gleichmäßig ansteigen lassen. Dann wird zu jedem Produkt eine Nachfragehäufigkeit generiert. Z.B. Pelze werden in den Monaten November bis Februar wesentlich häufiger nachgefragt als im Juni oder Juli. Als nächstes wird die Menge aller gelieferten Pelze aller Spieler (1 menschlicher und 2 CPU's) zusammengerechnet und mit der Nachfragemenge verglichen. Wird die Nachfragemenge befriedigt oder mehr als befriedigt, sinkt der Preis ausgehend von einem (von mir festgelegten) Durchschnittspreis. Sollte die Nachfragemenge höher sein, steigt der Preis an.

Was mir jetzt noch Kopfzerbrechen bereitet ist eine vernünftige Lösung für die Lieferung der Waren, also wie entwickelt sich die Liefermenge im Bezug auf die versendeten Schiffe, die Speichergröße am Tauschort usw.

Mein bisheriger Ansatz sieht so aus: Ich lege einen festens Tauschkurs Salz zu Ware X (Bsp. Wolle) fest. Ich liefere also 100 Salz und bekomme dafür 75 Wolle mit einem Speicher. Dann subtrahiere ich noch abhängig vom Seegang einen gewissen Anteil Ware von dem Tauschkurs und erhalte dann die gelieferte Menge an Waren. Aber so richtig gefällt mir das noch nicht.

Wenn da noch einer einen Tip hätte wäre das super.
---
Windows 11 (64 bit)
Antworten