ELO-Ranglistensystem?

breytex

Mitglied
Hallo zusammen!

Ich suche ein PHP-Elo-Ranglistensystem für einen Snookerverein.
Vielleicht kennt Ihr sowas ja aus dem Schach...

Habe bei google nichts vernünftiges Gefunden.
Kennt da jemand ein funktionierendes System?
Es sollte eine Rangliste für ca 50 Spieler enthalten, die mit einem Rating durch den Verlauf der Matches "bewertet" werden.

Hoffe, da gibts was :)
Freue mich über Tipps.
Liebe Grüße!
 

ikosaeder

Teekannen-Agnostiker
Dann schreib doch mal genauer, was du suchst.
Ich würde so vorgehen, eine SQL Datenbank, die Spieler mit dem Elo enthält. Eine PHP-Funktion, die durch Eingabe von 2 Spielernamen und dem Ergebniss wer gewonnen hat den Elo ausliest und einen neuen Elo berechnet, ein (passwort geschütztes) Formular für die Eingaben und eine php skript, das eine Tabelle mit Spielernamen sortiert nach Elo ausgibt.
 

ikosaeder

Teekannen-Agnostiker
Ich habe heute auf der Zugfahrt ein bisschen gebastelt:
Mit diesem kleinen Pythonscript kannst du dir ein Ranking erzeugen.
Ich habe eine kleine Datenbank mit einer Tabelle spieler. Die Tabelle enthält den Namen und den ELO-Wert
also:
| uname | elo |

Das Skript liest dann aus einer Textdatei die Ergebnisse.

Die Datei enthält in jeder Zeile ein Ergebnis der Form: SpielerA SpielerB Erg
z.B.:
one two 1
two four 2
three one 0
four one 1
four three 2
three two 1

Das Ergebnis 1 bedeutet SpielerA hat gewonnen, 2 bedeutet SpielerB hat gewonnen und jedes andere Ergebnis bedeutet unentschieden.
Für jedes Ergebnis werden dann die beiden ELO -Werte aus der Datenbank geholt, nach der Formel von Wikipedia neu berechnet und in die Datenbank zurückgeschrieben. Am Ende gibt es alle Spieler sortiert nach ELO aus.
Python:
#!usr/bin/python
import sqlite3
import sys
import math
def getELO(u1,c):
  c.execute("""select elo from spieler where uname =? """,(u1,))
  x=c.fetchone()
  return x[0]
def setELO(u1,elo1,c):
  c.execute("""update spieler set elo=? where uname=?""",(elo1,u1))
  return 0
def calcELO(u1,u2,elo1,elo2,erg):
#Basiert auf der ELO Berechnung der Wikipedia
  dR=min(elo1-elo2,400)/400
  Ea=1/(1+math.pow(10,dR))
  print Ea
  if(int(erg)==1):
    print 'winone'
    Sa1=1
    Sa2=0
  elif(int(erg)==2):
    print 'wintwo'
    Sa1=0
    Sa2=1
  else:
    print 'draw'
    Sa1=0.5
    Sa2=0.5
  elo1=elo1+k*(Sa1-Ea)
  print elo1
  elo2=elo2+k*(Sa2-Ea)
  print elo2
  return elo1,elo2
  
def readResultlist(name):
    try:
        ResListHandle=open(name,'rU')
    except:
        print('Could not read Resultlist '+filename+' check path and permissions!')
        return -1
    ResList=ResListHandle.readlines()
    for j in ResList:
        a=j.split()
        u1.append(a[0])
        u2.append(a[1])
        res.append(int(a[2]))
        ResListHandle.close()
    return 0
if __name__ == '__main__':
# Init variables
  filename=sys.argv[1]
  database=sys.argv[2]
  k=15
  u1=[]
  u2=[]
  res=[]
  elo1=0
  elo2=0
# Read results
  readResultlist(filename)
# Open db connection
  db= sqlite3.connect(database) 
  c=db.cursor()
  for i in range(len(u1)):
    elo1=getELO(u1[i],c)
    elo2=getELO(u2[i],c)
    print elo1,elo2
    x=calcELO(u1[i],u2[i],elo1,elo2,res[i])
    print x
    a=setELO(u1[i],x[0],c)
    b=setELO(u2[i],x[1],c)
    db.commit()
  c.execute("""select * from spieler order by elo desc""")
  y=c.fetchall()
  print y
  db.close()

Du kannst die Werte einfach mit PHP wieder auslesen und in eine Webseite integrieren, bzw das ganze Skript nach PHP portieren.
Den Code oben kannst du nach Belieben verwenden, ich habe ihn grob getestet, aber halt so gut wie keine Fehlerabfragen oder Formatierung der Ausgaben drin. Ich gebe auch keinen Support außer meinen Beiträgen hier.