Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [PHP] Kämpfe bei Browsergames mit verschiedenen Einheiten (https://www.delphipraxis.net/57643-%5Bphp%5D-kaempfe-bei-browsergames-mit-verschiedenen-einheiten.html)

faux 26. Nov 2005 22:01

Re: [PHP] Kämpfe bei Browsergames mit verschiedenen Einheite
 
Ich hab auch mal eins programmiert und habs so gemacht:
In der Tabelle wo die Ressourcen drinnen stehen, steht auch ein UNIX-Timestamp. Und zwar der, zu dem die Daten das letzte Mal aktualisiert wurden. Dann rechne ich mit die Sekunden aus, die nachzurechnen sind, und fertig. Dann kann man schon rechnen.
So kann man das im Prinzip mit jedem Zeitlichbedingten Faktor machen.

Grüße
Faux

Master_RC 26. Nov 2005 22:03

Re: [PHP] Kämpfe bei Browsergames mit verschiedenen Einheite
 
k, leutz :D

Also das Ganze soll so aussehen:

Es gibt eine eigene Tabelle für Einheiten (hui...)

Meinetwegen:
id, name, owner, gruppe, ...

tja, jetzt wäre es richtig schön, wenn man auf einer seite (meinetwegen auf der man den angriff starten kann) per Haken bei den Einheiten anwählen kann, wer in den Krieg ziehen soll.
(Checkbox, weil ich es machen will, dass jede Einheit individuell sein kann :) )

So...
meine Probleme:
Wie löse ich das mit den Haken - bzw. wie mache ich dazu eine SQL-Abfrage?

und wie gehts dann weiter ^^

Ich hätte das gerne so:

Ich einer Tabelle wird abgespeichert, welche Kämpfe noch bevorstehen und wie lange es noch dauert, bis die schlacht anfängt.
=> Im Mittelalter dauerte es auch, bis man zum Schlachtfeld kam ;)

So...
jetzt wenn ein Spieler meinetwegen eine neue Seite öffnet - oder sich ein Spieler neu einloggt - dann soll überprüft werden, welche Schlachten bereits überfällig sind und diese eben dann simuliert.

//EDIT:
-------------------------
Zitat:

Zitat von faux
Ich hab auch mal eins programmiert und habs so gemacht:
In der Tabelle wo die Ressourcen drinnen stehen, steht auch ein UNIX-Timestamp. Und zwar der, zu dem die Daten das letzte Mal aktualisiert wurden. Dann rechne ich mit die Sekunden aus, die nachzurechnen sind, und fertig. Dann kann man schon rechnen.
So kann man das im Prinzip mit jedem Zeitlichbedingten Faktor machen.

Grüße
Faux

Tut mir Leid, verstehe den Zusammenhang nicht :(

Binärbaum 26. Nov 2005 22:22

Re: [PHP] Kämpfe bei Browsergames mit verschiedenen Einheite
 
Zitat:

Zitat von Master_RC
//EDIT:
-------------------------
Zitat:

Zitat von faux
Ich hab auch mal eins programmiert und habs so gemacht:
In der Tabelle wo die Ressourcen drinnen stehen, steht auch ein UNIX-Timestamp. Und zwar der, zu dem die Daten das letzte Mal aktualisiert wurden. Dann rechne ich mit die Sekunden aus, die nachzurechnen sind, und fertig. Dann kann man schon rechnen.
So kann man das im Prinzip mit jedem Zeitlichbedingten Faktor machen.

Grüße
Faux

Tut mir Leid, verstehe den Zusammenhang nicht :(

Das liegt vielleicht daran, dass faux die Ressourcenverwaltung meinte und nicht das Kampfsystem, um das es dir ja erstmal geht. Insofern ist die Aussage erstmal nicht so wichtig, zumindest solange es in deinem Browserspiel keine Ressourcen gibt. ;)

Master_RC 26. Nov 2005 22:32

Re: [PHP] Kämpfe bei Browsergames mit verschiedenen Einheite
 
Axo, ja :)

Ja, ja, so ein Ressourcensystem hab ich schon gemacht ;)
Natürlich noch etwas ausgeschweifter, aber trotzdem danke für den hinweis ;)

Bitte zurück zum Thema :)

Taladan 26. Nov 2005 22:46

Re: [PHP] Kämpfe bei Browsergames mit verschiedenen Einheite
 
Empfehlenswert wäre da nicht feste Werte auf Angriff oder Parade. Hatte mal vor einiger zeit was ähnliches Geplant. In meinen Test haben feste Werte plus modi doch recht wahrscheinliche Ende. Hier wäre ein anderer Modi (aus P&P RP abgeschaut), was das ganze doch unwahrscheinlicher macht, das ein kleiner einen großen umhaut aber trotzdem möglich läßt.

Alle werte sollten irgendwo zwischen 5-20 liegen (nicht zu hoch greifen, da an sonnsten die Rechnerei später fast außerdimensionale Zustände bekommen könnte).

Select * from Einheiten where Position=(eine position, falls Weltenbasierend oder Person, falls Personenbezogen)

Nu die Einheitenwerte eine aus eigener tabelle auslesen, hier besten jede Einheit eine eigene position (ich empfehle einzelne einheiten, da massen wieder ähm zu plump sind).

Zum Kampf:

Beispiel:

3 Krieger vs. 2 Monster

AT= 6 8
PA= 3 5
LeP= 6 9
TP= 1W3 2w4
RS = 3 1
Attacken: 1 1
Parade 1 1
Ini 3 5

So zu den Werten AT=Attacke PA= Parade LeP = Lebenpunkte, TP 1W3 bedeutet das dieser bei treffer 1x einen Schaden von 1-3 macht, das monster jedoch 2x von 1-4 (effektiv möglich 2-8).

Kampfscript würde ungefähr so aussehen (Kampf-Gruppierung aufstellen)
1x 1 Krieger vs 1 Monster
1x 2 Krieger vs 1 Monster

oder User-Defined
1x 3 Krieger vs 1 Monster
1x - vs 1 Monster
(was bedeutet, das das monster einen der drei monster angreift, aber einfachhalber immer den selben)

Jeder Krieger hat 1 Attacke und 1 Parade pro Runde.

Allgemeines Kampfscript:

Begin:
Die Figur mit den höchsten iniwert hat den ersten schlag (Hier kann man noch einen Randomwert von 1W6 einrichten, der jede Runde neu ausgewürfelt wird)

Attacken:
Random(20) < AT = daneben
Ranodm(20) > AT = getroffen

Paraden:
Random(20) < PA Abgewehrt
Random(20) > PA getroffen

Treffer:
Krieger: LeP - (Random(3) - RS(des Gegners))
Monster: LeP - (2xRandom(4) - RS(des Gegner))

Jeder darf so häufig angreifen wie er Attacken hat pro runde, selbe gilt für die auch Verteidigung, welche jedoch nur bei einer geglücken Attacke verbraucht wird (verfällt dann aber am Ende der Runde).
Bei 3K vs 1M bedeutet dies, das, wenn alle treffen, das monster nur den ersten schlag abweren könnte.
Nach jeder Runde muß sich jeder Kampfteilnehmer neu Orientieren, um evtl neuen gegner zu bestimmen.

3 vs 1M und - vs 1M
1 Runde
Monster1 greift Krieger 2 an. 9 = Daneben.
Monster2 greift Krieger 1 an. 12 = Daneben.
Krieger1 greift Monster1 an. 10 = Daneben.
Krieger2 greift Monster1 an. 2 = Getroffen.
Monster1 versucht zu parieren. 2 = Ausgewichen
Krieger3 greift Monster1 an. 14 = Daneben.

2 Runde:
Monster1 greift Krieger 2 an. 3 Getroffen.
Krieger 2 versucht zu parieren. 12 - Nicht pariert
Krieger 2 erhält 3 Schadenspunkte. (1w4 = 2 2w4=4 zusammen 6 - RS 3= Schaden 3)
Krieger1 greift Monster1 an. 10 = Daneben.
Krieger2 greift Monster1 an. 2 = Getroffen.
Monster1 erhält 2 Schadenspunkte. (1w3 = 3 - RS 1= Schaden 1)
Krieger3 greift Monster1 an. 4 = Getroffen.
Monster1 bekommt durch seine starke rüstung keinen schaden (1w3 =1 - rs 1 = schaden 0)

