[software_challenge] v0001 nochmal

  • From: Jan Niemeyer <nebu@xxxxxxxxx>
  • To: software_challenge@xxxxxxxxxxxxx
  • Date: Mon, 29 Oct 2007 22:24:16 +0100

Hallo,

da einigen noch die letzte Version meines Python-Clients fehlt, habe ich
sie nochmal angehängt. Um Chaos zu vermeiden wäre ich dafür, dass ihr
eure neueste Version direkt an mich sendet und ich eure Änderungen dann
einpflegen kann. Ich teste den dann, erhöre die Versionsnummer und lade
einen 'stabilen' Client hoch. Ach, und den Client bitte nach Möglichkeit
in UTF-8 speichern.

Übrigens fehlt uns noch ein Name für den Spieler..

Gruß,
    Jan
# -*- coding: utf-8 -*-

import socket
import os
import string
import numeric

log_datei = "client_log.txt"

spieler_nummer = 0

spieler_steine = []

# das spielfeld
spielfeld = arrayrange(121)
spielfeld.shape = (11,11)

# eine Liste, die wiederum zwei Listen enthält. Die erste enthält die 6 
Punktestände des Spielers, die zweite die des Gegners
punktestand = []

port = 10500

zuege = 0

class Logger:
        """ Dient der Speicherung von Logdateien """
        def __init__(self, datei):
                self.datei = open(datei, 'w')
                
        def eintrag(self, meldung):
                self.datei.write(meldung+"\n")
                self.datei.flush()
                os.fsync(self.datei)

class Netzwerk:
        """ Stellt Funktionen zum Verbinden, Senden, Empfangen und SchlieÃ?en 
von Verbindungen bereit """
        def __init__(self, port):
                self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        
        def verbinden(self):
                self.s.connect(("localhost", port))
                
        def beenden(self):
                self.s.close()
                
        def zug(self):
                self.nachricht = self.s.recv(4096)
                if self.nachricht != 0:
                        self.liste_serverstrings = string.split(self.nachricht, 
"\n")
                        self.liste_serverstrings.pop( 
len(self.liste_serverstrings)-1)
                        self.liste_instanzen = 
self.messagehandler(self.liste_serverstrings)
                        return self.liste_instanzen
                else:
                        print 'Leerer Zug'
                        
        def senden(self):
                pass
                        
        def messagehandler(self, serverstrings):
                """ Nimmt einen Serverstring an und gibt eine Instanz zurück 
                
                Diese Methode nimmt den Serverstring an
                und ermittelt anhand der ersten Ziffer eine
                passende Klasse. Dieser wird dann die Servernachricht
                übermittelt und die entstehende Instanz
                wird an Netzwerk zurückgegeben """
                
                self.liste_instanzen = []
                for nachricht in serverstrings:
                        if nachricht[0] == "0":
                                # Server wurde gestartet
                                print "0: " + nachricht
                                self.liste_instanzen.append( 
SpielInit(nachricht) )
                        elif nachricht[0] == "1":
                                # Steine vom Server erhalten
                                print "1: " + nachricht
                                self.liste_instanzen.append( Steine(nachricht) )
                        elif nachricht[0] == "2":
                                print "2: " + nachricht
                                # Brett vom Server erhalten
                                self.liste_instanzen.append( Brett(nachricht) )
                        elif nachricht[0] == "3":
                                # Zug wird angefordert
                                self.liste_instanzen.append( Zug(nachricht) )
                        elif self.nachricht[0] == "4":
                                # neuen Spiel-Stand erhalten
                                self.liste_instanzen.append( 
Spielstand(nachricht) )
                        elif self.nachricht[0] == "5":
                                # neue Informationen zu den Steinen erhalten
                                pass
                        elif self.nachricht[0] == "6":
                                # Frage, ob die Steine gewechselt werden sollen
                                pass
                        elif self.nachricht[0] == "7":
                                # wird nicht benutzt
                                pass
                        elif self.nachricht[0] == "8":
                                # Server-Neustart
                                spiel_laufend = False
                                log.eintrag("Server wurde neugestartet")
                        elif self.nachricht[0] == "9":
                                # Server runtergefahren
                                netzwerk.beenden()
                                log.eintrag("Server wurde beendet")
                                exit()
                return self.liste_instanzen
                        
class SpielInit:
        """ Wird einmalig zu Beginn des Spiels aufgerufen
        
        Wertet nur den ersten String
        auf die eigene Spielernumme aus """
        def __init__(self, nachricht):
                self.n = nachricht
        
        def handle_message(self):
                spieler_nummer = self.n[3]
                log.eintrag("Spiel wurde initialisiert\n\t*Spielernummer 
erhalten")
                
# Für die Steine auf der Hand verantwortlich
class Steine:
        def __init__(self, nachricht):
                self.n = nachricht.strip()
        
        def handle_message(self):
                log.eintrag("Steine erhalten")
                self.i=0
                for x in range(6):
                        self.temp_liste = []
                        self.temp_liste.append(self.n[self.i])
                        self.i=self.i+2
                        self.temp_liste.append(self.n[self.i])
                        spieler_steine.append(self.temp_liste)
                log.eintrag("Steine eingelesen: " + str(spieler_steine) )
                        
        def update(self):
                pass
                
# Aktualisiert das Brett
class Brett:
        def __init__(self, nachricht):
                self.n = nachricht
                
        def handle_message(self):
                log.eintrag("Neues Brett erhalten")
                
# Aktualisiert und pflegt die Spielstände
class Spielstand:
        def __init__(self, nachricht):
                self.n = nachricht
                
        def handle_message(self):
                log.eintrag("Neuen Spielstand erhalten")
                for ziffer in self.n:
                        if ziffer != ' ':
                                punktestand[0].append(ziffer)
                print punktestand[0]
                
class Spielfeld:
        def __init__(self, nachricht):
                self.n = nachricht
                
        def handle_message(self):
                        
                
# Die Klasse, die den angeforderten Zug errechnet               
class Zug:
        def __init__(self, nachricht):
                self.n = nachricht
        
        def handle_message(self):
                log.eintrag("Neuer Zug")
                
        def auswertung(self):
                # mit der Zug-Aufforderung erhält man auch die vorangegangen 
Züge des Gegners
                # jene sollen an dieser Stelle ausgewertet werden
                pass
                
# Die zentrale Endlosschleife
while True:
        
        log = Logger(log_datei)
        log.eintrag("*** Einfach Genial - Spiel ***")

        netzwerk = Netzwerk(port)
        netzwerk.verbinden()
        
        spiel_laufend = True
        
        while spiel_laufend == True:
                
                # jede der zurückgegebenen Instanzen hat eine Methode namens 
'handle_message'
                liste_instanzen = netzwerk.zug()
                for instanz in liste_instanzen:
                        instanz.handle_message()

Other related posts:

  • » [software_challenge] v0001 nochmal