4gewinnt projekt

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
icepacker
User
Beiträge: 49
Registriert: Dienstag 15. November 2005, 18:48

Hallo
Ich bin dabei ein 4gewinnt Spiel zu programmieren.
Das kleine Projekt ist in vier Phasen unterteilt:
- Funktionierende Minimallösung
- Netwerkunterstützung
- GUI
- Computerspieler(KI)

Bis jetzt habe ich die ersten beiden Punkte implementiert, poste es aber hier
jetzt schon da mich zwei Sachen brennend interessieren bevor ich weiter mache.

1) Suchalgorithmus/Gewinnüberprüfung - 4 Steine in einer Reihe:
(Auschnitt aus dem Programm, siehe weiter unten)

Code: Alles auswählen

def check_win(self, player):
        # horizontal
        for row in range(self.rows):
            count = 0
            for col in range(self.cols):
                if self.board[row][col] == player:
                    count += 1
                    if count == self.connect_n: return player
                else: count = 0
        # vertical
        for col in range(self.cols):
            count = 0
            for row in range(self.rows):
                if self.board[row][col] == player:
                    count += 1
                    if count == self.connect_n: return player
                else: count = 0
        # diagonal        
        for row in range(self.rows-self.connect_n+1):
            for col in range(self.cols-self.connect_n+1):
                count1, count2 = 0, 0  
                for i in range(self.connect_n):
                    count1 += (self.board[row+i][col+i] == player)
                    count2 += (self.board[row+i][col+self.connect_n-1-i] ==
                                  player)
                if count1 == self.connect_n or count2 == self.connect_n:
                    return player
Findet jemand noch eine bessere Lösung?
Besser unter den Eigenschaften schneller, kürzer, verständlicher, pythonischer usw.

2) Der Netzwerkteil
Das ist mein erster Versuch mit Netzwerken.
Ich habe versucht Server und Client in eine Datei zu packen. Was einem
sofort Aufällt, ist der immernoch Redundante Code, sprich ich habe versucht
Server und Client möglichst ähnlich zu machen um doppelten Code
zu vermeiden.
Lässt sich dies noch besser Lösen? Vielleicht auch durch die Verwendung
eines anderen Moduls anstatt socket, eventuell xml-rpc? Bitte um Ratschläge
von euch!

So jetzt noch der komplette Code:
(leider sind die Basisklassen noch nicht komplett gleich, sondern mussten
für die Netzwerkunterstützung noch ein bisschen geändert werden)
4gewinnt - minimal
4gewinnt - netzwerk

Sonstige Kritik, Fehlfunktionen und sonstiges ist natürlich auch erwünscht.
Danke im Voraus.
Gruß icepacker
ubuntu linux !!
BlackJack

Der Vergleich von `count` und `self.connect_n` sollte nicht auf Gleichheit sondern ``>=`` testen. Soweit ich weiss gewinnt man auch, wenn man mehr als 4 in einer Reihe hat. :-)
Benutzeravatar
Luzandro
User
Beiträge: 87
Registriert: Freitag 21. April 2006, 17:03