usw.
Irgrendwann ist einer hin und der Sieger muß sich einen verbleibenen Gegner suchen.
Evtl kann man hier neben Gold auch Erfahrungspunkte verteilen und so die Sieger aufsteigen lassen. Wodurch sie in höheren Stufen dann stärker zuschlagen oder besser Parieren, mehr attacken haben usw.

Natürlich kann man viel Modifizieren. So kann einer eine andere Waffe tragen (anderer Schaden) oder Kampfreflexe bekommen (höhrer Iniwert) oder besser mit der Waffe umgehen können, per Talent (Höhere AT Wert). Patzer, Kampfmanöver, Zauber usw. können vieles verändern.

Wie man das macht.
Um in Delphi Worten zu sprechen. Um bei obrigen Beispiel zu bleiben, mußt für jeden Teinnehmer ein eigenes Objekt erstellen. Nicht zu vergessen, das einige werte Statisch sind (AT, PA) andere Varibel (LeP und INI), daher brauchen letzte natürlich zwei zeilen (z.b., max. LEP und akt. LeP)
Dann noch eine INI Tabelle (Wann darf Object handeln) und eine Zieltabelle (Welches Object wen angreift). Evtl kommt noch eine Entfernungstabelle hinzu, was alles wieder komplierter machen kann. Dann kann man auch gleich Waffenreichweite usw. hinzufügen (ups ich schweife ab)
In einen Browsergame empfehle ich dir, nicht mehr als zwei Spieler einen Kampf machen zu lassen. da dies doch sehr viel (häufig nutzlosen) Skripting zu folge hat (davon abgesehen, das du dafür sogen mußt, das die spieler gleiche chancen haben bis hin zum Con-Verlußt).

Für weiteren Ideen stehe ich gern zur verfügung.

Gruß dat Tala

PS: Bevor du fragst. Außer auf dem Papier existiert mein Spiel mangels Zeit nicht.

Master_RC 26. Nov 2005 23:12

Re: [PHP] Kämpfe bei Browsergames mit verschiedenen Einheite
 
boah, das ist jettz ein bisschen viel auf einmal :shock:
ich werds mal abspeichern und in ruhe durchgehen...

Natürlich werden nur max. 2 Spieler bei einem Kampf teilnehmen ;)

Ist aber ne recht coole Idee und so wie ich das sehe aus schön erweiterbar :)

Jetzt nur mehr eins:
Wie genau lese ich das nun aus der DB aus?
Ich hätte das schon gerne mit den Checkboxen bei Einheiten :)

Also was ausgelesen werden muss:
Checkboxen - welche Einheiten sollen mit?
und
Wie soll ich auslesen, welche Einheiten in einer Schlacht sind?

IDEE:
Ich starte einen Angriff:
Auswahl per Checkboxen (öh... wie geth das? ^^)
Dann werden die ids der Einheiten (auto_increment - id) in eien DB gespeichert.
Die DB "schlachten" könnte folgendermaßen aussehen:
id int(x) [um per Admin eine Schlacht rauszulöschen]
angreifer int(x) [id des Spieler, der angreift]
verteidiger int(x) [id des Verteidigers eben]
einheiten string(x) [alle ids der angreifenden Einheiten - Bsp.: "1,4,22,24,31,5"]

So...
wenn nun eine Schlacht stattfindet, wird einfach überprüft, welche Einheiten des Verteidigers grade eben zum Verteidigen bereit sind und die Einheiten des Angreifers werden halt so ausgelesen, dass ´einheiten´ exploded wird, etc...

Kann das so klappen oder hat jemand was besseres?

//EDIT:
Am Rande: Kennt jemand ein Opensource-Spiel, das diesen "Idealen" sntspricht? Wenn ja, kann man ja was rausgucken :stupid:

Binärbaum 27. Nov 2005 02:39

Re: [PHP] Kämpfe bei Browsergames mit verschiedenen Einheite
 
Zitat:

