Om nah hoo pez nyeetz, Whouzuo!
> > {Var.2}
> >
> > gewinn := check[min(h,c),max(h,c)] * sgn(h-c);
> >
> > case gewinn of
> > -1: {verloren}
> > 0: {unentschieden}
> > 1: {gewonnen}
> > end;
Man benötigt tatsächlich nur eine Zeile Quelltext mehr, die aber 3 Funktionsaufrufe enthält.
Ich verstehe jetzt das zweite Beispiel nicht. Wieso hier objektorientiert nicht einfach karte1.compareTo(karte2) mittels Compare Interfaces oder aber gewinner = check(karte1, karte2)
?
Der wirkliche check führt dann natürlich entsprechend die Funktion aus und negiert sie ggf. aber für den Aufrufer ist das eine blackbox, der soll davon gar nichts sehen.
Das ist die Funktion, die genau das tut, wenn das Array reduziert ist. h und c sind IDs für karte1 und karte2. h steht in der Zeile, c in der Spalte
Also mal so
Das Array heißt check
1=Stein, 2=Schere, 3=Papier
ausführlich reduziert mit Diagonale
| 1 | 2 | 3 | 1 | 2 | 3
--------------------- ---------------------
1 | 0 | 1 | -1 1 | 0 | 1 | -1
2 | -1 | 0 | 1 2 | | 0 | 1
3 | 1 | -1 | 0 3 | | | 0
Wenn das Array reduziert wird, gibt es nur noch Einträge check[h,c] mit h ≤ c.
Deshalb also der Aufruf check[min(h,c),max(h,c)]. Ist jetzt aber h > c, muss ich den Wert, der im Array steht, mit -1 multiplizieren. sgn liefert das Vorzeichen einer Zahl also -1 für c-h falls h > c, 0 falls h = c und 1 falls h < c.
Das heißt, die gewünschte Zahl ist check[min(h,c),max(h,c)] * sgn(c-h). Hier wäre ein Fehler in dem, was ich heute morgen mal eben schnell gepostet habe.
Matthias