Seite 1 von 1

Online Highscore (für Online Spiele)

Verfasst: Mittwoch 24. Juni 2009, 17:28
von krisi12345
HI!

WAS?
Der Skript erzeugt einen kleinen Highscore mit 10 Platzierungen. Die ersten drei sind in Gold-Silber und Bronze gefärbt.

WO ZU?
Den Skript kann man in Online Spielen einstzen.

WOHER
Die Daten für die Platzierungen kommen von:
http://pc-tutos.de/test.hsd

Code: Alles auswählen

import urllib
from Tkinter import *
nr = 0
nr1 = 0
nr2 = 1
nr3 = 0
nr4 = 1
nr5 = 0
data = urllib.urlopen("http://pc-tutos.de/test.hsd")
data1 = data.read()
data2 = data1.split(" ")
liste = [["#FFD800","1."],["#A5A5A5","2."],["#C65C00","3."],["black","4."],["black","5."],["black","6."],["black","7."],["black","8."],["black","9."],["black","10."]]
fenster = Tk()
fenster.title("HighScore")
fenster.geometry("170x350")
for i in range(10):
  lab = Label(fenster,text=liste[nr5][nr4] + data2[nr],fg=liste[nr5][nr3],font = ("arial",19,"bold"))
  lab.place(x=3,y=nr1)
  nr = nr + 1
  nr1 = nr1 + 34
  nr5 = nr5 + 1
fenster.mainloop()
Ich hab den Skript schnell geschrieben und deswegen hat er vieleicht ein paar Fehler, wer will kann Ihn verbessern. :wink:

Verfasst: Mittwoch 24. Juni 2009, 18:01
von jonas
Wie wäre es mit Punktanzeige dahinter?
Und bitte pack das ganze doch in eine/mehrere Funktionen,
denn Code auf Modulebene ist doof!
Desweiteren ist deine `liste` um einiges zu lang (>80 Zeichen).
Ansonsten denke ich keine schlechte Idee,
aber bei der Umsetzung haperts doch noch...
Lg, Jonas 8)

Verfasst: Mittwoch 24. Juni 2009, 18:03
von krisi12345
Und bitte pack das ganze doch in eine/mehrere Funktionen,
denn Code auf Modulebene ist doof!
Lesen!!! :wink:
Ich hab den Skript schnell geschrieben und deswegen hat er vieleicht ein paar Fehler, wer will kann Ihn verbessern.

Verfasst: Mittwoch 24. Juni 2009, 18:05
von krisi12345
Und in meinem Skript gehts darum das ein von einem Server stammender Highscore gelesen wird und dann auch richtig verarbeitet wird.

Verfasst: Mittwoch 24. Juni 2009, 18:15
von numerix
krisi12345 hat geschrieben:
Und bitte pack das ganze doch in eine/mehrere Funktionen,
denn Code auf Modulebene ist doof!
Lesen!!! :wink:
Ich hab den Skript schnell geschrieben und deswegen hat er vieleicht ein paar Fehler, wer will kann Ihn verbessern.
Hä? Das war doch ein vernünftiger Verbesserungsvorschlag. Oder meinst du mit "verbessern": "Macht die Verbesserung gleich selbst" ?

Verfasst: Mittwoch 24. Juni 2009, 18:18
von krisi12345
O.K. entschuldigung, hab seine Antwort wohl falsch gelesen. :oops:

Verfasst: Mittwoch 24. Juni 2009, 18:29
von BlackJack
Mein Verbesserungsvoraschlag wäre: Wegwerfen und neu schreiben.

• Ohne ""durchnummerierte" Namen,
• ohne statische Daten, die sich ganz einfach berechnen lassen, wie die Platznummern,
• mit vernüftigen Namen, bei denen man auch erahnen kann, was die Bedeutung der daran gebundenen Objekte ist,
• ohne vorgegebene Fenstergrösse,
• und ohne `place()`,
• ohne unnötige Indexzugriffe auf Listen.

Verfasst: Mittwoch 24. Juni 2009, 18:32
von krisi12345
ohne vorgegebene Fenstergrösse,
Der Skript ist absichtlich für 10 Platzierungen gedacht.
Wenns mehr sind könnte man ja mehrere Seiten einbauen.

Verfasst: Mittwoch 24. Juni 2009, 18:39
von Hyperion
Auch wenn's vermutlich Perlen vor die Säue werfen ist (Dir wurde schon oft das Tutorial empfohlen ;-) ):

nr, nr1, ... ist doch eine schlechte Idee! Wieso keine Liste oder Tupel?

Code: Alles auswählen

nr = (0, 0, 1, 0, 1, 0)
Aber dieses Konstrukt ist eh überflüssig (s.u.)

Das hier ...

Code: Alles auswählen

data = urllib.urlopen("http://pc-tutos.de/test.hsd")
data1 = data.read()
data2 = data1.split(" ")
... kann man zusammenfassen:

Code: Alles auswählen

data = urllib.urlopen("http://pc-tutos.de/test.hsd").read().split()
Auch hier ist ein data1, data2 sinnfrei (zumal du die Zwischenschritte dann ja wegwirfst).

Deine Liste zur Farbbestimmung ist nicht unbedingt die beste Wahl imho. Da wäre wohl ein dict besser:

Code: Alles auswählen

color_map = {
    1: "#FFD800",
    2: "#A5A5A5",
    3: "#C65C00"
}
Damit kannst Du dann leicht die Farben abfragen:

Code: Alles auswählen

In [4]: color_map.get(1, "black")
Out[4]: '#FFD800'

In [5]: color_map.get(2, "black")
Out[5]: '#A5A5A5'

In [6]: color_map.get(5, "black")
Out[6]: 'black'
Wenn im dict nichts zu finden ist, kannst Du Dir eben einen Alternativ-Wert angeben; in diesem Falle eben "black".

Die Label kannst Du dann wie folgt eintragen:

Code: Alles auswählen

In [50]: players = ["Christian", "Leo", "Michi", "Daniel", "Andi"]

In [53]: for index, player in enumerate(players, 1):
    print index, player, color_map.get(index, "black")
   ....:
1 Christian #FFD800
2 Leo #A5A5A5
3 Michi #C65C00
4 Daniel black
5 Andi black

Wie gesagt, sind alles Dinge, die man aus dem Tutorial lernen kann. Es ist schon wichtig, sich mit den grundlegenden Datenstrukturen auszukennen. Dazu gehören eben Listen und Dictionaries; und dazu natürlich die Methoden und Operationen, die damit möglich sind.

Verfasst: Mittwoch 24. Juni 2009, 18:47
von BlackJack
@krisi12345: Für wieviele Einträge das Fenster gedacht ist, ist völlig egal, man sollte die Grösse nicht fest vorgeben. Wenn man kein `place()` verwendet, sondern einen ordenlichen Layout-Manager, dann passt sich die Fenstergrösse automatisch dem Inhalt an.

Code: Alles auswählen

#!/usr/bin/env python
import Tkinter as tk
import urllib
from itertools import chain, count, izip, repeat

HIGHSCORE_URL = 'http://pc-tutos.de/test.hsd'

def main():
    colors = chain(['#FFD800', '#A5A5A5', '#C65C00'], repeat('black'))
    names = urllib.urlopen(HIGHSCORE_URL).read().split()
    root = tk.Tk()
    root.title('HighScore')
    for place, color, name in izip(count(1), colors, names):
        tk.Label(root,
                 text='%2d. %s' % (place, name),
                 foreground=color,
                 font=('arial', 19, 'bold')).pack(anchor=tk.W)
    root.mainloop()

if __name__ == '__main__':
    main()

Verfasst: Mittwoch 24. Juni 2009, 18:56
von Hyperion

Code: Alles auswählen

colors = chain(['#FFD800', '#A5A5A5', '#C65C00'], repeat('black')) 
Hey, über so was hatte ich auch nachgedacht - auf so etwas geniales bin ich nicht gekommen. Muss ich mir mal merken :-)