Zitat von Master_RC
IDEE:
Ich starte einen Angriff:
Auswahl per Checkboxen (öh... wie geth das? ^^)
Dann werden die ids der Einheiten (auto_increment - id) in eien DB gespeichert.
Die DB "schlachten" könnte folgendermaßen aussehen:
id int(x) [um per Admin eine Schlacht rauszulöschen]
angreifer int(x) [id des Spieler, der angreift]
verteidiger int(x) [id des Verteidigers eben]
einheiten string(x) [alle ids der angreifenden Einheiten - Bsp.: "1,4,22,24,31,5"]

So...
wenn nun eine Schlacht stattfindet, wird einfach überprüft, welche Einheiten des Verteidigers grade eben zum Verteidigen bereit sind und die Einheiten des Angreifers werden halt so ausgelesen, dass ´einheiten´ exploded wird, etc...

Kann das so klappen oder hat jemand was besseres?

Der "explodierte" String gefällt mir nicht so recht. Man kann es zwar so machen, aber das optimale ist es nicht, da man den String jedesmal zerlegen muss uns somit die Datenbank-Abfragen erschwert werden. Statt dem String einheiten könnte man zwei zusätzliche Spalten nehmen, in denen IDs gespeichert werden:
int angriffID
int verteidigungID

Dann macht man eine zusätzliche Tabelle, nennen wir sie mal "Look-Up-Table", mit zwei Spalten:
int angriffID
int einheit

Der erste Wert entspricht der Spalte angriffID oder verteidigungID aus der Tabelle "schlachten". Der zweite Wert (einheit) ist eine eindeutige Nummer (ID) für eine bestimmte Einheit (die genauen Angriffswerte der Einheit könnten dann z.B. in einer weiteren Tabelle gespeichert sein).
Ein Ausschnitt daraus könnte wie folgt aussehen:
Code:
angriffID   einheit
1            1
1            4
1            22
1            24
1            31
1            5
2            7
2            9
...         ...
Somit weiß man dann, dass z.B. die Einheiten mit der ID 1,4,22,24,31,5 zum gleichen Angriff/Angriffsziel gehen.

Somit bekommt man z.B. über
SQL-Code:
SELECT * FROM look_up_table WHERE angriffID=x
alle Einheiten-IDs für den Angriff mit der Nummer x.
Nehmen wir also an, der obige Tabellenausschnitt stelle alle bisherigen Einträge dar, und ein Beispieldatensatz aus der Tabelle "schlachten" wäre
Code:
id angreifer verteidiger angriffID verteidigungID
77  23        45          1         2
Demzufolge hätte der Spieler mit der ID 23 den Spieler 45 angegriffen. Die angreifenden Einheiten sind unter der AngriffsID 1 zusammengefasst, laut zweiter Tabelle sind das also die Einheiten 1,4,22,24,31 und 5. Die verteidigenden Einheiten des anderen Spielers, zusammengefasst unter der verteidigungsID 2, sind die Einheiten 7 und 9.

Das wär's erstmal dazu. ;)

MfG
Binärbaum

Master_RC 27. Nov 2005 12:15

Re: [PHP] Kämpfe bei Browsergames mit verschiedenen Einheite
 
Boah, du hast mich genau verstanden :)

Mir selbst hat der Explode auch nit gefallen, abe rich wär zu der Uhrzeit auf nichts anderes gekommen ^^'

So...
jetzt eigentlich nur mehr die letzten beiden Fragen:

1. Wie finde ich eine einmalige Schlachten-ID, die ich dann auch für die Einheiten in der look_up nehmen kann?

