Anfängerfrage zur Berechnung einer prozentualen Chance
-
Halli Hallo erst einmal an alle hier im Board,
hab hier schon den ein oder anderen nützlichen Thread für Anfänger gefunden und werde euch bestimmt in nächster zeit auch mal öfters mit Fragen löchern.
Nun also zu meinem Problem:
Ich habe angefangen c++ zu lernen um, jetzt kommt was total neues für euch (/Ironie off), später als Hobby ein Spiel zu programmieren. Ich habe mich schon durch unzählige Foren gelesen und weiss, dass ich nicht nächste Woche das Spielgenre neu erfinden werde

Ich habe mir auch ein "realistischeres" Projekt vorgenommen: Ein 2D Rollenspiel, sowie ein 2D Strategiespiel (beide rundenbasiert) Ich habe mir das ganze wirklich als Hobby für meine Freizeit gesetzt und habe auch kein Geduldsproblem, in 4 Jahren noch alleine daran rumzubasteln

Nun aber zu meinem Problem:
Da ich ja zurzeit, gerade erst bei den Klassen angekommen bin im c++ buch, kenne ich natürlich auch noch überhaupt nicht das Spektrum oder alle Möglichkeiten der Programmiersprache. Und somit schreibe ich meine Ideen ( solche Sachen wie Setting, Grafik, Item/kampfsystem etc.) für das Spiel erst einmal in Textdateien. Damit ich dann später wenn ich der Meinung bin, die ersten Dinge angehen zu können, mehr oder weniger geordnet das ganze aufsetzen und programmieren kann.
Mein Problem bei einer Überlegung ist nun folgendes: Ich möchte in dem Kampfsystem auch eine % Chance auf kritische Treffer und ausweichen einbauen (Ähnlich wie bei WoW, wenn ihr es kennt oder anderen Rollenspielen, Diablo 2, Sacred etc. )
Jetzt kenne ich zwar schon so funktionen wie srand() und die Grundrechenarten etc. Frage mich aber, wie ich es z.b. umsetze, dass bei einem Angriff die %chance auf einen kritischen Treffer mit einbezogen wird.
Und gestern Nacht, als ich im Bett lag hatte ich aus dem Nichts eine Idee (Ja klingt komisch war aber wirklich so
)Nehmen wir einmal an, der aktive Charakter hat eine Chance von 17%, kritisch zu treffen. Dann würde ich diese % Zahl als int speichern (also 17 und es ist auch beabsichtigt, dass es keine nachkomma stelle gibt)
also
int c_chance = 17;der text ist dann meinetwegen cout << "Chance auf kritischen Treffer" c_chance "%" endl;
Und die Funktion sollte dann so aussehen: (Natürlich nicht später im fertigen code sondern nur zur veranschaulichung^^)
.....
Funktion, die den gemachten Schaden errechnet und das Ergebnis in der Variable "ks_schaden" speichert.
.....srand();
critical = rand(100) + (1+c_chance); //Chance auswürfeln von 0-99 dann 1+ crit chance dazurechnen
if (critical => 100) //Wenn gewürfelte Zahl + Crit Chance über 100 sind schaden verdoppeln
{
ks_schaden *2
}
else
blablaSo ich hoffe ich hab mich nicht zu verwirrend ausgedrückt

Und wollte nun von euch "alten Hasen"
mal wissen;
-Ist der Ansatz so in Ordnung?
-Habe ich einen extrem starken Denkfehler in der Formel?
-Gibt es eine Funktion, die mir das ganze erleichtern kann?Ich danke euch schon einmal im Vorraus (edit: Is mir grad Rätselhaft, wieso V o r r a u s zensiert wird^^) für eure Mühe das ganze zu lesen

mfg.
-
rand() nimmt keine Parameter. Außerdem geht das ganze einfacher:
if(rand() % 100 < c_chance) { schaden *= 2; }
-
also
if (c_crit > rand()%100) ks_schaden *=2;
-
Ich bring hier mal mein Snippet ein, aber keine Ahnung ob das gut so ist, das Ergebnis (die Verteilungen) sieht aber jedenfalls danach aus:
#include "MersenneTwister.h" MTRand mtRand; bool GetChance(float percent) { if(percent * 1000 <= mtRand.randInt(100000)) return false; return true; } // Testen int c1 = 0, c2 = 0, c3 = 0, c4 = 0, c5 = 0; for(int i = 0; i < 100000; ++i) if(GetChance(0.1f)) ++c1; for(int i = 0; i < 100000; ++i) if(GetChance(1.0f)) ++c2; for(int i = 0; i < 100000; ++i) if(GetChance(5.0f)) ++c3; for(int i = 0; i < 100000; ++i) if(GetChance(50.0f)) ++c4; for(int i = 0; i < 100000; ++i) if(GetChance(100.0f)) ++c5; cout << "0.1%: " << c1 << " / 100" << endl; cout << "1%: " << c2 << " / 1000" << endl; cout << "5%: " << c3 << " / 5000" << endl; cout << "50%: " << c4 << " / 50000" << endl; cout << "100%: " << c5 << " / 100000" << endl;
-
Fkscorpion schrieb:
(edit: Is mir grad Rätselhaft, wieso V o r r a u s zensiert wird^^)
Siehe http://www.googlefight.com/index.php?lang=en_GB&word1=voraus&word2=vorraus
-
volkard schrieb:
Fkscorpion schrieb:
(edit: Is mir grad Rätselhaft, wieso V o r r a u s zensiert wird^^)
Siehe http://www.googlefight.com/index.php?lang=en_GB&word1=voraus&word2=v******
Ach okay...
Schreiben sollte man noch können. DankeZu den anderen:
Ich danke euch für eure code schnipsel. Auf so eine einfache Variante bin ich natürlich garnicht gekommen
und das rand() keine parameter annimmt, hab ich auch gerade nochmal gesehen ; /Ich werd's mal mit eurer Variante probieren.
Vielen lieben Dank.mfg.
-
Fkscorpion schrieb:
Und gestern Nacht, als ich im Bett lag hatte ich aus dem Nichts eine Idee (Ja klingt komisch war aber wirklich so
)Och, so komisch ist das gar nicht.

Fkscorpion schrieb:
und das rand() keine parameter annimmt, hab ich auch gerade nochmal gesehen ; /
Eine nützliche Referenz zum Nachschlagen von Funktionen und Klassen aus der Standardbibliothek: www.cplusplus.com
-
Nexus schrieb:
Eine nützliche Referenz zum Nachschlagen von Funktionen und Klassen aus der Standardbibliothek: www.cplusplus.com
In Favoriten aufgenommen

Danke dir.