BlackJack hat geschrieben:Der Vergleich von `count` und `self.connect_n` sollte nicht auf Gleichheit sondern ``>=`` testen. Soweit ich weiss gewinnt man auch, wenn man mehr als 4 in einer Reihe hat. :-)
Macht aber keinen Unterschied, da das komplette Feld abgesucht wird und bei mind. 4 abgebrochen wird - eigenartiger an der Funktion finde ich den Rückgabewert: es wird ein Player übergeben, und wenn dieser 4 in einer Reihe hat, wird wieder dieser Player zurückgegeben und sonst nichts?
[url=http://www.leckse.net/artikel/meta/profilieren]Profilieren im Netz leicht gemacht[/url]
Redprince
User
Beiträge: 128
Registriert: Freitag 22. Oktober 2004, 09:22
Wohnort: Salzgitter
Kontaktdaten:

Moinsen...
Durch Zufall habe ich diesen Thread gefunden, habe Anfang des Monats auch eine "Vier Gewinnt"-Umsetzung begonnen, allerdings mit stark anderem Ansatz:

Geplant ist neben Netzwerkfähigkeit die Möglichkeit, zwischen verschiedenen GUI (Tkinter, wxWidgets, plain text, ..) zu wählen, zudem auch Ansätze zur Variation.
Hierfür habe ich erst einmal eine GameMatrix umgesetzt, welche bezüglich Höhe, Breite, aber auch in der Anzahl der Steine, die zum Gewinn benötigt werden, flexibel ist. Die Prüfroutine habe ich noch nicht geschrieben, dafür habe ich ein wenig an der GUI beginnend mit Tkinter gebastelt und ein MatrixFrame erstellt, welches im einzelnen aus Frames mit Label & Bild als Spielstein besteht (ItemFrames, in ColFrames zusammengefasst und im MatrixFrame zusammengeführt, das Methoden zum Setzen und Löschen der Steine bereitstellt).

Im Großen und Ganzen also noch keine programmiertechnische Leistung, eher eine Idee. Wie ich die Einheit umsetze, welche die GameMatrix und die verschiedenen GUI zusammenbringt, ist mir mehr oder minder noch schleierhaft, allerdings wollte ich gern einen Kommentar zu meinem bisherigen Vorgehen erhalten. Gemeint ist hierbei weniger meine willkürliche Reihenfolge im Schreiben der einzelnen Klassen, sondern eher meine grundsätzliche Idee zur Umsetzung des Problems.

Habe ich mich Designtechnisch völlig verrannt, oder ist meine Struktur verfolgenswert?
abgdf

Eine Frage zur GUI: Willst Du ein Toolkit oder lieber Pygame verwenden ?

Viele Grüße
Redprince
User
Beiträge: 128
Registriert: Freitag 22. Oktober 2004, 09:22
Wohnort: Salzgitter
Kontaktdaten:

Im Moment werkel ich mit Tkinter, aber da ich sowieso verschiedene Lösungen ermöglichen wollte, werde ich Pygame mal in die Liste aufnehmen.
Habe bis jetzt allerdings überhaupt noch nicht damit gearbeitet, jedoch wäre hier ja ein guter Einstieg gegeben, danke für deine Frage! :)
abgdf

Pygame ist gut, wenn man Animation und Ton usw. haben möchte. Für Deine Spielsteine bestimmt nicht schlecht.
Neulich hab ich mit Pygame ja mal das hier gemacht:

http://www.python-forum.de/topic-9104.html

Aber sicher gibt es da noch bessere Demos.

Viele Grüße
icepacker
User
Beiträge: 49
Registriert: Dienstag 15. November 2005, 18:48

Hallo
Ich meld mich auch mal wieder. Erstmal danke für eure Beiträge!

Ich habe jetzt eine Oberfläche in Tkinter geschrieben, was mittels Canvas
auch nicht allzu schwer war :o
Ist immer noch nicht alles fertig, aber ich wollt mal wieder einen Zwischenstand posten..
Alos so schauts aus: Bild

@Redprince, Deine Idee hört sich auch interessant an.
Bei Interesse könnten wir auch unsere beiden Projekte zusammenschließen.
Meld dich einfach nochmal.

Gruß icepacker
ubuntu linux !!
pot
User
Beiträge: 55
Registriert: Sonntag 4. März 2007, 00:57
Wohnort: Frauenfeld, CH

Mh.. sieht sehr interessant aus (Obwohl ich noch nicht viel Ahnung von Python habe)

Kleiner Tipp:

Code: Alles auswählen

print '\n----------------------------------------------'
Schreib statdessen einfach

Code: Alles auswählen

print '\n' + 46 * '-'
Greets,
Pot
lost_mind
User
Beiträge: 82
Registriert: Dienstag 13. Februar 2007, 11:55

hm sehr interessant das werd ich weiterverfolgen und (konstrutive :wink: )Kritik abgeben soweit das mit meinem Python wissen geht :D
Antworten