hi,
ich bin neu hier und ich finde diese seite sehr gut ich versuche momentan ein kampfskript zu schreiben, das einen kampf von raumschiffen mit bestimmten statuswerten simuliert.. da die anzahl der raumschiffe und ihre werte nicht konstant sind wollte ich jedes mal bei kampfstart die schiffinformationen in eine datenbank speichern..
dann wollte ich in jeder kampfrunde die daten laden, die berechnungen durchführen und dann wieder in der datenbank speichern..
leider ist das problem, das ich in der datenbank nichts ändern kann, weil sie nicht im edit- oder insertmode ist..
außerdem muss ich die einzelnen zeilen der datenbank immer mit
Code:
table1.moveby(1);
aufrufen und wenn ich 2 for.. to.. do.. schleifen habe und die eine schleife während der anderen erst durchlaufen wird, die jeweils einmal durch alle zeilen der datenbank durchlaufen sollen, dann muss ich ich jedes mal die aktuelle position um die anzahl der reihen der datenbank nach oben schieben und dann wieder um den parameter der schleife nach unten.. gibt es nicht eine einfachere möglichkeit einzelne zeilen anzusprechen?
es wäre super, wenn mir jemand sagen könnte, wie ich diese probleme lösen kann..
vielen dank
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Hallo und erst mal herzlich Willkommen.
Allerdings muss ich gestehen, dass mich deine Frage gerade ein wenig überrascht. Datenbankfragen hatten wir bisher noch gar nicht oder nur selten und ich habe es verpeilt. Aber wo wir gerade schon beim Thema sind. Ein Kampfskript? Das wird so etwas ähnliches wie ein Spiel, oder? Und dann sind wir schon bei der nächsten Sache. Datenbanken schreiben ihr Daten relativ zügig auf die Festplatte. Sollte dein Program jetzt ein Server für Rundenbasiertes Internetspiel werden, bei dem alle 1-2 Tage ein Zug abgegeben wird, dann würde ich eine Datenbank für durchaus gerechtfertig halten. Für so ziemlich alles andere halte ich eine Datenbank für vollkommen ungeeignet.
Bei Datenbanken wäre es außerdem ganz sinnvoll wenn du noch erwähnen welche Datenbank du womit ansteuerst. Alleine im Delphi gibt unzählige Möglichkeiten dies zu tun. Und alle sind anders.
Nichts desto trotz denke ich, dass du auf eine Datenbank verzichten solltest. Wenn es sich um Spieledaten handelt wären üblicherweise Listen oder Bäume die bessere Alternative. Aber um das abzuschätzen müsstest du mal ein bisschen mehr über dein Projekt erzählen.
ok, vielen dank für die tipps das soll ein rundenbasiertes spiel sein, aber nicht online.. das übersteigt meine fähigkeiten ich habe es mir so vorgestellt, das man immer in seinem zug schiffe bauen / versenden / mit ihnen kämpfen kann usw.. (zusätzlich gibt es noch forschung und planetenausbau.. mit planetenaubau baut man beispielsweise gebäude, die die forschungseffizienz erhöhen oder die die schnellere produktion von schiffen ermöglicht.. mit der forschung kann man dann verschiedene technologien und schiffe erforschen, die jeweils verschiedene statuswerte haben und somit den kampf beeinflussen..)
es gibt z.b. folgende werte:
hp (trefferpunkte eines schiffes), eatk (energieangriff), katk (konventioneller angriff), a (antrieb), p (panzerung) und s (schilde).
man hat z.b. ein solches schiff: 100hp, 10eatk, 10katk, 10a, 10p, 10s
jetzt sollte eigendlich für jedes schiff in der datenbank überprüft werden, wem es gehört und alle die dem spieler 1 gehören sollen spieler 2 angreifen.. danach greifen alle schiffe von spieler 2 spieler 1 an..
dazu hatte ich vor, folgende formel zu verwenden:
Code:
if katk/p>eatk/s then atkmode:=0;
if katk/p<eatk/s then atkmode:=1;
if katk/p=eatk/s then atkmode:=random(2);
if atkmode=0then hp:=hp-(katk/p*(100-(a/10))/100);
if atkmode=1then hp:=hp-(eatk/s*(100-(a/10))/100);
es wird zunächst überprüft, ob die eigenen energetischen waffen an den schilden des gegners oder die eigenen konventionellen waffen mehr schaden an der panzerung des gegners hinterlassen.. dann werden die hp um das verhältnis dieser werte reduziert.. dabei nimmt der faktor in dem a vorkommt noch einen zwischen 0,999 und wenn der maximale gegnerische antrieb 250 ist 0,75 an, um die ausweichchance der schiffe durch erhöhte geschwindigkeit zu berücksichtigen (ich könnte auch über zufall einen wert von 0 bis 99 ermitteln lassen und prüfen ob der größer als a ist und sonst geht der angriff daneben, aber ich will nicht das gleiche kämpfe hintereinander zu verschiedenen ergebnissen führen, weil das zu zufallslastig wäre..)
wenn das berechnet wurde sollen die daten wieder abgespeichert werden und es soll weiter simuliert werden, was die restlichen schiffe für einen schaden anrichten, bis eine partei keine schiffe mehr über hat..
wenn ich die werte eines schiffes als array oder so speichern will, dann wäre das denke ich mal sehr kompliziert, weil man dann vermutlich für jeden statuswert ein array bräuchte und weil unbekannt ist, wieviele schiffe in den kampf verwickelt sind..
ich hoffe, das ist genau genug beschrieben, wenn nicht, dann sagt einfach bescheid..
vielen dank für die guten tipps bisher
Edit: ich habe die datenbank mit database desctop erstellt und es ist eine paradoxdatenbank..
und die verbindung zum formular habe ich über den form wizard gemacht, weil ich keine ahnung habe wie ich die datenbanken manuell anbinden kann.. die daten sind momentan in einem DBGrid
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Also ein typisches rundesbasiertest Weltraumstrategiespiel. Dann würde ich an deiner Stelle mal ganz fix deine Datenbank vergessen. Und wenn ich ehrlich bin solltest du dir vorher auf JEDEN FALL erst einmal ein bisschen Objektorientierung aneignen. Ohne so etwas dürfte dich dein Problem ganz schön schnell aus den Latschen hauen.
Wenn du das getan hast dann kannst du für deine Schiffe eine Klasse erstellen von denen du 10-20 in einer Liste hast. Evtl auch eine Liste für jede Rasse. Die Rassen können wiederrum Klassen sein. Und so weiter.
Aber zu rundenbasierten Strategiespielen kann der ein oder andere mehr sagen als ich. Nur so viel du solltest dich von deinem derzeitigen Ansatz verabschieden. Das wird komplexer als du es erwartest. Bzw wird es durch die Richtige Technik (OOP) einfacher als du vielleicht denkst.
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Nachdem du weißt wie Objekt Orientierung funktioniert solltest du mal diese Tutorials durchlesen: Tutorial_Softwareentwicklung1 (+ den 2. Teil)
Dadurch solltest du ein gefühl bekommen, wie man sich von Anfang an etwas mehr Gedanken zur Struktur des Programms macht. Falls dich das Thema dann weiter interessiert, solltest du dir dann noch paar Texte zum Software-Design durchlesen.
Ich hab am Ende des Tutorial_Quickstart ein paar mahnende Worte an die viele angehenden "Engine-Programmierer" gerichtet. Quintessenz ist, dass man sich an Projekte erst dann wagen sollte, wenn man weiß was man tut. Dazu benötigt man vorallem Erfahrung. Falls man zu schnell zu große Sachen machen will, produziert man viel Wegwerfcode. Und das will man im Allgemeinen ja nicht.
Also erstmal kleine Brötchen backen, und die Sahnetorte auf später verschieben.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
^^
das habe ich schon gemerkt.. bestimmt 90% meiner anwendungen habe ich nie fertig gestellt, weil mir immer irgendwelches wissen gefehlt hat, eine lösung dafür zu finden..
ich habe auch mal einen quelltext mit über 100.000 zeilen geschrieben, bis ich keine lust mehr hatte und 1 jahr später habe ich den selben effekt mit einem ca 500 zeiligen quelltext erzeugt.. das ist zwar unnötig, aber irgendwas muss ich ja programmieren, um besser darin zu werden und deswegen ist es eigendlich auhc die arbeit wert, einen unnötigen code geschrieben zu haben, aber dafür etwas wissen gewonnen zu haben.. wenn ich bedenke das ich seit über 2 jahren so gut wie jeden tag 5h oder so am programmieren bin, aber ohne struktur ist es schwer, aber durch dieses forum hoffe ich mal, das das was ich programmiere mal effektiver wird im verhältnis aufwand / erzieltes ergebnis.. ich werde mir mal die ganzen links durchlesen und versuchen, das in das programm zu übertragen..
vielen dank
Registriert: Di Dez 27, 2005 12:44 Beiträge: 393 Wohnort: Berlin
Programmiersprache: Java, C++, Groovy
Hallo,
also ich finde den Denkansatz, eine relationale Datenbank als Hilfsmittel für ein rundenbasiertes Spiel einzusetzen, garnicht mal so schlecht.
Zum einen kann man seine Daten damit persistent halten und braucht sich schonmal keine Gedanken über ein Format für das Abspeichern der Spielstände machen. (das könnte bei Lord of Universe ziemlich komplex werden)
Ausserdem kann man seine Daten nach allen möglichen Attributen ohne viel Aufwand sortieren (z.B. Highscorelisten, Zeiten für das Fertigstellen eines Schiffes usw.)
Letztendlich sind ja Objekte auch nichts anderes, als Attribute, die in Relation zueinander stehen.
Es gibt ja kleine Bibliotheken wie z.B. SQLite, mit denen man problemlos kleine Datenbanken aufbauen kann (es muss ja nicht gleich db2 oder oracle sein )
ich habe auch noch mal darüber nachgedacht..
ich habe es jetzt zwar so hinbekommen, das ich eine klasse mit einem array definiert habe, allerdings wie dj3hut1 schon sagte denke ich mal verkompliziert es das abspeichern von spielständen ungemein.. vielleicht wäre es sinnvoll, am beginn des spiels die datein einmal aus der datenbank zu laden und der klasse zuzuordnen, dann wärend der prozedur die klasse zu verwenden und wenn man die daten abspeichern will, wieder in die datenbank einzufügen..
allerdings habe ich leider immer noch keine ahnung, wie ich die datenbank in der runtime verändern kann..
Zitat:
sich schonmal keine Gedanken über ein Format für das Abspeichern der Spielstände machen
dabei fällt mir ein, das ich schon immer wissen wollte, ob und wie man sich mit delphi ein eigenes dateiformat definieren kann, in dem man abspeichert^^
ich schreibe nächsten monat eine facharbeit über datenverschlüßelung und deswegen wollte ich vllt. langfristig ein eigenes dateiformat definieren und jedes mal wenn ich datein daraus lade einen eigenen dechiffrirungsalgorithmus durchlaufen lassen, um es zu erschweren, das in dem spiel gecheatet werden kann das wäre wirklich super, wenn mir das jemand sagen könnte
Mitglieder in diesem Forum: 0 Mitglieder und 7 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.