2. Wie führe ich nun dann den Kampf aus?
Also wie das thematisch funktioniert, hat ja Taladan schon erklärt, aber wie programmiere ich sowas? :gruebel:
Ihr müsst wissen, dass ich zwar schon länger progge (auch Browsergames) aber bisher nur Rollenspiele mit 1v1 Systemen :stupid: Also so ein Strategiespiel ist für mich absolut neues Gelädne :(

Taladan 27. Nov 2005 12:44

Re: [PHP] Kämpfe bei Browsergames mit verschiedenen Einheite
 
Zitat:

Zitat von Master_RC
1. Wie finde ich eine einmalige Schlachten-ID, die ich dann auch für die Einheiten in der look_up nehmen kann?

Meistens sind DB mit PHP ja MySQL, diese haben ein Auto_Inc feld. Jede Schlacht bekommt eine Kennung. Das wäre in einer weiteren Tabelle fein. Dort kannst du dann auch für später das ergebnis hinpacken. Diese Kennung packst du dann in dein Look-Up-Table. Damit hast du gleich zwei dinge auf einmal. 1. deine Uniquire-ID und zweites eine Art Logbuch. So wollte ich es zumindest machen.

Zitat:

Zitat von Master_RC
2. Wie führe ich nun dann den Kampf aus?
Also wie das thematisch funktioniert, hat ja Taladan schon erklärt, aber wie programmiere ich sowas? :gruebel:
Ihr müsst wissen, dass ich zwar schon länger progge (auch Browsergames) aber bisher nur Rollenspiele mit 1v1 Systemen :stupid: Also so ein Strategiespiel ist für mich absolut neues Gelädne :(

Oh da fallem mir viele Möglichkeiten.
1. Automatiesiert: Die einfachste ist, es automatisiert machen zu lassen (Der Server bestimmt die Handlung). Bedeutet der Spieler erhält am Schluß nur eine Auswertung des Schlachtenverlaufs (wie bei meinen vorherigen Posting). Dieses kann man über Formeln und Proceduren in PHP lösen.
Die anderen Möglichkeiten sind nur möglich, wenn beide Teilnehmer eingeloggt sind. Hier muß man zusätzlich auf evtl Con-Lost achten.
2. Ein Kampfscreen, halbautomatiesiert: Eine Quasigegenüberstellungsanzeige. Hier kann der Spieler den Kampfablauf im vorfeld der Runde bestimmen, was er mit seinen Einheiten macht. Diese werden dann Automatisch im Inizeitraum ausgeführt. Jeder Spieler hat eine bestimmte Zeit seine Befehle für die Runde zu gehen.
3. Ein Kampfscreen, manuell: Eine Art Kampffeld wird beiden Teilnemern angezeigt. Ähnlich einen Schachbrett (wobei hier 6eck-Felder eher die richtige Wahl ist). Abwechselnd darf jeder in seiner Ini-Phase seine Einheitenbefehle bestimmen. (Gehen, Angreifen, Zaubern). Jeder spieler hat eine bestimmte Zeit seine befehle pro Einheit zu geben.

Am leichtesten ist natürlich Nr. 1 zu scripten. Hier gäbe es noch eine Abwandlungsmöglichkeit, das jede Einheit eine art Kampfscript vom Spieler bekommt. Magier z.b. erst starke Zauber, dann Schwache, dann Kämpfen. usw. Ein Kampfscript ist aber fast genau so schwer zu scripten wie Nr.2, daher wähle hier lieber Nr.2
Am schwirigsten ist Nr. 3. Was ich rein über PHP eher als nahezu unmöglich ansehe (nicht so ASP.Net, hier sehe ich es eher als Herausforderung).
Da mich dieses Thema sehr interessiert, kannst du dich auch gern per ICQ an mich wenden.

Gruß Marco

PS: Wer P&P RPG spielt, merkt, das sich fast jedes Computer-Spiel (mit Verstand), sei es Rollenspiel, Ego-Shooter oder Strategie, ein wenig nach diesen oder jenen RPG-Schema orientiert. Allein Wertveränderungen und Geschwindigkeiten (und damit die dahinterliegenden Formeln) werden häufig intern ähnlich gehandelt. Im laufe der Zeit haben sich natürlich andere Wege gebildet, aber die Grundzüge sind fast überall halt ans RPG angelehnt.

Master_RC 27. Nov 2005 12:47

Re: [PHP] Kämpfe bei Browsergames mit verschiedenen Einheite
 
Ja, schon klar, wie das aussehen soll, das Kampfscript, nur wie soll das in PHP aussehen? Also dass zwei Einheiten mit drei kloppen, etc? (Variante 1)

So...
die Unique-ID per auto_increment ist mir auch klar, nur wie kann ich dann bereits beim Eintragen wissen, wie die lautet? Kann man die irgendwie sogar gleich ebstimmen?


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:40 Uhr.
Seite 2 von 4     12 34      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz