Autor Beitrag
Schlabbermampf
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Do 19.07.07 13:58 
Hi!
Habe die letzten Tage mit Delphi 5 und meinem bescheidenen Kenntsissen aus der Schule ein Programm gebastelt, das die Nahkampfphase von zwei Einheiten in Warhammer 40k berechnet und den Sieger, abhängig von Kampfgeschick, Stärke, Rüstung etc herausstellt.
Das Ganze wird je nach Belieben zB 10000 gemacht um ein Durchschnittsergebnis zu erhalten. Man kann dadurch sehen welche Einheit gut gegen welche andere Einheit ist und wer anfällig gegen wen ist, was für die Gestaltung einer Armee sehr hilfreich sein kann.

Das ganze funktioniert bis dahhin fast super, in Zukunft wird weitere Ausrütung hinzugefügt und alles grafisch aufgewertet.
Allerdings macht mir ein Problem sorgen: Wenn die Einheiten auf beiden Seiten komplett gleich sind, müsste der Angreifer öfters gewinnen, da einen Attackenbonus hat. Das funktioniert auch, solange die linke Seite der Angreifer ist. Dann gibt es zB ein Ergebnis von 70% zu 30%.
Wenn allerdings dann die andere Seite als Angreifer gewählt ist, gibt es ein Ergebnis von ca 55% zu 45%, obwohl es 30% zu 70% seinen müsste, denn die Seiten wurden ja eigentlich nur vertauscht.
Am Besten schaut ihr euch das einfach mal selbst am Programm an, habe es, mit einem passenden Beispiel voreingestellt, beigehängt.

Hier der kommentierte Quelltext, hoffe er ist verständlich (auch für nicht Warhammer Spieler :D ), ansonsten einfach nachfragen:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
280:
281:
282:
283:
284:
285:
286:
287:
288:
289:
290:
291:
292:
293:
294:
295:
296:
297:
298:
299:
300:
301:
302:
303:
304:
305:
306:
307:
308:
309:
310:
311:
312:
313:
314:
315:
316:
317:
318:
319:
320:
321:
322:
323:
324:
325:
326:
327:
328:
329:
330:
331:
332:
333:
334:
335:
336:
337:
338:
339:
340:
341:
342:
343:
344:
345:
346:
347:
348:
349:
350:
351:
352:
353:
354:
355:
356:
357:
358:
359:
360:
361:
362:
363:
364:
365:
366:
367:
368:
369:
370:
371:
372:
373:
374:
375:
376:
377:
378:
379:
380:
381:
382:
383:
384:
385:
386:
387:
388:
389:
390:
391:
392:
393:
394:
395:
396:
397:
398:
399:
400:
401:
402:
403:
404:
405:
406:
407:
408:
409:
410:
411:
412:
413:
414:
415:
416:
417:
418:
419:
420:
421:
422:
423:
424:
425:
426:
427:
428:
429:
430:
431:
432:
433:
434:
435:
436:
437:
438:
439:
440:
441:
442:
443:
444:
445:
446:
447:
448:
449:
450:
451:
452:
453:
454:
455:
456:
457:
458:
459:
460:
461:
462:
463:
464:
465:
466:
467:
468:
469:
470:
471:
472:
473:
474:
475:
476:
477:
478:
479:
480:
481:
482:
483:
484:
485:
486:
487:
488:
489:
490:
491:
492:
493:
494:
495:
496:
497:
498:
499:
500:
501:
502:
503:
504:
505:
506:
507:
508:
509:
510:
511:
512:
513:
514:
515:
516:
517:
518:
519:
520:
521:
522:
523:
524:
525:
526:
527:
528:
529:
530:
531:
532:
533:
534:
535:
536:
537:
538:
539:
540:
541:
542:
543:
544:
545:
546:
547:
548:
549:
550:
551:
552:
553:
554:
555:
556:
557:
558:
559:
560:
561:
562:
563:
564:
565:
566:
567:
568:
569:
570:
571:
572:
573:
574:
575:
576:
577:
578:
579:
580:
581:
582:
583:
584:
585:
586:
587:
588:
589:
590:
591:
592:
593:
594:
595:
596:
597:
598:
599:
600:
601:
602:
603:
604:
605:
606:
607:
608:
609:
610:
611:
612:
613:
614:
615:
616:
617:
618:
619:
620:
621:
622:
623:
624:
625:
626:
627:
628:
629:
630:
631:
632:
633:
634:
635:
636:
637:
638:
639:
640:
641:
642:
643:
644:
645:
646:
647:
648:
649:
650:
651:
652:
653:
654:
655:
656:
657:
658:
659:
660:
661:
662:
663:
664:
665:
666:
667:
668:
669:
670:
671:
672:
673:
674:
675:
676:
677:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls, ComCtrls;

