Seminararbeit Ruby Uno Kartenspiel



Ähnliche Dokumente
Professionelle Seminare im Bereich MS-Office

! " # $ " % & Nicki Wruck worldwidewruck

Anleitung zur Daten zur Datensicherung und Datenrücksicherung. Datensicherung

INDEX. Öffentliche Ordner erstellen Seite 2. Offline verfügbar einrichten Seite 3. Berechtigungen setzen Seite 7. Öffentliche Ordner Offline

Inhalt. 1 Einleitung AUTOMATISCHE DATENSICHERUNG AUF EINEN CLOUDSPEICHER

Er musste so eingerichtet werden, dass das D-Laufwerk auf das E-Laufwerk gespiegelt

Um dies zu tun, öffnen Sie in den Systemeinstellungen das Kontrollfeld "Sharing". Auf dem Bildschirm sollte folgendes Fenster erscheinen:

Bauteilattribute als Sachdaten anzeigen

Anleitung über den Umgang mit Schildern

SAMMEL DEINE IDENTITÄTEN::: NINA FRANK :: :: WINTERSEMESTER 08 09

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Diplomarbeit. Konzeption und Implementierung einer automatisierten Testumgebung. Thomas Wehrspann. 10. Dezember 2008

Urlaubsregel in David

Alle gehören dazu. Vorwort

Software Engineering Klassendiagramme Assoziationen

Was meinen die Leute eigentlich mit: Grexit?

Step by Step Webserver unter Windows Server von Christian Bartl

SEMINAR Modifikation für die Nutzung des Community Builders

Kurzanleitung. MEYTON Aufbau einer Internetverbindung. 1 Von 11

Viele Bilder auf der FA-Homepage

Verwendung des IDS Backup Systems unter Windows 2000

Sich einen eigenen Blog anzulegen, ist gar nicht so schwer. Es gibt verschiedene Anbieter. ist einer davon.

Meet the Germans. Lerntipp zur Schulung der Fertigkeit des Sprechens. Lerntipp und Redemittel zur Präsentation oder einen Vortrag halten

ZfP-Sonderpreis der DGZfP beim Regionalwettbewerb Jugend forscht BREMERHAVEN. Der Zauberwürfel-Roboter. Paul Giese. Schule: Wilhelm-Raabe-Schule

Sowohl die Malstreifen als auch die Neperschen Streifen können auch in anderen Stellenwertsystemen verwendet werden.

Adminer: Installationsanleitung

ICS-Addin. Benutzerhandbuch. Version: 1.0

Objektorientierte Programmierung für Anfänger am Beispiel PHP

SharePoint Demonstration

Installation SQL- Server 2012 Single Node

mysql - Clients MySQL - Abfragen eine serverbasierenden Datenbank

Geld Verdienen im Internet leicht gemacht

Tutorial Speichern. Jacqueline Roos - Riedstrasse 14, 8908 Hedingen, jroos@hispeed.ch -

icloud nicht neu, aber doch irgendwie anders

TeamSpeak3 Einrichten

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Java: Vererbung. Teil 3: super()

Kapitel 4 Die Datenbank Kuchenbestellung Seite 1

Lernerfolge sichern - Ein wichtiger Beitrag zu mehr Motivation

Live Update (Auto Update)

Wie oft soll ich essen?

MSDE 2000 mit Service Pack 3a

INTERNET UND MMS MIT DEM QTEK2020 MARCO 28. MÄRZ 04

Das Leitbild vom Verein WIR

Handbuch Fischertechnik-Einzelteiltabelle V3.7.3

Idimager ein Bildverwaltungsprogramm-DAM Software

teischl.com Software Design & Services e.u. office@teischl.com

Mit der Maus im Menü links auf den Menüpunkt 'Seiten' gehen und auf 'Erstellen klicken.

MO1 <logo otra empresa> MO1Sync Installationshandbuch MO1. MO1Sync Installationshandbuch -1-

Fachdidaktik der Informatik Jörg Depner, Kathrin Gaißer

Erfahrungen mit Hartz IV- Empfängern

Sichern der persönlichen Daten auf einem Windows Computer

Simulation LIF5000. Abbildung 1

Partitionieren in Vista und Windows 7/8

Einrichtung des Cisco VPN Clients (IPSEC) in Windows7

Die neue Aufgabe von der Monitoring-Stelle. Das ist die Monitoring-Stelle:

CodeSaver. Vorwort. Seite 1 von 6

Dieser Ablauf soll eine Hilfe für die tägliche Arbeit mit der SMS Bestätigung im Millennium darstellen.

Softwaretests in Visual Studio 2010 Ultimate Vergleich mit Java-Testwerkzeugen. Alexander Schunk Marcel Teuber Henry Trobisch

