5
0
mirror of https://github.com/AJMicke/KickerELO.git synced 2026-03-11 13:31:02 +01:00

Use progressbars for winrates

This commit is contained in:
Anton Micke
2025-05-11 00:39:00 +02:00
committed by AJMicke
parent f38b5b952f
commit 2e5a418986
3 changed files with 47 additions and 22 deletions

View File

@@ -11,4 +11,8 @@ public interface Ergebnis2vs2Repository extends JpaRepository<Ergebnis2vs2, Long
int countByGewinnerVorn(Spieler gewinnerVon);
int countByVerliererHinten(Spieler verliererHinten);
int countByVerliererVorn(Spieler verlierVon);
int countByGewinnerVornOrGewinnerHinten(Spieler gewinnerVon, Spieler gewinnerHinten);
int countByGewinnerVornOrGewinnerHintenOrVerliererVornOrVerliererHinten(Spieler gewinnerVon, Spieler gewinnerHinten,
Spieler verliererVon, Spieler verliererHinten);
}

View File

@@ -1,14 +1,11 @@
package org.kickerelo.kickerelo.service;
import org.kickerelo.kickerelo.data.Spieler;
import org.kickerelo.kickerelo.exception.NoSuchPlayerException;
import org.kickerelo.kickerelo.repository.Ergebnis2vs2Repository;
import org.kickerelo.kickerelo.repository.SpielerRepository;
import org.kickerelo.kickerelo.util.Position;
import org.springframework.stereotype.Service;
import java.util.Optional;
@Service
public class Stat2vs2Service {
Ergebnis2vs2Repository ergebnis2vs2Repository;
@@ -34,12 +31,12 @@ public class Stat2vs2Service {
wins = 0;
losses = 0;
}
return (float) (100 * wins) / (wins+losses);
return (float) wins / (wins+losses);
}
public Float getWinrate(String playerName, Position p) {
Optional<Spieler> spieler = spielerRepository.findByName(playerName);
if (spieler.isEmpty()) throw new NoSuchPlayerException(playerName);
return getWinrate(spieler.get(), p);
public Float getFrontRate(Spieler s) {
int numFront = ergebnis2vs2Repository.countByGewinnerVornOrGewinnerHinten(s, s);
int numAll = ergebnis2vs2Repository.countByGewinnerVornOrGewinnerHintenOrVerliererVornOrVerliererHinten(s, s, s, s);
return (float) numFront / numAll;
}
}

View File

@@ -2,8 +2,10 @@ package org.kickerelo.kickerelo.views;
import com.vaadin.flow.component.combobox.ComboBox;
import com.vaadin.flow.component.html.H2;
import com.vaadin.flow.component.html.Paragraph;
import com.vaadin.flow.component.html.NativeLabel;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.component.progressbar.ProgressBar;
import com.vaadin.flow.component.progressbar.ProgressBarVariant;
import com.vaadin.flow.router.Route;
import org.kickerelo.kickerelo.data.Spieler;
import org.kickerelo.kickerelo.service.KickerEloService;
@@ -16,27 +18,49 @@ public class Stat2vs2View extends VerticalLayout {
KickerEloService kickerEloService;
H2 subheading;
ComboBox<Spieler> selector;
Paragraph winrateBack;
Paragraph winrateFront;
ProgressBar frontRate = new ProgressBar();
NativeLabel frontRateText = new NativeLabel();
ProgressBar winRateFront = new ProgressBar();
NativeLabel winRateFrontText = new NativeLabel();
ProgressBar winRateBack = new ProgressBar();
NativeLabel winRateBackText = new NativeLabel();
public Stat2vs2View(Stat2vs2Service service, KickerEloService kickerService) {
this.stat2vs2Service = service;
this.kickerEloService = kickerService;
subheading = new H2("2 vs 2 Ergebnis");
selector = new ComboBox<>("Spieler");
selector.setItems(kickerService.getSpielerEntities());
selector.addValueChangeListener(event -> {
updateData(selector.getValue());
});
winrateBack = new Paragraph("");
winrateFront = new Paragraph("");
add(subheading, selector, winrateBack, winrateFront);
selector.addValueChangeListener(event -> updateData(selector.getValue()));
add(subheading, selector, frontRateText, frontRate, winRateFrontText, winRateFront, winRateBackText, winRateBack);
}
private void updateData(Spieler s) {
Float rateBack = stat2vs2Service.getWinrate(s, Position.BACK);
Float rateFront = stat2vs2Service.getWinrate(s, Position.FRONT);
winrateBack.setText("Winrate hinten: " + (rateBack.isNaN() ? "-" : rateBack));
winrateFront.setText("Winrate vorne: " + (rateFront.isNaN() ? "-" : rateFront));
updateFrontRate(s);
updateFrontWinrate(s);
updateBackWinrate(s);
}
private void updateFrontRate(Spieler s) {
String text = "Anteil Spiele vorne: ";
Float rateFrontGames = stat2vs2Service.getFrontRate(s);
frontRate.setValue(rateFrontGames);
frontRateText.setText(rateFrontGames.isNaN() ? text + "-" : text + String.format("%.2f", rateFrontGames * 100) + "%");
}
private void updateFrontWinrate(Spieler s) {
String text = "Winrate vorne: ";
Float winRate = stat2vs2Service.getWinrate(s, Position.FRONT);
winRateFront.setValue(winRate);
winRateFront.addThemeVariants((winRate > 0.5f ? ProgressBarVariant.LUMO_SUCCESS : ProgressBarVariant.LUMO_ERROR));
winRateFrontText.setText(winRate.isNaN() ? text + "-" : text + String.format("%.2f", winRate * 100) + "%");
}
private void updateBackWinrate(Spieler s) {
String text = "Winrate hinten: ";
Float winRate = stat2vs2Service.getWinrate(s, Position.BACK);
winRateBack.setValue(winRate);
winRateBack.addThemeVariants((winRate > 0.5f ? ProgressBarVariant.LUMO_SUCCESS : ProgressBarVariant.LUMO_ERROR));
winRateBackText.setText(winRate.isNaN() ? text + "-" : text + String.format("%.2f", winRate * 100) + "%");
}
}