type
  Tform1 = class(TForm)
    W6: TEdit;
    Button1: TButton;
    team1: TPanel;
    Name1: TEdit;
    Label11: TLabel;
    Label12: TLabel;
    Label13: TLabel;
    Label14: TLabel;
    Label15: TLabel;
    Label16: TLabel;
    Label17: TLabel;
    Label18: TLabel;
    Label19: TLabel;
    Label20: TLabel;
    KampfGeschick1: TEdit;
    BallistischeFaehigikeit1: TEdit;
    MoralWert1: TEdit;
    RettungsWurf1: TEdit;
    Widerstand1: TEdit;
    Staerke1: TEdit;
    RuestungsWurf1: TEdit;
    LebensPunkte1: TEdit;
    Initiative1: TEdit;
    angriffe1: TEdit;
    pts1: TEdit;
    plusangriff1: TEdit;
    anzahl1: TEdit;
    Panel1: TPanel;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    KampfGeschick2: TEdit;
    BallistischeFaehigikeit2: TEdit;
    RettungsWurf2: TEdit;
    Widerstand2: TEdit;
    Staerke2: TEdit;
    RuestungsWurf2: TEdit;
    LebensPunkte2: TEdit;
    Initiative2: TEdit;
    angriffe2: TEdit;
    plusangriff2: TEdit;
    Name2: TEdit;
    pts2: TEdit;
    anzahl2: TEdit;
    Label21: TLabel;
    gesamta1: TEdit;
    Auswerten: TButton;
    Label22: TLabel;
    gesamta2: TEdit;
    ifs1: TCheckBox;
    plusangriffscheren1: TEdit;
    ifs2: TCheckBox;
    plusangriffscheren2: TEdit;
    Label24: TLabel;
    gesamtlp1: TEdit;
    gesamtlp2: TEdit;
    Label23: TLabel;
    ifa1: TRadioButton;
    ifa2: TRadioButton;
    times: TEdit;
    wins1: TEdit;
    wins2: TEdit;
    winspro1: TEdit;
    winspro2: TEdit;
    ProgressBar1: TProgressBar;
    Unentschieden: TEdit;
    unentschiedenpro: TEdit;
    Label25: TLabel;
    Label26: TLabel;
    MoralWert2: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure AuswertenClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  form1: Tform1;
  x:real;

implementation

{$R *.DFM}

//Würfelwurf mit Anzahl der Würfe (a, z.B. die Anzahl der Angriffe) und dem Mindestwurfergebnis (w, z.B. aus der Schadens-Widerstandstabelle)
function wurf (a,w:real):real;
var wa,wr,anw:integer;
begin
wa:=0;
wr:=0;
anw:=0;
if a=0 then result:=0 else
 begin
  wa:=0;
   repeat
    wa:=wa+1;
    wr:=random(6)+1;
     if wr>=w then anw:=anw+1
   until wa=a;
result:=round(anw);
end
end;

//Schadens-Widerstandstabelle
function svsw (sa,wv:real):real;
var sw:real;
begin
    if sa= 1 then
      if wv= 1 then sw:= 4 else
      if wv= 2 then sw:= 5 else
      if wv= 3 then sw:= 6 else
      if wv= 4 then sw:= 6 else
      if wv= 5 then sw:= 7 else
      if wv= 6 then sw:= 7 else
      if wv= 7 then sw:= 7 else
      if wv= 8 then sw:= 7 else
      if wv= 9 then sw:= 7 else
      if wv=10 then sw:= 7;
    if sa= 2 then
      if wv= 1 then sw:= 3 else
      if wv= 2 then sw:= 4 else
      if wv= 3 then sw:= 5 else
      if wv= 4 then sw:= 6 else
      if wv= 5 then sw:= 6 else
      if wv= 6 then sw:= 7 else
      if wv= 7 then sw:= 7 else
      if wv= 8 then sw:= 7 else
      if wv= 9 then sw:= 7 else
      if wv=10 then sw:= 7;
    if sa= 3 then
      if wv= 1 then sw:= 2 else
      if wv= 2 then sw:= 3 else
      if wv= 3 then sw:= 4 else
      if wv= 4 then sw:= 5 else
      if wv= 5 then sw:= 6 else
      if wv= 6 then sw:= 6 else
      if wv= 7 then sw:= 7 else
      if wv= 8 then sw:= 7 else
      if wv= 9 then sw:= 7 else
      if wv=10 then sw:= 7;
    if sa= 4 then
      if wv= 1 then sw:= 2 else
      if wv= 2 then sw:= 2 else
      if wv= 3 then sw:= 3 else
      if wv= 4 then sw:= 4 else
      if wv= 5 then sw:= 5 else
      if wv= 6 then sw:= 6 else
      if wv= 7 then sw:= 6 else
      if wv= 8 then sw:= 7 else
      if wv= 9 then sw:= 7 else
      if wv=10 then sw:= 7;
    if sa= 5 then
      if wv= 1 then sw:= 2 else
      if wv= 2 then sw:= 2 else
      if wv= 3 then sw:= 2 else
      if wv= 4 then sw:= 3 else
      if wv= 5 then sw:= 4 else
      if wv= 6 then sw:= 5 else
      if wv= 7 then sw:= 6 else
      if wv= 8 then sw:= 6 else
      if wv= 9 then sw:= 7 else
      if wv=10 then sw:= 7;
    if sa= 6 then
      if wv= 1 then sw:= 2 else
      if wv= 2 then sw:= 2 else
      if wv= 3 then sw:= 2 else
      if wv= 4 then sw:= 2 else
      if wv= 5 then sw:= 3 else
      if wv= 6 then sw:= 4 else
      if wv= 7 then sw:= 5 else
      if wv= 8 then sw:= 6 else
      if wv= 9 then sw:= 6 else
      if wv=10 then sw:= 7;
    if sa= 7 then
      if wv= 1 then sw:= 2 else
      if wv= 2 then sw:= 2 else
      if wv= 3 then sw:= 2 else
      if wv= 4 then sw:= 2 else
      if wv= 5 then sw:= 2 else
      if wv= 6 then sw:= 3 else
      if wv= 7 then sw:= 4 else
      if wv= 8 then sw:= 5 else
      if wv= 9 then sw:= 6 else
      if wv=10 then sw:= 6;
    if sa= 8 then
      if wv= 1 then sw:= 2 else
      if wv= 2 then sw:= 2 else
      if wv= 3 then sw:= 2 else
      if wv= 4 then sw:= 2 else
      if wv= 5 then sw:= 2 else
      if wv= 6 then sw:= 2 else
      if wv= 7 then sw:= 3 else
      if wv= 8 then sw:= 4 else
      if wv= 9 then sw:= 5 else
      if wv=10 then sw:= 6;
    if sa= 9 then
      if wv= 1 then sw:= 2 else
      if wv= 2 then sw:= 2 else
      if wv= 3 then sw:= 2 else
      if wv= 4 then sw:= 2 else
      if wv= 5 then sw:= 2 else
      if wv= 6 then sw:= 2 else
      if wv= 7 then sw:= 2 else
      if wv= 8 then sw:= 3 else
      if wv= 9 then sw:= 4 else
      if wv=10 then sw:= 5;
    if sa=10 then
      if wv= 1 then sw:= 2 else
      if wv= 2 then sw:= 2 else
      if wv= 3 then sw:= 2 else
      if wv= 4 then sw:= 2 else
      if wv= 5 then sw:= 2 else
      if wv= 6 then sw:= 2 else
      if wv= 7 then sw:= 2 else
      if wv= 8 then sw:= 2 else
      if wv= 9 then sw:= 3 else
      if wv=10 then sw:= 4;
    if (sa>10or (sa<1or (wv>10or (wv< 1)
     then showmessage('ERROR: unrealistische Werte!');
    result:=sw;
end;

//Kampfgeschicktabelle
function kgvskg (kga,kgv:real):real;
var kgw:real;
begin
    if kga= 1 then
      if kgv= 1 then kgw:=4 else
      if kgv= 2 then kgw:=4 else
      if kgv= 3 then kgw:=5 else
      if kgv= 4 then kgw:=5 else
      if kgv= 5 then kgw:=5 else
      if kgv= 6 then kgw:=5 else
      if kgv= 7 then kgw:=5 else
      if kgv= 8 then kgw:=5 else
      if kgv= 9 then kgw:=5 else
      if kgv=10 then kgw:=5;
    if kga= 2 then
      if kgv= 1 then kgw:=3 else
      if kgv= 2 then kgw:=4 else
      if kgv= 3 then kgw:=4 else
      if kgv= 4 then kgw:=4 else
      if kgv= 5 then kgw:=5 else
      if kgv= 6 then kgw:=5 else
      if kgv= 7 then kgw:=5 else
      if kgv= 8 then kgw:=5 else
      if kgv= 9 then kgw:=5 else
      if kgv=10 then kgw:=5;
    if kga= 3 then
      if kgv= 1 then kgw:=3 else
      if kgv= 2 then kgw:=3 else
      if kgv= 3 then kgw:=4 else
      if kgv= 4 then kgw:=4 else
      if kgv= 5 then kgw:=4 else
      if kgv= 6 then kgw:=4 else
      if kgv= 7 then kgw:=5 else
      if kgv= 8 then kgw:=5 else
      if kgv= 9 then kgw:=5 else
      if kgv=10 then kgw:=5;
    if kga= 4 then
      if kgv= 1 then kgw:=3 else
      if kgv= 2 then kgw:=3 else
      if kgv= 3 then kgw:=3 else
      if kgv= 4 then kgw:=4 else
      if kgv= 5 then kgw:=4 else
      if kgv= 6 then kgw:=4 else
      if kgv= 7 then kgw:=4 else
      if kgv= 8 then kgw:=4 else
      if kgv= 9 then kgw:=5 else
      if kgv=10 then kgw:=5;
    if kga= 5 then
      if kgv= 1 then kgw:=3 else
      if kgv= 2 then kgw:=3 else
      if kgv= 3 then kgw:=3 else
      if kgv= 4 then kgw:=3 else
      if kgv= 5 then kgw:=4 else
      if kgv= 6 then kgw:=4 else
      if kgv= 7 then kgw:=4 else
      if kgv= 8 then kgw:=4 else
      if kgv= 9 then kgw:=4 else
      if kgv=10 then kgw:=4;
    if kga= 6 then
      if kgv= 1 then kgw:=3 else
      if kgv= 2 then kgw:=3 else
      if kgv= 3 then kgw:=3 else
      if kgv= 4 then kgw:=3 else
      if kgv= 5 then kgw:=3 else
      if kgv= 6 then kgw:=4 else
      if kgv= 7 then kgw:=4 else
      if kgv= 8 then kgw:=4 else
      if kgv= 9 then kgw:=4 else
      if kgv=10 then kgw:=4;
    if kga= 7 then
      if kgv= 1 then kgw:=3 else
      if kgv= 2 then kgw:=3 else
      if kgv= 3 then kgw:=3 else
      if kgv= 4 then kgw:=3 else
      if kgv= 5 then kgw:=3 else
      if kgv= 6 then kgw:=3 else
      if kgv= 7 then kgw:=4 else
      if kgv= 8 then kgw:=4 else
      if kgv= 9 then kgw:=4 else
      if kgv=10 then kgw:=4;
    if kga= 8 then
      if kgv= 1 then kgw:=3 else
      if kgv= 2 then kgw:=3 else
      if kgv= 3 then kgw:=3 else
      if kgv= 4 then kgw:=3 else
      if kgv= 5 then kgw:=3 else
      if kgv= 6 then kgw:=3 else
      if kgv= 7 then kgw:=3 else
      if kgv= 8 then kgw:=4 else
      if kgv= 9 then kgw:=4 else
      if kgv=10 then kgw:=4;
    if kga= 9 then
      if kgv= 1 then kgw:=3 else
      if kgv= 2 then kgw:=3 else
      if kgv= 3 then kgw:=3 else
      if kgv= 4 then kgw:=3 else
      if kgv= 5 then kgw:=3 else
      if kgv= 6 then kgw:=3 else
      if kgv= 7 then kgw:=3 else
      if kgv= 8 then kgw:=3 else
      if kgv= 9 then kgw:=4 else
      if kgv=10 then kgw:=4;
    if kga=10 then
      if kgv= 1 then kgw:=3 else
      if kgv= 2 then kgw:=3 else
      if kgv= 3 then kgw:=3 else
      if kgv= 4 then kgw:=3 else
      if kgv= 5 then kgw:=3 else
      if kgv= 6 then kgw:=3 else
      if kgv= 7 then kgw:=3 else
      if kgv= 8 then kgw:=3 else
      if kgv= 9 then kgw:=3 else
      if kgv=10 then kgw:=4;
    if (kga>10or (kga< 1or (kgv>10or (kgv< 1)
     then showmessage('ERROR: unrealistische Werte!');
    result:=kgw;
end;

procedure Tform1.Button1Click(Sender: TObject);
begin
randomize;
x:=random(6)+1;
w6.text:=floattostr(x);
end;


procedure Tform1.AuswertenClick(Sender: TObject);
var gaw1,gaw2,unend,unendpro,winpro1,winpro2,wing,win1,win2,upa1,upa2,upas1,upas2,uan1,uan2,ukg1,ubf1,us1,uw1,ulp1,ui1,ua1,umw1,urw1,urew1,ukg2,ubf2,us2,uw2,ulp2,ui2,ua2,umw2,urw2,urew2,a1,a2,an1,an2,pa1,pa2,pas1,pas2,ras1,ras2,i1,i2,w1,w2,ga1,ga2,kg1,kg2,d,lp1,lp2,c,s1,s2,b1,b2,kgw1,kgw2,glp1,glp2,sw1,sw2,kgwr1,kgwr2,gakg1,gakg2,gas1,gas2,rw1,rw2,rew1,rew2,lpv1,lpv2:real;
    g,t,tb:integer;
begin
   // Speichern der eingegebene Werte für spätere eventuelle Wiederherstellung
   uan1:=strtofloat(anzahl1.text);
   uan2:=strtofloat(anzahl2.text);
   upa1:=strtofloat(plusangriff1.text);
   upa2:=strtofloat(plusangriff2.text);
   upas1:=strtofloat(plusangriffscheren1.text);
   upas2:=strtofloat(plusangriffscheren2.text);
   ukg1:=strtofloat(KampfGeschick1.text);
   ubf1:=strtofloat(BallistischeFaehigikeit1.text);
   us1:=strtofloat(Staerke1.text);
   uw1:=strtofloat(Widerstand1.text);
   ulp1:=strtofloat(LebensPunkte1.text);
   ui1:=strtofloat(Initiative1.text);
   ua1:=strtofloat(angriffe1.text);
   umw1:=strtofloat(MoralWert1.text);
   urw1:=strtofloat(RuestungsWurf1.text);
   urew1:=strtofloat(RettungsWurf1.text);
   ukg2:=strtofloat(KampfGeschick2.text);
   ubf2:=strtofloat(BallistischeFaehigikeit2.text);
   us2:=strtofloat(Staerke2.text);
   uw2:=strtofloat(Widerstand2.text);
   ulp2:=strtofloat(LebensPunkte2.text);
   ui2:=strtofloat(Initiative2.text);
   ua2:=strtofloat(angriffe2.text);
   umw2:=strtofloat(MoralWert2.text);
   urw2:=strtofloat(RuestungsWurf2.text);
   urew2:=strtofloat(RettungsWurf2.text);

   //Anzahl der Widerholungen (t) wird ausgelesen
   t:=round(strtofloat(times.text));
   //Bisherige Anzahl der Kämpfe (tb), Wert für den Angreiferwechsel (d) und Siege (win1, win2, unend) werde auf 0 gesetzt
   tb:=0;
   d:=0;
   win1:=0;
   win2:=0;
   unend:=0;

   //es wird gespeichert, wer der ursprüngliche Angreifer war
   if ifa1.checked=true
    then g:=0 else
   if ifa2.checked=true
    then g:=1;

repeat

  //die bisherige Anzahl der Kämpfe (tb) wird um 1 erhöht
  tb:=tb+1;

  //ursprüngliche Werte werden eingelesen, damit jeder Kampf mit identischen Voraussetzungen verläuft
  anzahl1.text:=floattostr(uan1);
  anzahl2.text:=floattostr(uan2);
  plusangriff1.text:=floattostr(upa1);
  plusangriff2.text:=floattostr(upa2);
  plusangriffscheren1.text:=floattostr(upas1);
  plusangriffscheren2.text:=floattostr(upas2);
  KampfGeschick1.text:=floattostr(ukg1);
  BallistischeFaehigikeit1.text:=floattostr(ubf1);
  Staerke1.text:=floattostr(us1);
  Widerstand1.text:=floattostr(uw1);
  LebensPunkte1.text:=floattostr(ulp1);
  Initiative1.text:=floattostr(ui1);
  angriffe1.text:=floattostr(ua1);
  MoralWert1.text:=floattostr(umw1);
  RuestungsWurf1.text:=floattostr(urw1);
  RettungsWurf1.text:=floattostr(urew1);
  KampfGeschick2.text:=floattostr(ukg2);
  BallistischeFaehigikeit2.text:=floattostr(ubf2);
  Staerke2.text:=floattostr(us2);
  Widerstand2.text:=floattostr(uw2);
  LebensPunkte2.text:=floattostr(ulp2);
  Initiative2.text:=floattostr(ui2);
  angriffe2.text:=floattostr(ua2);
  MoralWert2.text:=floattostr(umw2);
  RuestungsWurf2.text:=floattostr(urw2);
  RettungsWurf2.text:=floattostr(urew2);

  kg1:=ukg1;
  kg2:=ukg2;
  s1:=us1;
  s2:=us2;
  w1:=uw1;
  w2:=uw2;
  rw1:=urw1;
  rw2:=urw2;
  rew1:=urew1;
  rew2:=urew2;
  a1:=ua1;
  a2:=ua2;
  an1:=uan1;
  an2:=uan2;
  pa1:=upa1;
  pa2:=upa2;
  lp1:=ulp1;
  lp2:=ulp2;
  i1:=ui1;
  i2:=ui2;
  pas1:=upas1;
  pas2:=upas2;

  //Gesamtlebenspunkte beider Seiten werden berechnet und eingetragen
  glp1:=lp1*an1;
   gesamtlp1.text:=floattostr(glp1);
  glp2:=lp1*an2;
   gesamtlp2.text:=floattostr(glp2);

 repeat
  //Berechnung des Attacken (a1,a2) wenn Scherenklauen benutzt werden
  pas1:=strtofloat(plusangriffscheren1.text);
   randomize;
   if ifs1.checked then
    begin
    ras1:=random(6)+1;
    a1:=ras1+pas1;
    end;
   if ifs2.checked then
    begin
    ras2:=random(6)+1;
    a2:=ras2+pas2;
    end;

  //Gesamtanzahl der Attacken (ga1, ga2) beider Seiten werden berechnet, zusätzliche Attacke(n) (pa1, pa2) werden dem Angreifer gutgeschrieben und die Werte eingetragen
  If ifa1.Checked then ga1:=(a1+pa1)*an1
   else ga1:=a1*an1;
   gesamta1.text:=floattostr(ga1);
  If ifa2.Checked then ga2:=(a2+pa2)*an2
   else ga2:=a2*an2;
   gesamta2.text:=floattostr(ga2);

  //unabhängig vom Angreifer schlagen die Modelle mit der höheren Initiative (i1,i2) zuerst zu, danach haben die Modelle mit weniger Initiative die Möglichkeit zurückzuschlagen

  //hat die linke Seite einen höheren Initiativewert (i1) dann...
  If i1>i2 then
   begin
    //Kampfgeschick (kg1,kg2) beider Seiten werden in der Kampfgeschicktabelle verglichen
    kgw1:=kgvskg(kg1,kg2);
    //mit dem Gesamtattackenwert (ga1) und dem Wert aus der Kampfgeschicktabelle (kgw1) wird ermittelt, wieviele Attacken einen Treffer gelandet haben (gakg1)
    gakg1:=wurf(ga1,kgw1);
    //Stärke der linken Seite (s1) wird mit Widerstand (w2) der rechten Seite in der Schadens-Widerstandstabelle verglichen verglichen
    sw1:=svsw(s1,w2);
    //mit dem Gesamtattackenwert nach dem Kampfgeschicktest (gakg1) und dem Wert aus der Schadens-Widerstandstabelle (sw1) wird ermittelt, wieviele Attacken die rechte Seite verwunden konnten (gas1)
    gas1:=wurf(gakg1,sw1);
    //mit dem Gesamtattackenwert nach dem Stärke-Widerstandstest (gas1) und dem Rüstungswert (rw2) oder dem Rettungswert (rew2) der rechten Seite wird ermittelt, wieviele der verwundenden Attacken nicht an der Rüstung, an Deckung ö.ä. abprallen und somit einen Lebenspunktberlust auf der rechten Seite verursachen (lpv2)
    If rew2<=rw2 then lpv2:=gas1-wurf(gas1,rew2)
                 else lpv2:=gas1-wurf(gas1,rw2);

    //der Lebenspunktverlust (lpv2) wird von den Gesamtlebenspunkten abgezogen (glp2)
    glp2:=glp2-lpv2;
    //die Anzahl der Modelle (an2) der rechten Seite wird mithilfe des neuen Gesamtlebenspunktwert (glp2) und dem Lebenspunktewert pro Modell (lp2) neu berechnet
    an2:=glp2/lp2;
    //um ungerade Anzahlen zu vermeiden wird ab einem Nachkommawert von über 0 aufgerundet, so hat ein Modell mit halber Lebenspunktanzahl immernoch den vollen Attackenwert
    b1:=frac(an2);
    if b1<>0 then an2:=int(an2)+1
             else an2:=int(an2);
     //der neue Gesamtattackenwert auf Grund der neuen Modellanzahl wird zu Beginn der Wiederholung berechnet
   end

  //hat die rechte Seite einen höheren Initiativewert (i2) dann...
  else If i1<i2 then
   begin
    //Kampfgeschick (kg2,kg1) beider Seiten werden in der Kampfgeschicktabelle verglichen
    kgw2:=kgvskg(kg2,kg1);
    //mit dem Gesamtattackenwert (ga2) und dem Wert aus der Kampfgeschicktabelle (kgw2) wird ermittelt, wieviele Attacken einen Treffer gelandet haben (gakg2)
    gakg2:=wurf(ga2,kgw2);
    //Stärke der rechten Seite (s2) wird mit Widerstand (w1) der linken Seite in der Schadens-Widerstandstabelle verglichen
    sw2:=svsw(s2,w1);
    //mit dem Gesamtattackenwert nach dem Kampfgeschicktest (gakg2) und dem Wert aus der Schadens-Widerstandstabelle (sw2) wird ermittelt, wieviele Attacken die linke Seite verwunden konnten (gas2)
    gas2:=wurf(gakg2,sw2);
    //mit dem Gesamtattackenwert nach dem Stärke-Widerstandstest (gas2) und dem Rüstungswert (rw1) oder dem Rettungswert (rew1) der linken Seite  wird ermittelt, wieviele der verwundenden Attacken nicht an der Rüstung, an Deckung ö.ä. abprallen und somit einen Lebenspunktberlust auf der linken Seite verursachen (lpv1)
    If rew1<=rw1 then lpv1:=gas2-wurf(gas2,rew1)
                 else lpv1:=gas2-wurf(gas2,rw1);

    //der Lebenspunktverlust (lpv1) wird von den Gesamtlebenspunkten abgezogen (glp1)
    glp1:=glp1-lpv1;
    //die Anzahl der Modelle (an1) der linken Seite wird mithilfe des neuen Gesamtlebenspunktwert (glp1) und dem Lebenspunktewert pro Modell (lp1) neu berechnet
    an1:=glp1/lp1;
    //um ungerade Anzahlen zu vermeiden wird ab einem Nachkommawert von über 0 aufgerundet, so auch hat ein Modell mit halber Lebenspunktanzahl immernoch den vollen Attackenwert
    b2:=frac(an1);
    if b2<>0 then an1:=int(an1)+1
             else an1:=int(an1);
     //der neue Gesamtattackenwert auf Grund der neuen Modellanzahl wird zu Beginn der Wiederholung berechnet
   end

  //haben beide Seiten einen identischen Initiativewert (i1,i2), werden erst Lebenspunktverluste beider Seiten berechnet und dann abgezogen (ein unentschieden ist z.B. möglich)
  else If i2=i1 then
   begin

    //Kampfgeschick (kg2,kg1) beider Seiten werden in der Kampfgeschicktabelle verglichen
    kgw1:=kgvskg(kg1,kg2);
    kgw2:=kgvskg(kg2,kg1);

    //mit den Gesamtattackenwerten (ga1,ga2) und den Werten aus der Kampfgeschicktabelle (kgw1,kgw2) wird ermittelt, wieviele Attacken der linken, und wieviel der rechten Seite einen Treffer gelandet haben (gakg1,gakg2)
    gakg1:=wurf(ga1,kgw1);
    gakg2:=wurf(ga2,kgw2);

    //Stärke der linken Seite Seite (s1) wird mit Widerstand (w2) der rechten Seite und Stärke der rechten Seite (s2) wird mit Widerstand (w1) der linken Seite in der Schadens-Widerstandstabelle verglichen
    sw1:=svsw(s1,w2);
    sw2:=svsw(s2,w1);

    //mit den Gesamtattackenwerten nach dem Kampfgeschicktest (gakg1,gakg2) und den Werten aus der Schadens-Widerstandstabelle (sw1,sw2) wird ermittelt, wieviele Attacken die linke Seite verwunden konnten (gas2) und wieviele dir rechte (gas1)
    gas1:=wurf(gakg1,sw1);
    gas2:=wurf(gakg2,sw2);

    //mit den Gesamtattackenwerten nach dem Stärke-Widerstandstest (gas1,gas2) und den Rüstungswerten (rw1,rw2) oder den Rettungswerten (rew1,rew2) beider Seiten wird ermittelt, wieviele der verwundenden Attacken nicht an der Rüstung, an Deckung ö.ä. abprallen und somit einen Lebenspunktberlust auf der linken bzw auf der rechten Seite verursachen (lpv1,lpv2)
    If rew2<=rw2 then lpv2:=gas1-wurf(gas1,rew2)
                 else lpv2:=gas1-wurf(gas1,rw2);
    If rew1<=rw1 then lpv1:=gas2-wurf(gas2,rew1)
                 else lpv1:=gas2-wurf(gas2,rw1);

    //die Lebenspunktverluste (lpv1,lpv2) werden von den Gesamtlebenspunkten abgezogen (glp1,glp2)
    glp2:=glp2-lpv2;
    glp1:=glp1-lpv1;

    //die Anzahl der Modelle (an1,an2) beider Seiten wird mithilfe der neuen Gesamtlebenspunktwerte (glp1,glp2) und den Lebenspunktewerten pro Modell (lp1,lp2) neu berechnet
    an1:=glp1/lp1;
    an2:=glp2/lp2;

    //um ungerade Anzahlen zu vermeiden wird ab einem Nachkommawert von über 0 aufgerundet, so auch hat ein Modell mit halber Lebenspunktanzahl immernoch den vollen Attackenwert
    b2:=frac(an1);
     if b2<>0 then an1:=int(an1)+1
              else an1:=int(an1);
    b1:=frac(an2);
     if b1<>0 then an2:=int(an2)+1
              else an2:=int(an2);
    //da nun schon beide Seiten zugeschlagen haben, ist der Spielzug direkt zuende und der Angreifer wechselt so direkt (siehe weiter unten)
    d:=d+1;
    //die neuen Gesamtattackenwerte auf Grund der neuen Modellanzahlen wird zu Beginn der Wiederholung berechnet
  end;

  //um darzustellen, das die Seite mit höherer Initiative (i1,i2) jetzt zugeschlagen hat, und als nächstes die Seite mit niedriger Initiative zuschlägt, werden einfach die beiden Initiativewerte vertauscht (falls beide Werte gleich sind hat es keine Auswirkungen)
  c:=i1;
  i1:=i2;
  i2:=c;

  //nach dem das Modell mit der niedrigeren Initiative zugeschlagen hat, ist die Nahkampfphase, und somit der Spielzug den Angreifers, zuende und der andere Spielen ist am Zug. er leitet nun den Nahkampf ein und somit bekommt er den Angreiferbonus von der einen Attacke im Normalfall. um dies darzustellen wechselt alle 2 Schläge (nachdem jede Seite einmal geschlagen hat) der Angreifer
  d:=d+1;
  if d=2 then
   begin
   if ifa1.checked=true then
    begin
     ifa1.checked:=false;
     ifa2.checked:=true;
     d:=0
     end else
   if ifa2.checked=true then
    begin
     ifa2.checked:=false;
     ifa1.checked:=true;
     d:=0
    end;
   end;

 //der Vorgang wird ab der Attackenberechnung wiederholt, bis einer oder beide Lebenspunkte 0 ist
 until (glp1<=0or (glp2<=0or (glp1<=0and (glp2<=0);

 //je nachdem wessem Lebenspunkte 0 (oder niedriger) sind, werden den Siegeszählern Punkte gutgeschrieben, prozentual umgerechnet und in die entsprechenden Felder eingetragen
  if (glp1<=0and (glp2<=0then
   unend:=unend+1 else
  if (glp1<=0and (glp2>=0then
   win2:=win2+1   else
  if (glp2<=0and (glp1>=0then
   win1:=win1+1;

  wins1.text:=floattostr(win1) + ' Siege';
  wins2.text:=floattostr(win2) + ' Siege';
  Unentschieden.text:=floattostr(unend);

  winpro2:=100/(win1+win2+unend)*win2;
  winspro2.text:=floattostr(winpro2) + '%';
  winpro1:=100/(win1+win2+unend)*win1;
  winspro1.text:=floattostr(winpro1) + '%';
  unendpro:=100/(win1+win2+unend)*unend;
  unentschiedenpro.text:=floattostr(unendpro) + '%';

  ProgressBar1.Max:=t;
  ProgressBar1.Position:=tb;

  //der Angreiferschalter wird auf die Ausgangsposition gesetzt
  if g=0 then
   begin
    ifa1.checked:=true;
    ifa2.checked:=false
   end else
  if g=1 then
   begin
    ifa2.checked:=true;
    ifa1.checked:=false
   end;

 //der komplette Vorgang ab dem reseten aller Werte wird so oft wie man es im entsprechenden Feld angegeben hat (t)
 until tb=t;

 //damit die Werte nicht manuell abgeändert werden müssen um einen neuen versuch zu starten wird die Anzahl (an1,an2) und die Gesamtattackenwerte (ga1,ga2) neu ermittelt
 anzahl1.text:=floattostr(uan1);
 anzahl2.text:=floattostr(uan2);

 If ifa1.Checked then ga1:=(ua1+pa1)*uan1
  else ga1:=ua1*uan1;
  gesamta1.text:=floattostr(ga1);
 If ifa2.Checked then ga2:=(ua2+upa2)*uan2
  else ga2:=ua2*uan2;
  gesamta2.text:=floattostr(ga2);
 
end;

end.



Wo sich das Problem ansich befindet habe ich auch schon ungefähr herausgefunden und zwar in diesem Bereich:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
  //haben beide Seiten einen identischen Initiativewert (i1,i2), werden erst Lebenspunktverluste beider Seiten berechnet und dann abgezogen (ein unentschieden ist z.B. möglich)
  else If i2=i1 then
   begin

    //Kampfgeschick (kg2,kg1) beider Seiten werden in der Kampfgeschicktabelle verglichen
    kgw1:=kgvskg(kg1,kg2);
    kgw2:=kgvskg(kg2,kg1);

    //mit den Gesamtattackenwerten (ga1,ga2) und den Werten aus der Kampfgeschicktabelle (kgw1,kgw2) wird ermittelt, wieviele Attacken der linken, und wieviel der rechten Seite einen Treffer gelandet haben (gakg1,gakg2)
    gakg1:=wurf(ga1,kgw1);
    gakg2:=wurf(ga2,kgw2);

    //Stärke der linken Seite Seite (s1) wird mit Widerstand (w2) der rechten Seite und Stärke der rechten Seite (s2) wird mit Widerstand (w1) der linken Seite in der Schadens-Widerstandstabelle verglichen
    sw1:=svsw(s1,w2);
    sw2:=svsw(s2,w1);

    //mit den Gesamtattackenwerten nach dem Kampfgeschicktest (gakg1,gakg2) und den Werten aus der Schadens-Widerstandstabelle (sw1,sw2) wird ermittelt, wieviele Attacken die linke Seite verwunden konnten (gas2) und wieviele dir rechte (gas1)
    gas1:=wurf(gakg1,sw1);
    gas2:=wurf(gakg2,sw2);

    //mit den Gesamtattackenwerten nach dem Stärke-Widerstandstest (gas1,gas2) und den Rüstungswerten (rw1,rw2) oder den Rettungswerten (rew1,rew2) beider Seiten wird ermittelt, wieviele der verwundenden Attacken nicht an der Rüstung, an Deckung ö.ä. abprallen und somit einen Lebenspunktberlust auf der linken bzw auf der rechten Seite verursachen (lpv1,lpv2)
    If rew2<=rw2 then lpv2:=gas1-wurf(gas1,rew2)
                 else lpv2:=gas1-wurf(gas1,rw2);
    If rew1<=rw1 then lpv1:=gas2-wurf(gas2,rew1)
                 else lpv1:=gas2-wurf(gas2,rw1);

    //die Lebenspunktverluste (lpv1,lpv2) werden von den Gesamtlebenspunkten abgezogen (glp1,glp2)
    glp2:=glp2-lpv2;
    glp1:=glp1-lpv1;

    //die Anzahl der Modelle (an1,an2) beider Seiten wird mithilfe der neuen Gesamtlebenspunktwerte (glp1,glp2) und den Lebenspunktewerten pro Modell (lp1,lp2) neu berechnet
    an1:=glp1/lp1;
    an2:=glp2/lp2;

    //um ungerade Anzahlen zu vermeiden wird ab einem Nachkommawert von über 0 aufgerundet, so auch hat ein Modell mit halber Lebenspunktanzahl immernoch den vollen Attackenwert
    b2:=frac(an1);
     if b2<>0 then an1:=int(an1)+1
              else an1:=int(an1);
    b1:=frac(an2);
     if b1<>0 then an2:=int(an2)+1
              else an2:=int(an2);
    //da nun schon beide Seiten zugeschlagen haben, ist der Spielzug direkt zuende und der Angreifer wechselt so direkt (siehe weiter unten)
    d:=d+1;
    //die neuen Gesamtattackenwerte auf Grund der neuen Modellanzahlen wird zu Beginn der Wiederholung berechnet
  end;


In diesem Fall werden die einzelnen Würfe zuerst links und dann rechts berechnet. Dreht man jedoch die Reihenfolge um, also so:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
  else If i2=i1 then
   begin

    kgw2:=kgvskg(kg2,kg1);
    kgw1:=kgvskg(kg1,kg2);

    gakg2:=wurf(ga2,kgw2);
    gakg1:=wurf(ga1,kgw1);

    sw2:=svsw(s2,w1);
    sw1:=svsw(s1,w2);

    gas2:=wurf(gakg2,sw2);
    gas1:=wurf(gakg1,sw1);

    If rew1<=rw1 then lpv1:=gas2-wurf(gas2,rew1)
                 else lpv1:=gas2-wurf(gas2,rw1);
    If rew2<=rw2 then lpv2:=gas1-wurf(gas1,rew2)
                 else lpv2:=gas1-wurf(gas1,rw2);

    glp1:=glp1-lpv1;
    glp2:=glp2-lpv2;

    an1:=glp1/lp1;
    an2:=glp2/lp2;

    b1:=frac(an2);
     if b1<>0 then an2:=int(an2)+1
              else an2:=int(an2);
    b2:=frac(an1);
     if b2<>0 then an1:=int(an1)+1
              else an1:=int(an1);
    d:=d+1;
  end;

...dann ist es nicht mehr die linke sondern die rechte Seite die bevorzugt wird und öfters gewinnt.
Ich habe keine Ahnung wieso sich das ganze so verhält und sehe da einfach keinen Sinn und Grund.

Ich hoffe ihr könnt mir helfen Leute, natürlich auch bei anderen Fehlerchen die noch eingebaut seien könnten! Ich geh sonst noch kaputt hierdrann!!

Bitte! Ihr müsst mir helfen!

mfg Fabian
Einloggen, um Attachments anzusehen!