Problem mit Warten
-
Hallo, als erstes mal wollte ich mich für den doofen Threadtitel entschuldigen. Leider ist mir aber keine bessere Formulierung dafür eingefallen.
Ich versuche grade etwas zum Spaß mit ANSI C ein bisschen rumspielen. Im Moment versuche ich ein Programm zu erstellen, welches den Kampf zweier Einheiten simuliert.
Die eine Einheit greift alle X Sekunden an, während die andere alle Y Sekunden angreift.
Leider habe ich keine Idee, wie das umsetzen soll.Hier noch ein Beispiel zur Verdeutlichung:
Einheit1 greift alle 7 Sekunden an
Einheit2 alle 3
Wenn ich jetzt Sleep(7000) machen würde, würde der Kampf total verfälscht werden, denn in diesen 7000 ms hätte Einheit2 schon 2 mal angreifen können.
Was ich also suche ist etwas, was eine Pause in Milliskeunden simuliert, aber das Programm weiterläuft (also nicht wie bei Sleep()).Ich hoffe es hat jemand eine Lösung für mein Problem, denn ich bin schon stark am Verzweifeln.. hab schon unzählige Skizzen gemacht, weil ich versucht habe, mir das klar zu machen und so vielleicht eine Lösung zu finden. Leider ohne jeden Erfolg
Achja, sollte es nicht deutlich werden, was das Problem ist (das Gefühl hab ich nämlich :/), einfach posten und ich versuche es zu erklärenmfG
-
Man könnte threads nehmen, allerdings managed die das Betriebssystem und man kann nicht sicher sein, wie oft und wann er drann kommt.
Die fairere Lösung wär wenn du einen Scheduler einbaust.
Du definerst alles in Zyklen:
Einheit 1 kann alle x Zyklen angreifen.
Einheit 2 kann alle y Zyklen angreifen.struct Unit { int cycleNoAttack; int cycleToNExtAttack; }
die initphase erzeugt alle einheiten.
Unit units[MAXUNITS]; int i; for(i=0;i<unitsToUse;++i) { units[i].cycleNoAttack = 10 + rand()%50; // Einheiten haben zufällige Wartezeiten zwischen 10 und 60 units[i].cycleToNExtAttack = units[i].cycleNoAttack/2; // einhat muss vor ersten angriff warten. }
deine Hauptschleife zählt dann immer die cycleToNextAttack runter:
for(i=0;i<unitsToUse;++i) { --units[i].cycleToNExtAttack; if( units[i].cycleToNExtAttack == 0) { // do attack stuff here. units[i].cycleToNExtAttack = units[i].cycleNoAttack; // wieder wartezeit resetten } }
Edit:
in c++ wär das viel eleganter
-
#include <stdio.h> #include <time.h> int main() { clock_t e1 = clock()/CLOCKS_PER_SEC + 3; clock_t e2 = clock()/CLOCKS_PER_SEC + 7; for (;;) { clock_t sec = clock()/CLOCKS_PER_SEC; if (e1 <= sec) { puts ("e1: attack!"); e1 = sec + 3; } if (e2 <= sec) { puts ("e2: attack!"); e2 = sec + 7; } } }
vlad_tepesch schrieb:
in c++ wär das viel eleganter
*seufz*