Stellen Sie bitte den Cursor in die Spalte B2 und rufen die Funktion Sverweis auf. Es öffnet sich folgendes Dialogfenster

Inkrementelles Backup

Leichte-Sprache-Bilder

Modul 2: Automatisierung des Posteingangs - Regel- und Abwesenheits-Assistent

Wichtig ist die Originalsatzung. Nur was in der Originalsatzung steht, gilt. Denn nur die Originalsatzung wurde vom Gericht geprüft.

Der neue persönliche Bereich/die CommSy-Leiste

A.u.S. Spielgeräte GmbH A-1210 Wien Scheydgasse 48 Tel.+43-(0) Fax. +43-(0)

50 Fragen, um Dir das Rauchen abzugewöhnen 1/6

Upgrade auf die Standalone Editionen von Acronis Backup & Recovery 10. Technische Informationen (White Paper)

TTS - TinyTimeSystem. Unterrichtsprojekt BIBI

Benutzerverwaltung mit Zugriffsrechteverwaltung (optional)

Regeln für das Qualitäts-Siegel

Outlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang

Anleitung: Sammel-Rechnungen für Lizenzen bei Swiss Basketball

Vorgehensweise bei Lastschriftverfahren

FuxMedia Programm im Netzwerk einrichten am Beispiel von Windows 7

Technische Analyse der Zukunft

Handbuch. ECDL 2003 Professional Modul 3: Kommunikation. Signatur erstellen und verwenden sowie Nachrichtenoptionen

Leitfaden zur ersten Nutzung der R FOM Portable-Version für Windows (Version 1.0)

Anwendungsbeispiele Buchhaltung

ACHTUNG: Es können gpx-dateien und mit dem GP7 aufgezeichnete trc-dateien umgewandelt werden.

Was ist PDF? Portable Document Format, von Adobe Systems entwickelt Multiplattformfähigkeit,

Animationen erstellen

Downloadfehler in DEHSt-VPSMail. Workaround zum Umgang mit einem Downloadfehler

WOT Skinsetter. Nun, erstens, was brauchen Sie für dieses Tool zu arbeiten:

Studieren- Erklärungen und Tipps

40-Tage-Wunder- Kurs. Umarme, was Du nicht ändern kannst.

Battlefield 2 BF2CCD Anleitung

L10N-Manager 3. Netzwerktreffen der Hochschulübersetzer/i nnen Mannheim 10. Mai 2016

Anton Ochsenkühn. amac BUCH VERLAG. Ecxel für Mac. amac-buch Verlag

Der Kalender im ipad

Mit jedem Client, der das Exchange Protokoll beherrscht (z.b. Mozilla Thunderbird mit Plug- In ExQulla, Apple Mail, Evolution,...)

Änderung des Portals zur MesseCard-Abrechnung

FTP-Server einrichten mit automatischem Datenupload für

Hier ist die Anleitung zum Flashen des MTK GPS auf der APM 2.0. Prinzipiell funktioniert es auch auf der APM 2.5 und APM 1.

Tutorial -

Meldung Lokale Anwendung inkompatibel oder Microsoft Silverlight ist nicht aktuell bei Anmeldung an lokal gespeicherter RWE SmartHome Anwendung

Beschaffung mit. Auszug aus dem Schulungshandbuch: Erste Schritte im UniKat-System

Datensicherung. Beschreibung der Datensicherung

Woche 1: Was ist NLP? Die Geschichte des NLP.

Internationales Altkatholisches Laienforum

Transkript:

Seminararbeit Ruby Uno Kartenspiel Autor: Fabian Merki Fabian Merki 05.11.2006 1 von 10

Inhaltsverzeichnis Einleitung... 3 Die Idee... 4 Design und Implementierung in Ruby... 5 Testing... 7 Startbefehle... 8 Client / Server... 8 Tests... 8 Zusammenfassung... 9 Tools und Frameworks... 10 Fabian Merki 05.11.2006 2 von 10

Einleitung Ruby hat mir von der ersten Stunde an gefallen, da man mit wenig Code schnell sehr viel erreichen kann. Diese Arbeit soll zeigen, dass Ruby sehr gut für rundenbasierte, verteilte Spiele eingesetzt werden kann, aber auch was für Schwierigkeiten auftreten können. Und nun wünsche ich Ihnen viel Spass beim Lesen. Fabian Merki Fabian Merki 05.11.2006 3 von 10

Die Idee Da ich selbst sehr gerne Uno spiele und ich schon lange die Idee hatte, eine Laufzeit für rundenbasierte Spiele zu erstellen, in welcher sich diverse KI-Spieler gegenseitig messen können, habe ich folgendes Projekt in Angriff genommen. Anforderungen an ein in Ruby implementiertes Uno Spiel: KI-Spieler (eigenständige Applikation) registriert sich bei einem Server. KI-Spieler soll vom Server aus aufgerufen werden (Callback). Server soll die Regelnprüfen und dafür sorgen, dass niemand mogeln kann. Karten sollen objektorientiert implementiert werden. Regeln sollen möglichst nur einmal implementiert werden. Des weitern soll ein von Menschen gesteuerter Spieler programmiert werden, welcher auch mitspielen kann. Damit lässt sich prüfen, wie gut die KI-Spieler wirklich sind. Fabian Merki 05.11.2006 4 von 10

Design und Implementierung in Ruby Folgende Klassendiagramme sollen die Struktur des Programms visualisieren: Zentraler Punkt auf der Serverseite ist die Klasse Spiel und auf der Clientseite der Spieler. Damit der Spieler nicht einfach seine Karten auf dem Server löschen kann und somit gewonnen hätte, habe ich das Spieler Objekt auf dem Server als ServerSpieler kopiert und delegiere alle Aufrufe auf das effektive Spieler Objekt. Somit hat der Client keinen Zugriff auf das interne Spieler Objekt und deshalb keinen Zugriff auf seine Handkarten. Der Spieler könnte aber die Karte auf dem Stapel oder seine Karten ändern, sofern Attribute mit attr_accessor deklariert werden. Nur die Klasse FarbWahlKarte hat ein solches Attribut. Damit der Client mit seiner Mogelaktion nicht erfolgreich ist, merkt sich der Server die gewählte Farbe und prüft auf Veränderung. Alternativ könnte man immer eine Kopie der Karte auf dem Stapel an den Client übergeben. Der Server ruft den Spieler über die Methode karte(stapelkarte, direkt) auf. Der Parameter direkt zeigt an, ob eine PlusZweiKarte auf dem Stapel liegt und man das +2 direkt erhöhen darf, falls man eine PlusZweiKarte besitzt. Dank Vererbung können einfach diverse Spieler implementiert werden. Der AdvancedSpieler soll hier nur als Beispiel dienen. Dieser könnte natürlich Statistiken führen und sehr bewusst spielen. Der menschliche Spieler wird über die Konsole gesteuert. Die konkrete Fabian Merki 05.11.2006 5 von 10

Implementierung befragt einem (welche Karte gespielt werden soll) nur, wenn es mehrere Möglichkeiten gibt. Damit Callback-Methoden des Spielers und SpielInfo auf der Clientseite ablaufen, musste ich die Klasse Spieler mit include DRbUndumped definieren. Somit ist das Spieler Objekt ein verteiltes Objekt, welches vom Client dem Server übergeben wird, aber die Methoden werden dann jedoch auf dem Client ausgeführt. Auf Modelebene sind natürlich die Karten des Uno Spiels das Wichtigste. Folgendes Klassendiagramm zeigt die Klassenhierarchie der Karten. Die Methode ok(stapel) prüft, ob die Karte auf die Karte auf dem Stapel gelegt werden darf oder nicht. Die == Operation musste ich überschreiben, damit ich die Karten in Listen wieder finde und diese entfernen kann. Anscheinend wurde das Objekt beim Transfer Server -> Client -> Server kopiert. Für den Vergleich habe ich mich für ein Attribut kartenid in der Klasse Karte entschieden, welches eindeutig ist. Weitere Details entnehmen Sie bitte direkt dem Sourcecode. Fabian Merki 05.11.2006 6 von 10

Testing Für das Testen meines Uno Spiels habe ich eine Testdatei (unittest.rb) geschrieben, welche das Kartenmodel testet. Dies hat sich als sehr hilfreich erwiesen, da Ruby Programme nur zur Laufzeit auf formelle und logische Fehler geprüft werden können. Für das Spiel und die Spieler hätte man gleich verfahren können; ich habe diese aber von Hand getestet. Der Nachteil dieser Methode ist, dass man relativ häufig testen muss und diese Tests nicht unter einer Sekunde ablaufen. Es scheint, als würde sich der Unittest Aufwand in Ruby wirklich lohnen, da man hier keinen Compiler hat, der einem die formellen Fehler anzeigt. Die KI-Spieler konnte ich relativ einfach testen, indem ich einfach 5 Spieler x Mal gegeneinander antreten lies. Leider habe ich wie wohl jeder Ruby-Anfänger häufig mit puts (und nicht mit log4ruby) Debuginformationen geschrieben. Nun wollte ich aber wissen, welche KI-Spieler wie oft gewinnen, und habe folgenden kleinen Ruby-Trick angewandt: $sp={} # Merke alte puts Methode alias :orig_puts :puts # Zähle wer wie oft gewinnt (kein Output) def puts(text) if text =~ /gewinnt/ i = $sp[text] if (i == nil) i = 0 end i = i + 1 $sp[text]=i end end # 100 Spiele spielen # Statistik ausgeben $sp.each_pair { k, v orig_puts "#{k} #{v}" } Lässt man das Programm laufen, so erhält man zum Beispiel folgenden Output: ai spieler 1 gewinnt 15 ai spieler 2 gewinnt 15 advanced ai spieler 2 gewinnt 30 advanced ai spieler 1 gewinnt 24 ai spieler 0 gewinnt 16 Wie man sehen kann, gewinnt der advanced KI-Spieler häufiger als der einfache KI-Spieler. Zudem sind alle andern puts verschwunden. Da es sich bei diesem Spiel um eine reine Computersimulation handelt, war dieser Testansatz sehr einfach zu entwickeln und umzusetzen, da keine Benutzereingaben simuliert werden mussten und es keine Abhängigkeiten zu andern System gibt. Fabian Merki 05.11.2006 7 von 10

Startbefehle Client / Server Bitte öffnen Sie eine Shell und wechseln Sie ins src Verzeichnis. Server starten: ruby server.rb Clients starten (bitte 5 Mal ausführen) Windows: start ruby client.rb Unix / Linux: ruby client.rb & Nachdem ein Spiel gespielt wurde, werden die Clients automatisch geschlossen in der Konsole des Servers sieht man den Spielverlauf. Tests Alles in einer Rubyinstanz starten und KI-Spieler gegeneinander 100 Mal antreten lassen: ruby all.rb Unittests starten ruby unittest.rb Fabian Merki 05.11.2006 8 von 10

Zusammenfassung Ruby s Stärke liegt sicherlich in der Einfachheit Programme mit wenig Code zu schreiben. So benötigte ich für das ganze Spiel inklusive Unittests etc. gerade einmal ~15 KB benötigt. Würde man das Uno Spiel zum Beispiel in Java implementieren, wäre vermutlich das ant build file halb so gross und der Code selbst mindestens 2-3 so viel. Wenn man bedenkt, dass ich für die Client / Server Kommunikation gerade einmal ein paar Zeilen programmieren musste, so fragt man sich schon, weshalb in anderen Sprachen so viel Aufwand nötig ist. Auch die Verwendung von include DRbUndumped um verteilte Objekte zu produzieren, stellt Corba, RMI und ähnliche Protokolle komplett in den Schatten. Features, wie das Umbenennen einer Methode sowie das Erweitern einer Klasse, sind ein wenig gewöhnungsbedürftig, können aber durchaus hilfreich sein. Die Verwendung von attr resp. attr_accessor, um den Zugriff auf Objektvariablen zu definieren, oder die Konstrukte 10.times { }, liste.each {}, map.each_pair {... } sind natürlich sehr elegant und zeigen sehr schön, wie einfach Ruby sein kann. Ein grosser Nachteil hat Ruby aber schon: da es eine sehr dynamische, untypisierte Sprache ist, kann man formelle Programmierfehler nicht im Voraus sondern nur zur Laufzeit entdecken. Wie bereits erwähnt, lohnt sich der Einsatz von Unittests sehr vielleicht ist er in Ruby sogar überlebenswichtig. Übrigens gibt es die Möglichkeit Ruby typisiert zu Verwenden, wenn man den entsprechenden Inlude tätigt. Im Uno Spiel habe ich auf diese Möglichkeit verzichtet. Eines hat mich sehr erstaunt, gerade weil Ruby selbst sehr einfach ist. Die verfügbaren Grafikbibliotheken wie Tcl/Tk und andere sind nämlich extrem kompliziert und fast komplett undokumentiert. Dazu muss man noch diese meistens noch zusätzlich installieren. Mir gelang es zum Beispiel nicht in nützlicher Zeit ein Bild (mit allen Karten) einzulesen und teile davon auszuschneiden. Zwar ist die Klasse TkPhotoImage auf Methodenebene dokumentiert, jedoch fehlen Angaben zu den Map-Parametern komplett. Folgende Zeile habe ich zufälligerweise in einem Beispiel gefunden: image.copy(tmp2, 'subsample' => [0.5, 0.5]) Wie soll man hier bloss wissen, dass subsample existiert und was es für Auswirkungen hat? Ein Fenster mit ein paar Buttons und Labels war nicht all zu schwer zu programmieren. Für komplexere GUI Programmierung ist die Verwendung von Java sicherlich einfacher und man stösst nicht so rasch auf undokumentiere APIs. Da ich schon viele Stunden mit Ruby und GUIs verbraten habe, habe ich am Schluss auf ein Uno GUI verzichtet. Fabian Merki 05.11.2006 9 von 10

Tools und Frameworks Ruby http://www.ruby.org FreeRide Tcl/Tk Fabian Merki 05.11.2006 10 von 10