Thread Punkterechnungsprogramm (8 answers)
Opened by DieZahl at 2017-07-22 13:13

Gast DieZahl
 2017-07-22 13:13
#187001 #187001
Hallo,

ich mache momentan einen kleinen Wettbewerb im Bekanntenkreis. Es geht dabei um ein Spiel. Die Regeln davon sind ganz simpel, wer die höchste Zeit hat gewinnt. Nun wollte ich dafür noch eine "Punkterechnungsprogramm" erstellen.

Die erste Version ist schon fertig:

Code: (dl )
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
#!usr/bin/perl -w

use 5.014;

my $time = <STDIN>

if ($time <= 49) {
my $result = $time / 1;
print "Time Points\n";
printf "%3f %3f\n", $time, $result;
} elsif ($time <= 99) {
my $result = $time / 2 * 1;
print "Time Points\n";
printf "%3f %3f\n", $time, $result;
} elsif ($time <= 199) {
my $result = $time / 3 * 2;
print "Time Points\n";
printf "%3f %3f\n", $time, $result;
} elsif ($time <= 299) {
my $result = $time / 4 * 3;
print "Time Points\n";
printf "%3f %3f\n", $time, $result;
} elsif ($time <= 500) {
my $result = $time / 5 * 4;
print "Time Points\n";
printf "%3f %3f\n", $time, $result;
}


Das Prinzip dorthinter ist ziemlich einfach und zwar gibt es 5 Klassen in die, die Zeit eingeordnet werden kann. Z.b. habe ich eine Bestzeit von 130 sek. . Somit lande ich in der 3. Klasse. Wenn ich das nun weiss nehme ich 130 / 3 (wegen der 3 Klasse) * 2 (zwischen 0 und 3 sind zwei Klassen (runtergezählt)). Das wären dann ~86,7 Punkte.
Nun da ich das ganze Skript etwas lang finde und ich den Hochwassermarkenalgorithmus kenne, dachte ich mir, das ich mit ein par Änderungen am Algorithmus das selbe Ergebnis erzielen konnte. Hier mal mein momentaner Algorithmus (Kommentare sind unter Skript, wegen Platzmangel):

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!usr/bin/perl -w

use 5.014;

my $t = <STDIN>;
my $classmax = &clm($t, 49, 99, 199, 299, 500);

sub clm {
my($c) = shift @_;
if (@_ != 5) {
print "Something went wrong";
foreach (@_) {
if ($c < $_) {
my(@div) = shift @_;
} elsif ($c > $_) {
my $divi = @div;
my $re1 = $t / $divi;
my $zre = $divi - 1;
my $re2 = $re1 * $zre;
print "Your points are $re2\n";
}
}
}
}


Jedes Kommentar steht für eine Zeile, die Kommentare beginnen bei der Eingabe, sry das es so ist sieht sonst unübersichlich aus:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#Erspielte Zeit wird eingegeben.
#Das erste Argument ist die erspielte Zeit die in $t gespeichert wurde.
#$c wird auf den Wert $t (<STDIN>) gesetzt, indem $t als 1. Argument für die Subroutine zur Verfügung gestellt wird.
#Die Anweisung überprüft auf die Vollständigkeit der Argumente.
#Fals etwas nicht der Überprüfung entspricht wird eine Warnung ausgegeben.
#Nun werden die restlichen Argumente ("Klassen 1-5 ($_[1]..$_[5])") genommen.
#Jetzt wird jedes Element aus @_ mit $c (der Wert von $t (<STDIN>)9 verglichen.
#Wert $_ aus @_ wird zu @div hinzugefügt, wenn $c kleiner als $_ ist um später den Divisor im skalaren Kontext zu ermitteln.
#Wenn nun $c ($t) größer ist als $_ soll gerechnet werden.
#Divisor wird nun aus @div (von vorher) ermittelt (skalarer Kontext).
#result1 (re1) resultiert aus $t (<STDIN>/Dividend) durch den divisor.
#$zre ist ein Zwischenergebnis um auf den Faktor zu kommen
#result2 (re2/Produkt) ergibt sich aus $re2 (faktor1) und $zre (faktor2)
#$re2/mein Ergebnis wird ausgegeben und "sichtbar gemacht".


Mein Problem ist jetzt das gar keine Ausgabe kommt. Ich tippe meine Zeit ein und es passiert einfach nichts. Keine Warnung wegen der Syntax, keine Warnung von meiner "Argumentüberprüfung", einfach nichts. Ich sehe nur meine Zeit die ich eingetippt habe. Ich glaube das Problem liegt irgendwo bei der foreach-schleife...das ganze ist auch ziemlich umständlich gemacht...meine Idee vorher:

Bei Ermittlung von dem Divisor habe ich vorher probiert herauszufinden wie ich die Schleifendurchläufe zählen kann und in einer variable als Skalar zu speichern..das hätte die Sache ja einfacher gemacht und gekürzt. Beispiel:
Die Schleife prüft ob die Zeit <= als 99, 199 ist, ist das der Fall würde die Zahl durch die Anzahl der gezählten Schleifendurchläufe geteilt werden.
Also müsste ich das Programm während der Laufzeit aufzeichnen..also die Schleifedurchläufe?

Nunja wiegesagt wenn ich eine Ausgabe wenigstens aus dem jetztigen Alg. bekommen würde, dann wäre das schon mal eine große Hilfe für mich. Wenn jmd. Ideen zum "Schleifendurchlaufszähler" hat, dann wäre ich ganz neugierig :). Vlt. gibt es dazu eine Dokumentation oder einen ähnlichen Thread? Nur ich weiss nicht was ich als Schlagworte für die Suche eingeben soll.

Grüße DieZahl.
Last edited: 2017-07-22 13:19:17 +0200 (CEST)

View full thread Punkterechnungsprogramm