Frage zum Berchnen von Spielen



  • Hallo ich habe vor einiger Zeit bereits einen Beitrag zu einem Manager Spiel geschrieben :
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-235597-and-highlight-is-.html
    Ich bin jetz soweit das ich Mannschaften und Spieler erstellenn und sogar in einer Liga verwalten kann. Jetzt möchte ich aber die Spiele zwischen 2 Mannschaften simmulieren. Dazu fehlt mir aber die Idee wie man so ewt as berehcnen kann. Also es geht um die SPortart Volleyball. Ich habe für jeden Spieler einen Vector mit technischen Fähigkeiten ( Aufschlag, Annahme, Angriff, Block ). Ich hatte die Idee das man jeden Spielzug berehcnen kann. Also wenn die "Puntke" vom Aufschlag einen bestimmten wert größer sind als die Annahmepunkte usw.....
    Meint ihr das ist halbwegs realistisch.

    Vielleicht hat jemand ja einen Idee.
    Vielen Dank



  • ja, das wird klasse. muß halt noch sehr viel zufall rein, so daß der vector bei ähnlich starken spielern am ende nur eine ganz leichte tendenz angibt, wer bessere chancen hat, und bei deutlich unterschiedlich starken spielern der bessere auch spürbar besser spielt.
    das kann schon mit if(a.aufschlagsPunkte()+rand()%1000>b.annahmePunkte()+rand%1000) statt if(a.aufschlagsPunkte()>b.annahmePunkte()) verblüffend wirken.
    günstig kanns auch sein, die punkte vorher durch eine funktion wie sqrt() zu schicken, die die unterschiede vor allem zwischen den erstligaspielern kleiner macht.



  • Klasse danke für deine schnelle Antowrt.
    Ist es denn Sinnvoll jede Aktion zu berechnen ( also vom aufschalg über die Annahme , Zuspiel Angriff, Block, Annahme...) oder für jeden Spielzug Per Zufall die Punkte verteilung berechen anhand der Stärke der Mannscghaften



  • oscar_0815 schrieb:

    Klasse danke für deine schnelle Antowrt.
    Ist es denn Sinnvoll jede Aktion zu berechnen ( also vom aufschalg über die Annahme , Zuspiel Angriff, Block, Annahme...) oder für jeden Spielzug Per Zufall die Punkte verteilung berechen anhand der Stärke der Mannscghaften

    wenn du es schaffst, jede aktion zu berechnen, biste natürlich mit den auswirkungen dichter an dem, was der zocker erwartet. wenn man zugucken kann, wie der aufschlagstarke Nils Starkarm doch ein klitzbißchen öfters einen aufschlag direkt durchbringt, und daß das sogar spürbar wird, wenn er dem abwehrschwachen Jens Klein die bälle vor den latz knallt.
    das wäre ein langer weg mit vielem, was du falsch machen kannst. viele viele mikroeinstellungen und wenn du falsch justierst, hat eine eigenschaft ein unrealistisches übergewicht oder ist zu irrelevant.
    wenn du es nicht schaffst, ist der weg mit den summen immer die noch gangbare notlösung, die anderen machens ja auch, aber da hat der zocker, denke ich, eine welt der mikrooptimierungen verloren. er muß dann nicht mehr die einzelnen spieler gezielt päppeln und auf ein harmonisches bild der mannschaft und der spieler achten, sondern nur noch auf die besten einkäufe im sinne von Fähigkeitspunktsumme pro Euro, befürchte ich.



  • Hallo

    Wenn du es genau und halbwegs realistisch simulieren möchtest, dann gibst du jedem Spieler einer Mannschaft eine Instanz. Schöner wird die Simulierung, wenn du beispielsweise zufällig mal einen umgrätschen lässt, sodass dann einer ausfällt. Sonst wäre das nur eine stumpfe Berechnung, versuch die Simulierung den PC machen zu lassen, man darf nicht schon am Anfang wissen, "Ah, die Mannschaft gewinnt".

    Mfg.
    way


  • Mod

    volkard schrieb:

    if(a.aufschlagsPunkte()+rand()%1000>b.annahmePunkte()+rand%1000)

    gibt natuerlich noch zig moeglichkeiten z.B.
    if(a.aufschlagsPunkte()*rand()>b.annahmePunkte()*rand)
    oder du suchst immer zwei spieler zusammen

    if(a[rand()%a.size()].aufschlagsPunkte()>b[rand()%b.size()].annahmePunkte())
    auf diese weise waere es z.b. garantiert dass eine manschaft von der alle spieler besser sind als die konkurenz auch wirklich gewinnt.

    andererseits macht eine zu gute auswertung der spielerstatistiken beim spielen von solchen simulation wenig spass, weil dann wirklich schon fast vorgegeben ist wer gewinnt. der spieler wird am ende eh nicht sehen ob du alles simulierst, oder ob grundlagenlos gewuerfelt wird.
    wichtig ist dass es spass macht, indem der spieler sieht dass seine aktionen auch wirklich wirkung zeigen, z.b. wenn er die ganze woche lang nur aufschlag trainieren laesst, dass seine manschaft dadurch viele punkte bekommt, egal ob sie am ende gewinnt oder verliert. oder z.b. indem man ein spiel immer spannend haellt, ein managerspiel macht nach kurzer zeit keinen spass wenn man immer ueberlegen ist, auch wenn es anfaenglich toll ist, ein spiel muss dem spieler seine spannung bieten.

    ich hab schon managerspiele gesehen die am anfang einer saison alle spiele fertig ausgewuerfelt haben und dann den spieler nur noch rummachen liessen als zweitvertreib und die leute waren trotzdem begeistert.
    das in letzter zeit beste beispiel ist Oblivion, du kannst dort deinen spieler-character leveln, das spiel levelt dann aber alles um dich herum mit, sodass das leveln eigentlich sinnfrei ist, aber dennoch wollen die spieler das;)

    ein gutes simulationsspiel das ich mal spielte hat dem spieler abhaengig von den faehigkeiten seiner manschaft ihm eine gewisse punkte zahl gegeben die er pro runde setzen kann, der der die meisten punkt in einer runde gesetzt hat, der hat gewonnen, der der die meisten runden gewann, hat auch das spiel gewonnen.
    das ist natuerlich wenig 'simulation', aber es hat einen nicht nur zum zuschauer gemacht mit einem untransparenten wuerfelsystem, sondern wirklich durch die manschaft aktiv einfluss nehmen lassen.
    du koenntest das erweitern, z.b. dass es ne gewisse anzahl an defensiv und offensiv punkten gibt, dass es pro spieler mit 100% an punkten nen aufschlags-ass gibt. dass...

    naja, nur so ideen 😉



  • rapso schrieb:

    volkard schrieb:

    if(a.aufschlagsPunkte()+rand()%1000>b.annahmePunkte()+rand%1000)

    gibt natuerlich noch zig moeglichkeiten z.B.
    if(a.aufschlagsPunkte()*rand()>b.annahmePunkte()*rand)

    fühlt sich auch recht nett an.

    oder du suchst immer zwei spieler zusammen
    if(a[rand()%a.size()].aufschlagsPunkte()>b[rand()%b.size()].annahmePunkte())
    auf diese weise waere es z.b. garantiert dass eine manschaft von der alle spieler besser sind als die konkurenz auch wirklich gewinnt.

    das wäre schlimm!

    andererseits macht eine zu gute auswertung der spielerstatistiken beim spielen von solchen simulation wenig spass, weil dann wirklich schon fast vorgegeben ist wer gewinnt.

    das würde ich nicht sagen. bei ähnlich starken mannschaften wird auch die gute simulation ähnliche siegchancen bauen. und wenn eine bundesligamannschaft gegen die kreisliga spielt, steht das ergebnis praktisch schon fest. ist doch ok.

    der spieler wird am ende eh nicht sehen ob du alles simulierst, oder ob grundlagenlos gewuerfelt wird.

    es wäre mal an der zeit, einen manager zu bauen, bei dem ser zocker endlich sieht, daß nicht grundlagenlos gewürfelt wird.

    hab dazu mal eine kleine simulation eingehackt:
    dazu nehme ich meine zuerst gepostete formel
    if (100+rand()%1000>100+rand()%1000)
    wobei die beiden 100 jeweils die spielerfähigkeitspunkte darstellen.
    da ich die volleyballregeln nicht kenne, mache ich ein fiktives spiel, das mit obiger formel entscheidet, wer einen ballwechsel gewinnt. wer 21 ballwechsel gewinnt und dabei mehr als einen punkt besser ist als der gegner, gewinnt einen satz. wer 5 sätze gewinnt, gewinnt ein spiel. davon mache ich 100000 spiele.

    int a=100+rand()%1000;
    int b=100+rand()%1000;
    if(a>b)
    ++ballwechselA;
    else if(a<b)
    ++ballwechselB;
    ergibt
    49973:50027
    also fair.

    jetzt mache ich b zur kreisliga
    int a=100+rand()%1000;
    int b=50+rand()%1000;
    93955:6045

    mal einen 100-er gegen einen 95-er antreten lassen.
    int a=100+rand()%1000;
    int b=95+rand()%1000;
    56578:43422

    was ich damit vor allem sagen will, ist folgendes:
    dieser fünf-von-tausend-unterschied ist fett genug, um dich in die oberen plätze der tabelle zu schieben. wenn die spielzüge auch noch simuliert werden, sind die auswirkungen noch stärker. und wenn bei einem ballwechsel nur ein aufschlag passiert aber fünf annahmen, dann sind annahmen praktisch alleinentscheidend und müssen unentscheidender gemacht werden. daher kommts lange justieren und fummeln.

    #include <iostream>
    #include <cstdlib>
    
    using namespace std;
    
    int main()
    {
        int spieleA=0;
        int spieleB=0;
        for (;;)
        {
            int saetzeA=0;
            int saetzeB=0;
            for (;;)
            {
                int ballwechselA=0;
                int ballwechselB=0;
                for (;;)
                {
                	int a=50+rand()%1000;
                	int b=40+rand()%1000;
                    if(a>b)
                        ++ballwechselA;
                    else if(a<b)
                        ++ballwechselB;
                    if (ballwechselA>=21 && ballwechselA>ballwechselB-1)
                    {
                        ++saetzeA;
                        break;
                    }
                    if (ballwechselB>=21 && ballwechselB>ballwechselA-1)
                    {
                        ++saetzeB;
                        break;
                    }
                }
    			if (saetzeA>=5)
    			{
    				++spieleA;
    				break;
    			}
    			if (saetzeB>=5)
    			{
    				++spieleB;
    				break;
    			}
            }
    		cout<<spieleA<<':'<<spieleB<<'\n';
    		if(spieleA+spieleB==100000)
    			break;
        }
        return 0;
    }
    

  • Mod

    volkard schrieb:

    rapso schrieb:

    volkard schrieb:

    if(a.aufschlagsPunkte()+rand()%1000>b.annahmePunkte()+rand%1000)

    gibt natuerlich noch zig moeglichkeiten z.B.
    if(a.aufschlagsPunkte()*rand()>b.annahmePunkte()*rand)

    fühlt sich auch recht nett an.

    oder du suchst immer zwei spieler zusammen
    if(a[rand()%a.size()].aufschlagsPunkte()>b[rand()%b.size()].annahmePunkte())
    auf diese weise waere es z.b. garantiert dass eine manschaft von der alle spieler besser sind als die konkurenz auch wirklich gewinnt.

    das wäre schlimm!

    genau das sagte ich mit dem quote den du hierunter hast 😉

    andererseits macht eine zu gute auswertung der spielerstatistiken beim spielen von solchen simulation wenig spass, weil dann wirklich schon fast vorgegeben ist wer gewinnt.

    das würde ich nicht sagen. bei ähnlich starken mannschaften wird auch die gute simulation ähnliche siegchancen bauen. und wenn eine bundesligamannschaft gegen die kreisliga spielt, steht das ergebnis praktisch schon fest. ist doch ok.

    das waere schlim! q.e.d. 🤡

    aber nein, im ernst, gerade beim sport ist es so schoen dass die komplexitaet des ganzen weit mehr als statistik ist. beim rennsport ist es vielleicht sicher dass ein weltmeister auf 100m wohl jeden zweitklassigen sportler abhaengt.
    beim manschaftssport ist es aber nicht so, beim fussball unterscheiden sich die ergebnisse oft nur um ein bis drei tore und es kamm schon oft genug vor dass bei freundschafts oder pokalspielen eine drittklassige manschaft die erstklassige besiegt. (ich denke bei nem laeufer kann man das ausschliessen).
    schoenstes beispiel ist die europameisterschaft '92, als der zufaellig reingekommene aussenseiter daenemark (der sich eigentlich nichtmal qualifiziert hatte) reinkam und sogar im finale deutschland besiegte.
    jeder haette die chancen auf 1:1000 getippt.

    der spieler wird am ende eh nicht sehen ob du alles simulierst, oder ob grundlagenlos gewuerfelt wird.

    es wäre mal an der zeit, einen manager zu bauen, bei dem ser zocker endlich sieht, daß nicht grundlagenlos gewürfelt wird.

    die heutigen managerspiele sind das resultat von evolution. die spieler wollen ein gefuehl haben, dass ihr werkeln sehr viel einfluss auf die 'simulation' hat, aber sie wollen eben nur die gewissheit, sie wollen dass ihnen das jemand verspricht, selbst alles durchzurechnen usw. wollen die aller aller wenigsten.

    glaub mir, ich hab schon einige spiele auf den markt gebracht und ueber die detailiertesten simulationen schimpfen die leute, einfach nur weil ne simulation nie perfekt ist und immer fehler aufweisen wird. und gerade wenn man es detailierterer machen will, um es den leuten gerecht zu machen, wird sowas noch mehr flaws haben.
    dagegen gab es einige dinge die wirklich rein vom 'rand()' abhingen und ich hab in foren riesenlange threads gelesen wie man das auftretten solcher ereignisse verbessern kann, z.b. gaehaelter mit ungerader zahl, nicht an dienstagen.... die farbe der manschaft darf nicht mehr als 3 farben haben..........

    (ich spreche natuerlich nicht von deterministischen simulationen wie fluids, sondern soft-definierten simulationen, die die jeder ganz anders definiert, z.b. die bewertung von spielerqualitaeten und welche qualitaet wichtig ist und ...)

    49973:50027
    also fair.

    auch langweilig genannt 😛
    wenn man sich fussball statistiken anschaut, da gibt es welche bei denen besser plazierte manschaften seltener gegen eine schlechter plazierte manschaft gewinnen als verlieren und trotzdem im schnitt besser plaziert sind (also zwei spezifische, ich glaube wolfsburg schlake war so ein kandidat, sorry falls ich mich irre). also fast ein statistisches paradoxon, einfach weil die werte, wenn auch fuer sich schluessig, nicht unbedingt auf andere werte uebertragbar sind.
    nicht der, der am meisten beliebt ist, ist der beste spieler. nicht der der die meisten tore macht, verdient am meisten. nicht der mit der besten kondition laeuft am schnellsten, nicht die manschaft mit den teuersten spielern gewinnt, nicht die manschaft mit der besseren plazierung hat die meisten leute im kader, nicht...

    was ich damit vor allem sagen will, ist folgendes:
    dieser fünf-von-tausend-unterschied ist fett genug, um dich in die oberen plätze der tabelle zu schieben. wenn die spielzüge auch noch simuliert werden, sind die auswirkungen noch stärker. und wenn bei einem ballwechsel nur ein aufschlag passiert aber fünf annahmen, dann sind annahmen praktisch alleinentscheidend und müssen unentscheidender gemacht werden. daher kommts lange justieren und fummeln.

    ich glaube ohne das gegen echte statistiken zu vergleichen, kann ich da nicht wirklich was zu sagen.

    aber schau dir mal die 1.liga fussball tabelle sortiert nach tor differenz, nach pkt mit 3:1 und 2:-2 system an, nach spielergehalt, nach... an.
    auch wenn es tendenzen gibt, es wird doch eine ziemliche streuung geben. deswegen denke ich dass sowas, gerade als computerspiel, davon lebt nicht vorhersagbar zu sein. (quasi wie aktien indices)

    ich geb dir schon recht, dass die statistik helfen kann, aber ich glaube sie erfasst nur einen kleinen teil dessen was ein spiel am ende ausmacht. und bei etwas was zur unterhaltung dient, wollen die leute auch kein wirklich ausgekluegeltest system haben, sie wollen nur eine gute moeglichkeit die simulation zu beeinflussen, ohne aber diese zu beherrschen.



  • rapso schrieb:

    aber nein, im ernst, gerade beim sport ist es so schoen dass die komplexitaet des ganzen weit mehr als statistik ist.

    genau. quasi zufall. mannschaftsstärken können nur eine leichte tendenz einbringen.

    schoenstes beispiel ist die europameisterschaft '92, als der zufaellig reingekommene aussenseiter daenemark (der sich eigentlich nichtmal qualifiziert hatte) reinkam und sogar im finale deutschland besiegte.
    jeder haette die chancen auf 1:1000 getippt.

    naja, wenn so was ülkiges in einer EM oder WM alle nur alle 100 jahre mal vorkommt, ist das schon sauselten, oder?, fast ein jahrhundertereignis und hat nur 1:50 als wahrscheinlichkeit (in der annahme, daß in den 100 Jahren 50 EMs und WMs sind).

    dagegen gab es einige dinge die wirklich rein vom 'rand()' abhingen und ich hab in foren riesenlange threads gelesen wie man das auftretten solcher ereignisse verbessern kann, z.b. gaehaelter mit ungerader zahl, nicht an dienstagen.... die farbe der manschaft darf nicht mehr als 3 farben haben..........

    machen die echten fans auch. das will ich ihnen ja auch nicht nehmen. ich will auch nicht, daß die zocker jemals erfahren, wie die rechnung innendrin ist. und daß der einfluß schwach bleibt. nachher werden die einen im forum schreiben, der angriff müsse gesteigert werden, die anderen sagen, der sei eher egal und es käme nur auf die verteidigung an und noch andere posten was von trikotfarben. je mehr sportbegeisterung, desto ausener ist das hirn dabei.

    ich sehe keinen grund, nicht zu versuchen, das modell realistisch zu machen. vermutlich haben die leute vorher versucht, den zufall wegzumachen, indem sie zu stark an ihr modell glaubten. ein sportfan sollte so ein modell vielleicht nicht machen. und den fans sollte man die berechnung nicht offenlegen, das einzige, was sie machen, ist zu beweisen, daß der effekt von diesunddas doch größer ist.


  • Mod

    volkard schrieb:

    schoenstes beispiel ist die europameisterschaft '92, als der zufaellig reingekommene aussenseiter daenemark (der sich eigentlich nichtmal qualifiziert hatte) reinkam und sogar im finale deutschland besiegte.
    jeder haette die chancen auf 1:1000 getippt.

    naja, wenn so was ülkiges in einer EM oder WM alle nur alle 100 jahre mal vorkommt, ist das schon sauselten, oder?, fast ein jahrhundertereignis und hat nur 1:50 als wahrscheinlichkeit (in der annahme, daß in den 100 Jahren 50 EMs und WMs sind).

    es gab 14 bisher. die eine top manschaft wie deutschland hat 3 mal gewonnen. manschaften die oft qualifiziert sind wie z.b. England (was ich auch als top manschaft ansehen wuerde), haben nicht ein einziges mal gewonnen.
    das also ein aussenseiter der nichtmal qualifiziert war europameister wird, bei 14 versuchen, und zwar nicht durch dubiose punktesysteme, sondern wirklich durch siege gegen alle gegner... naja, statistisch nicht moeglich.


Log in to reply