ACHTUNG. Das ist ein Archiv des alten forum.ruby-portal.de. Die aktuelle Mailingliste gibt es auf lists.ruby-lang.org/pipermail/ruby-de.

NOTICE. This is a ready-only copy of the old forum.ruby-portal.de. You can find the current mailing list at lists.ruby-lang.org/pipermail/ruby-de.

Die Programmiersprache Ruby

Blog|

Forum|

Wiki  


Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]

Ein neues Thema erstellen Auf das Thema antworten  [ 2 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Rushhour Lösungsgenerator
BeitragVerfasst: 17 Sep 2010, 21:34 
Offline
Nuby

Registriert: 11 Sep 2010, 22:03
Beiträge: 7
Hier mal mein erstes Rüby Progrämmchen mit mehr als 20 Zeilen ;)

das ganze stellt einen Lösungsgenerator für das bekannte Spiel Rushhour dar, Einfach Spielbrett in der Main angeben und schon zuckelt das ganze los ;)

Fragen zum Algorithmus beantworte ich auch gern, Tips und vorschläge um das ganze schneller oder mehr "Rubylike" zu machen nehme ich auch gern an :)

Mfg TLink

Ps: Heuristik bitte dem beigefügten Textdokument "ListeMoves" entnehmen, beschleunigt das ganze ungemein, aber vorsicht, nicht an der Heuristik rumschrauben sonst könnte es und kann es sehr gut sein das ihr damit die Lösung ausschließt ;)


Dateianhänge:
Rushhournew.zip [33.35 KiB]
319-mal heruntergeladen
Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Rushhour Lösungsgenerator
BeitragVerfasst: 20 Sep 2010, 09:40 
Offline
Lehrling
Benutzeravatar

Registriert: 22 Jun 2009, 13:55
Beiträge: 82
Wohnort: Ostthüringen
Hi,

da du den Wunsch nach mehr "Rubylike" geäußert hast ;-) hier mal ein paar Vorschläge meinerseits. (Außerdem auch ein paar generelle zur Objektorientierung).
Also erstmal finde ich deine Verteilung des Codes auf die *.rb Dateien nichts sehr glücklich. Wieso zum Beispiel machst du eine eigene Datei für eine einzelne Methode? Gerade die einlesen-Methode gehört doch unmittelbar zum Spielbrett und sollte daher dort auch im initialize stehen oder optional in irgendwas deratigem:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Spielbrett < Array
def initialize # hier wird eben ein blanko-Spielfeld erzeugt als 2d 6x6 Array
super(6).map!{ Array.new(6) }
end

def self.load(dateiname)
brett = new # Hier wird das Blankofeld generiert
file = File.new(dateiname, 'r') # wenn du die Datei erst ��ffnest und dann ...
brett.map!{|zeile|
zeile.map{|feld|
char = file.read(1).chomp # chomp schneidet Leerzeichzen und Zeilenenden ab
char = file.read if char.empty? # lies das n��chst Zeichen ein, wenn das letzte Zeilenende war
} # ... read anwendest, musst du nicht "mitz��hlen", sondern er nimmt dann immer
# das erste Zeichen aus dem IO-Stream raus
}
end
end
Und wenn du nun das Spielfeld laden möchtest benutzt du einfach variable = Spielbrett.load('vorgabe1.txt'). Das liest sich gleich viel besser ;-). Ein zweiter Punkt ist, dass du extrem viele "unnütze" Methoden deklariert hast - die Getter und Setter. Ruby hat da ein sehr schönes "Attribut"-Konzept, dass dir einiges an Arbeit erleichtert. Ich hab das mal am Beispiel von Auto und LKW demonstriert:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
class Vehicle
attr_reader :id # nur Getter
attr_accessor :xcoordinate1, :xcoordinate2 # Getter und Setter
attr_accessor :ycoordinate1, :ycoordinate2
# attr_writer # nur Setter ;-)

def initialize( x1, y1, x2, y2, id)
@xcoordinate1 = x1
@ycoordinate1 = y1
@xcoordinate2 = x2
@ycoordinate2 = y2
@id = id
end

def get_horizontal
@xcoordinate1 != @xcoordinate2 # In Ruby wird "die letzte Zeile" automatisch zur��ckgegeben, du kannst dir also das return sparen
# au��erdem kannst du dir auch hier sparen das true und false ��ber Bedingungen zur��ckzugeben, weil die Bedigung selbst doch schon den bool-Wert zur��ckgibt ;-)
end
end

class Auto < Vehicle
end

class Lkw < Vehicle
attr_accessor :xcoordinate3, :ycoordinate3

def initialize( x1, y1, x2, y2, x3, y3, id)
super(x1, y1, x2, y2, id)
@xcoordinate3 = x3
@ycoordinate3 = y3
end
end

# attr_* :name definieren getter und/oder setter-Methoden nach folgendem Schema:
# def name
# @name
# end
# def name=(val)
# @name = val
# end
Der Code lässt sich nur sehr schön lesen. Du hast nämlich Vehicle, mit bestimmten Eigenschaften (Attributen). Ein Auto ist ein spezielles Fahrzeug, daher wird das abgeleitet. Ein LKW ist ebenfalls ein spezielles Fahrzeug und wird ebenfalls abgeleitet und sogar noch durch spezielle Attrbitute ergänzt.
Das ganze dann noch aufs Spielbrett angewandt und schon sieht alles freundlicher aus. Ein letzter Tipp noch: Die Verwendung globaler Variablen ($name) ist eher nicht zu raten.

Ich hoffe ich konnte dir ein paar Anregungen liefern.

Mit freundlichen Grüßen,
Kjarrigan

PS: Hier kannst du etwas über Ruby's Attribute nachlesen: --> Klick mich <-- - btw ist das ganze Buch sehr zu empfehlen um einen Überblick über Ruby zu bekommen (auch wenn die verlinkte Version nicht mehr ganz Up-To-Date ist, was die angehängte API betrifft

EDIT: Kleinen Codefehler bereinigt

_________________
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning. - Rick Cook, The Wizardry Compiled


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 2 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach: