Seite 993 von 1044 ErsteErste ... 49389394398398999099199299399499599699710031043 ... LetzteLetzte
Ergebnis 14.881 bis 14.895 von 15650

Thema: Der "kleine Fragen zu Civ 4" - Thread III

  1. #14881
    Stroit
    Gast
    Mauszeiger drüberhalten und alt drücken tut es auch, ohne die Gefahr als Versehen loszulassen und anzugreifen...

  2. #14882
    Registrierter Benutzer
    Registriert seit
    04.11.14
    Beiträge
    2.489
    Das gilt natürlich nicht für den Verteidiger.
    Darum gehts mir!

    Natürlich liegt dem ein Algorithmus zugrunde. Allerdings ist der einigermaßen kompliziert (es geht ja nicht nur um die Stärken, sondern auch um die Modifikatoren wie Verschanzung, Gelände/Stadt, Beförderungen, Erstschlag, etc.
    Ich meinte natürlich die Stärke der beiden Einheiten nachdem die Bonifkatoren bereits eingeflossen sind. Wenn ich jetzt, Hausnummer, bei Einheit A mit allen Bonifkatoren auf Stärke 7(als Angreifer) gegen Einheit B auf Stärke 5(als Verteidiger) komme, dann muss man mit diesen 2 Zahlen doch auch selbst was anfangen können?

  3. #14883
    Registrierter Benutzer Avatar von ThomasBX
    Registriert seit
    02.11.08
    Beiträge
    4.428
    Eine leichte Variante für ungefähre Schätzungen kenne ich nciht, hier wird das Kampfsystem beschrieben:

    http://www.civforum.de/showthread.ph...V4-Kampfsystem

  4. #14884
    Ein Platz an der Sonne Avatar von Commander Bello
    Registriert seit
    05.06.05
    Ort
    Nähe Koblenz
    Beiträge
    6.209
    Zitat Zitat von Cotillion Beitrag anzeigen
    Ich meinte natürlich die Stärke der beiden Einheiten nachdem die Bonifkatoren bereits eingeflossen sind. Wenn ich jetzt, Hausnummer, bei Einheit A mit allen Bonifkatoren auf Stärke 7(als Angreifer) gegen Einheit B auf Stärke 5(als Verteidiger) komme, dann muss man mit diesen 2 Zahlen doch auch selbst was anfangen können?
    In einem ersten Schritt werden dann die Trefferwahrscheinlichkeiten für beide Seiten ermittelt. Im zweiten Schritt werden aus dem Verhältnis der Trefferwahrscheinlichkeiten die jeweils verursachten Schadenspunkte ermittelt, die von den (noch) vorhandenen "Lebenspunkten" im Falle des Treffers abgezogen werden. Falls der Angreifer nicht trifft, trifft der Verteidiger.

    Kurz gesagt: solltest du nicht über eine Sonderbegabung verfügen, kannst du das im Kopf nicht berechnen.


  5. #14885
    Registrierter Benutzer
    Registriert seit
    04.11.14
    Beiträge
    2.489
    Danke euch beiden. Ist wohl wirklich nochmal etwas komplizierter als ich vermutet habe. Ich werde mal in den Thread da reinlesen. Damit wäre meine Frage beantwortet


  6. #14886
    Say My Name Avatar von Zulan
    Registriert seit
    13.03.08
    Beiträge
    8.904
    Das ist die Berechnung fuer die Chance direkt aus Civ4... Das ist vermutlich das am besten kommentierte Stueck code in ganz Civ... wahrscheinlich von einem Modder uebernommen oder so.

    Achtung Spoiler:
    Code:
    // FUNCTION: getCombatOdds
    // Calculates combat odds, given two units
    // Returns value from 0-1000
    // Written by DeepO
    int getCombatOdds(CvUnit* pAttacker, CvUnit* pDefender)
    {
    	float fOddsEvent;
    	float fOddsAfterEvent;
    	int iAttackerStrength;
    	int iAttackerFirepower;
    	int iDefenderStrength;
    	int iDefenderFirepower;
    	int iDefenderOdds;
    	int iAttackerOdds;
    	int iStrengthFactor;
    	int iDamageToAttacker;
    	int iDamageToDefender;
    	int iNeededRoundsAttacker;
    	int iNeededRoundsDefender;
    	int iMaxRounds;
    	int iAttackerLowFS;
    	int iAttackerHighFS;
    	int iDefenderLowFS;
    	int iDefenderHighFS;
    	int iFirstStrikes;
    	int iDefenderHitLimit;
    	int iI;
    	int iJ;
    	int iI3;
    	int iI4;
    	int iOdds = 0;
    
    	// setup battle, calculate strengths and odds
    	//////
    
    	//Added ST
    	iAttackerStrength = pAttacker->currCombatStr(NULL, NULL);
    	iAttackerFirepower = pAttacker->currFirepower(NULL, NULL);
    
    	iDefenderStrength = pDefender->currCombatStr(pDefender->plot(), pAttacker);
    	iDefenderFirepower = pDefender->currFirepower(pDefender->plot(), pAttacker);
    
    	FAssert((iAttackerStrength + iDefenderStrength) > 0);
    	FAssert((iAttackerFirepower + iDefenderFirepower) > 0);
    
    	iDefenderOdds = ((GC.getDefineINT("COMBAT_DIE_SIDES") * iDefenderStrength) / (iAttackerStrength + iDefenderStrength));
    	if (iDefenderOdds == 0)
    	{
    		return 1000;
    	}
    	iAttackerOdds = GC.getDefineINT("COMBAT_DIE_SIDES") - iDefenderOdds;	
    	if (iAttackerOdds == 0)
    	{
    		return 0;
    	}
    
    	iStrengthFactor = ((iAttackerFirepower + iDefenderFirepower + 1) / 2);
    
    	// calculate damage done in one round
    	//////
    
    	iDamageToAttacker = std::max(1,((GC.getDefineINT("COMBAT_DAMAGE") * (iDefenderFirepower + iStrengthFactor)) / (iAttackerFirepower + iStrengthFactor)));
    	iDamageToDefender = std::max(1,((GC.getDefineINT("COMBAT_DAMAGE") * (iAttackerFirepower + iStrengthFactor)) / (iDefenderFirepower + iStrengthFactor)));
    
    	// calculate needed rounds.
    	// Needed rounds = round_up(health/damage)
    	//////
    
    	iDefenderHitLimit = pDefender->maxHitPoints() - pAttacker->combatLimit();
    
    	iNeededRoundsAttacker = (std::max(0, pDefender->currHitPoints() - iDefenderHitLimit) + iDamageToDefender - 1 ) / iDamageToDefender;
    	iNeededRoundsDefender = (pAttacker->currHitPoints() + iDamageToAttacker - 1 ) / iDamageToAttacker;
    	iMaxRounds = iNeededRoundsAttacker + iNeededRoundsDefender - 1;
    
    	// calculate possible first strikes distribution.
    	// We can't use the getCombatFirstStrikes() function (only one result,
    	// no distribution), so we need to mimic it.
    	//////
    
    	iAttackerLowFS = (pDefender->immuneToFirstStrikes()) ? 0 : pAttacker->firstStrikes();
    	iAttackerHighFS = (pDefender->immuneToFirstStrikes()) ? 0 : (pAttacker->firstStrikes() + pAttacker->chanceFirstStrikes());
    
    	iDefenderLowFS = (pAttacker->immuneToFirstStrikes()) ? 0 : pDefender->firstStrikes();
    	iDefenderHighFS = (pAttacker->immuneToFirstStrikes()) ? 0 : (pDefender->firstStrikes() + pDefender->chanceFirstStrikes());
    
    	// For every possible first strike event, calculate the odds of combat.
    	// Then, add these to the total, weighted to the chance of that first 
    	// strike event occurring
    	//////
    
    	for (iI = iAttackerLowFS; iI < iAttackerHighFS + 1; iI++)
    	{
    		for (iJ = iDefenderLowFS; iJ < iDefenderHighFS + 1; iJ++)
    		{
    			// for every possible combination of fs results, calculate the chance
    
    			if (iI >= iJ)
    			{
    				// Attacker gets more or equal first strikes than defender
    
    				iFirstStrikes = iI - iJ;
    
    				// For every possible first strike getting hit, calculate both
    				// the chance of that event happening, as well as the rest of 
    				// the chance assuming the event has happened. Multiply these 
    				// together to get the total chance (Bayes rule). 
    				// iI3 counts the number of successful first strikes
    				//////
    
    				for (iI3 = 0; iI3 < (iFirstStrikes + 1); iI3++)
    				{
    					// event: iI3 first strikes hit the defender
    
    					// calculate chance of iI3 first strikes hitting: fOddsEvent
    					// f(k;n,p)=C(n,k)*(p^k)*((1-p)^(n-k)) 
    					// this needs to be in floating point math
    					//////
    
    					fOddsEvent = ((float)getBinomialCoefficient(iFirstStrikes, iI3)) * pow((((float)iAttackerOdds) / GC.getDefineINT("COMBAT_DIE_SIDES")), iI3) * pow((1.0f - (((float)iAttackerOdds) / GC.getDefineINT("COMBAT_DIE_SIDES"))), (iFirstStrikes - iI3));
    
    					// calculate chance assuming iI3 first strike hits: fOddsAfterEvent
    					//////
    
    					if (iI3 >= iNeededRoundsAttacker)
    					{
    						fOddsAfterEvent = 1;
    					}
    					else
    					{
    						fOddsAfterEvent = 0;
    
    						// odds for _at_least_ (iNeededRoundsAttacker - iI3) (the remaining hits 
    						// the attacker needs to make) out of (iMaxRounds - iI3) (the left over 
    						// rounds) is the sum of each _exact_ draw
    						//////
    
    						for (iI4 = (iNeededRoundsAttacker - iI3); iI4 < (iMaxRounds - iI3 + 1); iI4++)
    						{
    							// odds of exactly iI4 out of (iMaxRounds - iI3) draws.
    							// f(k;n,p)=C(n,k)*(p^k)*((1-p)^(n-k)) 
    							// this needs to be in floating point math
    							//////
    
    							fOddsAfterEvent += ((float)getBinomialCoefficient((iMaxRounds - iI3), iI4)) * pow((((float)iAttackerOdds) / GC.getDefineINT("COMBAT_DIE_SIDES")), iI4) * pow((1.0f - (((float)iAttackerOdds) / GC.getDefineINT("COMBAT_DIE_SIDES"))), ((iMaxRounds - iI3) - iI4));
    						}
    					}
    
    					// Multiply these together, round them properly, and add 
    					// the result to the total iOdds
    					//////
    
    					iOdds += ((int)(1000.0 * (fOddsEvent*fOddsAfterEvent + 0.0005)));
    				}
    			}
    			else // (iI < iJ)
    			{
    				// Attacker gets less first strikes than defender
    
    				iFirstStrikes = iJ - iI;
    
    				// For every possible first strike getting hit, calculate both
    				// the chance of that event happening, as well as the rest of 
    				// the chance assuming the event has happened. Multiply these 
    				// together to get the total chance (Bayes rule). 
    				// iI3 counts the number of successful first strikes
    				//////
    
    				for (iI3 = 0; iI3 < (iFirstStrikes + 1); iI3++)
    				{
    					// event: iI3 first strikes hit the defender
    
    					// First of all, check if the attacker is still alive.
    					// Otherwise, no further calculations need to occur 
    					/////
    
    					if (iI3 < iNeededRoundsDefender)
    					{
    						// calculate chance of iI3 first strikes hitting: fOddsEvent
    						// f(k;n,p)=C(n,k)*(p^k)*((1-p)^(n-k)) 
    						// this needs to be in floating point math
    						//////
    
    						fOddsEvent = ((float)getBinomialCoefficient(iFirstStrikes, iI3)) * pow((((float)iDefenderOdds) / GC.getDefineINT("COMBAT_DIE_SIDES")), iI3) * pow((1.0f - (((float)iDefenderOdds) / GC.getDefineINT("COMBAT_DIE_SIDES"))), (iFirstStrikes - iI3));
    
    						// calculate chance assuming iI3 first strike hits: fOddsAfterEvent
    						//////
    
    						fOddsAfterEvent = 0;
    
    						// odds for _at_least_ iNeededRoundsAttacker (the remaining hits 
    						// the attacker needs to make) out of (iMaxRounds - iI3) (the left over 
    						// rounds) is the sum of each _exact_ draw
    						//////
    
    						for (iI4 = iNeededRoundsAttacker; iI4 < (iMaxRounds - iI3 + 1); iI4++)
    						{
    
    							// odds of exactly iI4 out of (iMaxRounds - iI3) draws.
    							// f(k;n,p)=C(n,k)*(p^k)*((1-p)^(n-k)) 
    							// this needs to be in floating point math
    							//////
    
    							fOddsAfterEvent += ((float)getBinomialCoefficient((iMaxRounds - iI3), iI4)) * pow((((float)iAttackerOdds) / GC.getDefineINT("COMBAT_DIE_SIDES")), iI4) * pow((1.0f - (((float)iAttackerOdds) / GC.getDefineINT("COMBAT_DIE_SIDES"))), ((iMaxRounds - iI3) - iI4));
    						}
    
    						// Multiply these together, round them properly, and add 
    						// the result to the total iOdds
    						//////
    
    						iOdds += ((int)(1000.0 * (fOddsEvent*fOddsAfterEvent + 0.0005)));
    					}
    				}				
    			}
    		}
    	}
    
    	// Weigh the total to the number of possible combinations of first strikes events
    	// note: the integer math breaks down when #FS > 656 (with a die size of 1000)
    	//////
    
    	iOdds /= (((pDefender->immuneToFirstStrikes()) ? 0 : pAttacker->chanceFirstStrikes()) + 1) * (((pAttacker->immuneToFirstStrikes()) ? 0 : pDefender->chanceFirstStrikes()) + 1); 
    
    	// finished!
    	//////
    
    	return iOdds;
    }

  7. #14887
    esst mehr Teile Avatar von mauz
    Registriert seit
    27.11.09
    Beiträge
    20.311
    oh, etwas spät

  8. #14888
    ohne Ironie! Avatar von Drullo321
    Registriert seit
    27.07.05
    Beiträge
    3.113
    Habe eine Frage zum kulturellen Wechsel von Feldern. Ich hab ein Feld in meinem ersten Ring einer eroberten Stadt, dieses hat pro Runde immer mehr % von mir gehabt und einige Runden nach der ersten Kulturerweiterung hat es % die Mehrheit gehabt, aber es gehört trotzdem weiterhin nicht mir (6% Differenz zwischen zweitem Eigner und mir). Gibt es dafür Gründe? Wechselt es erst in der Folgerunde?

  9. #14889
    für Freiheit +Grundrechte Avatar von Der Falke
    Registriert seit
    01.06.07
    Ort
    Erlangen, Franken ---- _______ ‡‡ Muschelsucherehrenlegion ██ Civ4WL-DG1-Team: SU ████ Civ4BtS-DG2-Team: Junta ███████ Civ4BtS-DG3-Team: SU ████
    Beiträge
    37.916
    Felder wechseln immer erst eine Runde nachdem man dort die Kulturmehrheit hat.
    Nicht vergessen: 1118 Tage lang war die freiheitlich-demokratischen Grundordnung durch Regierung und Parlament in Bund und Ländern aufgehoben! Die Verantwortlichen müssen vor Gericht gestellt werden!

    Die Meldepflicht muss zudem noch immer aufgehoben werden.

    "Es ist die Schicksalsfrage Deutschlands: Wir stehen vor der Wahl zwischen Sklaverei und Freiheit. Wir wählen die Freiheit!" - Konrad Adenauer
    "The only thing we have to fear is fear itself." - Franklin D. Roosevelt

  10. #14890
    Registrierter Benutzer Avatar von Suite
    Registriert seit
    05.07.13
    Beiträge
    8.877
    Außer es ist vorher 0 Kultur bei besagtem Feld vorhanden.

  11. #14891
    Registrierter Benutzer Avatar von Xerxes
    Registriert seit
    14.05.04
    Beiträge
    271
    Kleine Noob-Frage (kenne nur Civ3): Bedarf es einer Straße, um von einem Stein- oder Marmorvorkommen für ein Weltwunder zu profitieren (also in der Form, dass es damit schneller zu produzieren ist), oder muss ich erst Steinmetzkunst erforschen und statt der Straße einen Steinbruch auf dem Marmor-/Steinvorkommen bauen, oder brauche ich Straße und Steinbruch für die Weltwunder-Beschleunigung? Möchte mein erstes Civ4-Spiel nicht gleich vermurksen; Civ-Wiki und Letsplays geben mir zu dieser Frage aber keine eindeutige Auskunft. ^^ Intuitiv würde ich darauf tippen, mind. eine Anbindung durch Straße oder Fluss ist jedenfalls nötig. (Und dass das Marmor-/Steinvorkommen auf dem eigenen Territorium liegt.)

  12. #14892
    Stroit
    Gast
    Du brauchst den Steinbruch um die Ressource abzubauen. Zusätzlich muss das Feld am Handelsnetz sein, das geht auf jeden Fall mit einer Straße. Wenn es an einem Fluss liegt der zur Stadt führt ist die Straße nicht nötig.

  13. #14893
    Registrierter Benutzer Avatar von Xerxes
    Registriert seit
    14.05.04
    Beiträge
    271
    Das Stein-/Marmorfeld an einem Fluss, der zur Küste führt, an welcher wiederum irgendwo meine Stadt liegt, in der ich Stein oder Marmor fürs schnellere Wunderbauen benötige, genügt nicht, oder? Von wegen Handel über Küsten-Geländefelder...

  14. #14894
    Moderator Avatar von Kathy
    Registriert seit
    11.10.07
    Beiträge
    17.028
    Wenn du "Segeln" hast, reicht es. Ohne "Segeln" kein Handel auf Flüssen und Küsten, wobei das nur für Felder außerhalb deiner Kultur gilt, d.H. wenn der komplette Fluss und die komplette Küste in deiner Kultur liegen dürfte es auch schon klappen.
    That's why I am here: Mein Mod
    Mehr Technologien, mehr Einheiten, mehr Zivilisationen, mehr Gebäude

    Die aktuelle Story zum Mod:
    Die Vereinigten Staaten von Amerika

    Alte Stories zu alten Versionen:
    Alte Storys

  15. #14895
    geprüft Avatar von firlefanzer
    Registriert seit
    28.11.05
    Ort
    IHREFELD
    Beiträge
    4.784
    Nur, wenn du Segeln schon erforscht hast oder Fluß und Küste komplett in deiner Kultur liegen.
    Du mußt die Strecke auch komplett kennen.

    ...das marmorfeld selber muss allerdings zwingend in deiner kultur liegen, damit es nutzbar wird.
    "Wasser schneidet kein Brot" - "Aber ich!" Emoticon: zigarette

Seite 993 von 1044 ErsteErste ... 49389394398398999099199299399499599699710031043 ... LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •