Pokerprogrammierung mit wenig Vorkenntnissen möglich?

Status
Nicht offen für weitere Antworten.
S

Sensewell

Gast
Hallo Leute,

ich habe nun seit einem Semester Java. Und wir sollen eine Semesterarbeit erstellen. Diese soll nicht zu komplex sein. Wir haben so die ersten Themen in Java besprochen Klassen,Schleifen,Objektorientierung etc. Nun möchte ich eben wissen ob ein Texas Holdem Poker Programm, dass nur in der Konsole (also nicht graphisch) gespielt werden soll zu schwierig zu programmieren ist.

Das Programm soll so aussehen: Eine Person (der das Prog startet) soll gegen den Computer spielen , gegenfalls mit Einsatz (also mit Runden).

Ich weiss , dass das alles relativ ist aber ich würde gerne einfach eine objektive Meinung wissen. Wer solch ein Programm schon geschrieben kann, kann mir das ja auch mal vorstellen damit ich eine Vorstellung an Code habe.


Grüße,

Sensewell
 

padkey

Mitglied
hallo, ich denke das es nicht so schwer sein wird... je nachdem wie stark der gegner (pc) sein soll. ich denk jedoch, dass du es auf jedenfall mit ner grafischen einfach oberfläche machen solltest. in ner gui denke ich ist das einfach nnicht so toll.
 
S

Sensewell

Gast
Es ist leider nicht erlaubt, oder sollte nicht graphisch dargestellt werden. iSt ja auch nicht so schlimm. Könnte man ja mit den IO Tools arbeiten. Kann jemand mal ein brainstorming geben was ich für dieses Programm alles bräuchte. also an code....


Grüße
 

Wildcard

Top Contributor
Such dir was anderes. Die Sache ist nicht so trivial wie du wohl hoffst und die Benutzerinteraktion über die Konsole zu realisieren wird nicht nur ein Albtraum für den Benutzer, sondern auch für dich.
 
S

Sensewell

Gast
Das dachte ich mir eigentlich auch so.....
Aber ich weiss einfach nicht was ich machen soll. Ich wäre für ein Braínstorming verdammt dankbar. Es soll wirklich in der gui entstehen, mehr anforderungen gibt es eigentlich nicht. Entweder ein Spiel oder eine wirtschaftliche Aufgabenbewältigung .....oder andere sachen.... ich wäre euch dankbar.

Sensewell
 

tincup

Bekanntes Mitglied
Also für das Texas Hold'em Game bräuchtest du grob gebrainstormed:

1. Ein Userinterface (wie schon erwähnt, nur Konsole wird das kein Spass)
2. Eine Gameengine, die die Regeln von Poker beherrscht, Karten austeilt, verschiedene Blätter vergleichen kann usw.
3. Eine KI die den Part von einem oder mehreren Spielern übernimmt

Kenne ja euren Zeitrahmen nicht aber unterschätz das alles nicht. Grade falls du noch recht unerfahren bist könntest du da schnell an deine Grenzen stoßen.

Grüsse,
tin
 
S

Sensewell

Gast
Hallo Leute,



ich hab mich trotz eurer einwände entschieden die sache durchzuziehen. Ich weiss dass es hässlich wird aber die Schönheit des Programms steht nicht im Vordergrund für die Arbeit.
Ich würde euch doch trotzdem beten mir ein wenig zu helfen. auch wenn ich es auf einer nicht grafischen gui erstellen will. Ich bin sehr lerngeil. also postet einfaach.


Grüße,

Sensewell
 
G

Guest

Gast
wenn du wirklich nur ein 1vs1-pokerspiel schreiben willst, dann verstehe ich nicht, wieso ihr hier einen "krampf" beim spielen auf der konsole prophezeit. man braucht doch nur wenige informationen: die karten auf der hand, die community cards, die 3 chipstände. optionen gibts ja auch nur 3: check, call oder raise. das sollte doch gehen ;) ich bin in jedem fall mal gespannt was du so produzierst.
 
G

Gelöschtes Mitglied 5909

Gast
das problem wird wohl kaum check call oder raise sein @ gast, sondern viel mehr die blätter miteinander zu vergleichen bzw aus dem table und der hand des höchstwertige automatisch zusammenzubasteln. Dazu noch ne KI und des ganze wir nicht so einfach
 

Niki

Top Contributor
Ich glaube schon das du die Aufgabenstellung unterschätzt. Alleine der Algorithmus zum Herausfinden wer gewonnen hat wird einige Zeit in Anspruch nehmen (aus 7 Karten das bestmögliche Blatt ermitteln)....

EDIT: zu langsam :(
 

Pappenheimer++

Bekanntes Mitglied
zeitaufwändig wirds in jedem fall, aber du brauchst, soweit ich das beurteilen kann, keine besonderen java-"kniffe". wie ich finde, ist es das, was am meisten spaß macht am programmieren: mit einfachen mitteln komplexe probleme lösen. manche studenten haben ja auch ne ganze menge zeit, aber wie das bei dir aussieht weiß ich natürlich nicht ;)
 

Sensewell

Mitglied
So ich habe mich angemeldet. Nun bin ich willig :) ! Zeit? ich habe für das Projekt knapp 2 Monate. Aber leider fast garkeine Zeit @pappenheimer. BA Studium ist ein wenig zeitaufwendiger. 6-20 uhr könnte es ausdrücken. Ich bin gerade dran ein 2 deminsionsarray mit den karten zu erstellen und erstmal mit random 2 herraus zu nehmen. Wenn sich jemand mit Hilfe anbietet wäre ich echt glücklich.

Grüße,

Sensewell
 

Niki

Top Contributor
Ich geb dir mal einen Denkanstoß:

Bau dir ein Objekt Karte:
Code:
public class Card{

  private String farbeString = null;
  private String typString = null;
 
  //getter und setter und Konstruktor überschreiben:

  public Card(String farbeString, String typString){
    this.farbeString = farbeString;
    this.typString = typString;
  }
}

Dann bau dir in einer Methode eine Liste (am besten LinkedList, wegen removen des ersten Elements), welches das Kartendeck repräsentiert:

Code:
public static LinkedList<Card> createNewDeck(){
  LinkedList<Card> cards = new LinkedList<Card>();

    cards.add(new Card("Herz", "As"));
    cards.add(new Card("Herz", "König"));
    cards.add(new Card("Herz", "Dame"));
//und so weiter....

    return cards;
}

Das angenehme ist, dass du die Karten mittels Collections#shuffle mischen kannst.

Programmier das mal, und wenn du Fragen hast kannst du dich dann wieder melden
 

Niki

Top Contributor
Wenn du die Karten verteilst kannst du dann mit cards.removeFirst() immer die erste Karte raus nehmen und an die Spieler verteilen.
 

Pappenheimer++

Bekanntes Mitglied
niki empfiehlt dir die collection der linked list (verkettete liste), weil es sich dabei um eine dynamische collection handelt. deswegen ist entfernen und hinzufügen von elementen sehr einfach möglich. bei statischen arrays z.b. gibt das immer probleme, denn: die feldgröße muss schon beim erstellen der collection feststehen und ist nachher nicht mehr veränderbar. will man dann doch noch die feldgröße "ändern" muss man aufwändig und kompliziert das array teilweise kopieren usw.
linked list ist für die community cards vllt ganz nett, aber wenn du nur intern makieren willst, welche karten schon gezogen worden sind (damit du sie nicht nochmal ziehst), reicht auch einfach ein 1-oder-2-dimensionales boolean array. da kannst du dann leicht eintragen, welche karten es noch gibt. nummerier sie einfach durch. z.b.
Code:
boolean[] karteNochDa = new boolean[13*4]; // [0]=2.karo, [1]=2.herz
oder
Code:
boolean[][] karteNochDa = new boolean[13][4]; //[0][0]=2.karo,[0][1]=2.herz
 

Sensewell

Mitglied
Abend,

also ich hab das ganze mal so konzepiert:


public static void main (String [] args){
List<Card> cards= new ArrayList<Card>();

String[] color=new String[3];

color[0]="Herz";
color[1]="Karo";
color[2]="Pik";
color[3]="Kreuz";



for (int i=2;i<=10;i++){



}


und :
Code:
public class Card{ 

  private String farbeString = null; 
  private String typString = null; 

  //getter und setter und Konstruktor überschreiben: 

  public Card(String farbeString, String typString){ 
    this.farbeString = farbeString; 
    this.typString = typString; 
    
  }

@Override
public String toString() {
	// TODO Auto-generated method stub
	return farbeString +" "+typString;
} 
  
}


nur hab ich bei dem ersten noch ein kleines Problem:

in der For Schleife möchte ich als "Ausgabe" dies erzeugen:
cards.add(new Card(color[0],i));
cards.add(new Card(color[1],i));
cards.add(new Card(color[2],i));
cards.add(new Card(color[3],i));


damit hätte ich ja alle karten von 2-10 erstmal collectet? lieg ich da falsch?


Grüße
 
G

Gelöschtes Mitglied 5909

Gast
Das hier wäre auch ne Möglichkeit:

Code:
public enum Suit {
	
	Clubs, Diamonds, Hearts, Spades;
	
	@Override
	public String toString() {
		return name();
	}

}


public enum Value {
	
	Two(2), Three(3), Four(4), Five(5), Six(6), Seven(7), Eight(8), 
	Nine(9), Ten(10), Jack(11), Queen(12), King(13), Ace(14);
	
	int value;
	
	private Value(int value) {
		this.value = value;
	}

	@Override
	public String toString() {
		return name();
	}

}


import java.util.Comparator;


public class ValueComparator implements Comparator<Value> {

	@Override
	public int compare(Value o1, Value o2) {
		return (o1.value < o2.value ? -1 : (o1.value == o2.value ? 0 : 1));
	}
	
}



public class Card implements Comparable<Card> {
	
	private Player player = null;
	private Suit suit;
	private Value value;

	private boolean isInGame = true;
	
	@Override
	public int compareTo(Card o) {
		return new ValueComparator().compare(value, o.value);
	}
	
}
 

tincup

Bekanntes Mitglied
Ich denke auch so wenn ich gedanklich das Programm durchspiele solltest du auf gar keinen Fall Strings für die Kartenidentifikation nehmen, vor allem nicht für den Kartentyp (mit Auge auf den Vergleich von Händen später). Einfach Ziffern 0-13 oder eben mit den Enums.
 

Wildcard

Top Contributor
tincup hat gesagt.:
Das wird ja nen Alptraum mit Strings.
Sehe ich genauso.
Ausserdem ist die Sache komplex genug das du noch gar nichts Implementieren dürftest, da ich mir nicht vorstellen kann, dass du die Sache schon durchgespielt und (auf Papier) modelliert hast.
 

tincup

Bekanntes Mitglied
Wildcard hat gesagt.:
Ausserdem ist die Sache komplex genug das du noch gar nichts Implementieren dürftest, da ich mir nicht vorstellen kann, dass du die Sache schon durchgespielt und (auf Papier) modelliert hast.

ACK! Aus eigener Erfahrung: Erstmal hinsetzen und modellieren, durchdenken, Methoden auf dem Papier durchspielen! Man ist meist versucht mit guten Ideen sofort die erste Klasse zu erstellen aber da rennt man sich später selbst hinterher ausser man hat ein wirklich gutes Händchen.
 

Wildcard

Top Contributor
Ich würde dir empfehlen den Computergegner als erstes Modul herauszupicken.
Du bräuchtest zunächst eine Gütefunktion die das aktuelle Blatt bewertet.
Dazu musst du etwas Literatur über Poker wälzen. Solltest du mit der Gütefunktion größere Schwierigkeiten haben, wirf alles hin und such dir ein neues Projekt.
Ich will dir nicht Unrecht tun, aber aufgrund deiner bisherigen Aussagen bin ich der Meinung das du dir zuviel zutraust.
Sollte das zutreffen, lieber rechtzeitig umorientieren, als sich zu verrennen.
Das ist ein Luxus den du leider nur in der Schul-, Studienzeit haben wirst, also nutz ihn aus solange du kannst :wink:
 

Faruun

Aktives Mitglied
Ich denke, Du hast Dir ein ziemlich hohes Ziel ausgesucht.
Ich weiß nicht, wie Deine Pokerkenntnisse liegen, aber allein dem Programm beizubringen, wie die Regeln funktionieren, dürfte alles andere als einfach werden.
Von der Reihenfolge würde ich mit dem Kartendeck beginnen und mit der Verteilung von Karten (keine Doppelten, Random).

Damit hat man gleub ich schon genug zu tun, wenn man wenig Vorkenntnisse hat.
 

Quaxli

Top Contributor
Ich stimme Wildcard zu und rate Dir zu überlegen, ob Du das wirklich machen willst. Sag uns doch mal, wie die Aufgabenstellung für die Semester-Arbeit heißt. Wir können Dir dann bestimmt ein paar Tipps für ein Thema geben, das a) immer noch anspruchsvoll ist, so daß Du damit glänzen kannst und b) dafür aber auch realisierbar ist.
 

ARadauer

Top Contributor
Ich hab mal wo eine Java Bibliothek für HoldEm gefunden.

Karten austeilen, die besten 5 aus 7, Händer miteinander vergleichen. Ermitteln was man hat, Straße, Flush usw..... ich denk das kannst mit deinem Prof vereinbaren, dass du sowas verwenden darfst um die Wertigkeiten zu bestimmen.

Ohne sowas schaffst du es definitv nicht! 5 aus 7 Karten, mit 5 Cummunity Cards und jetzt noch herausfinden, welcher die beste Hand hat und vielleicht auch noch bennen? Das ist keine aufgabe für einen Anfänger!
Ein spielbares Konsolen-Game das im Herz so eine Bibliothek benutzt, ist da schon ein nettes Projekt.
Ich schick dir die Bibliothek und ein paar Beispiele von mir am Abend, schreib mir eine PM.
 

function

Bekanntes Mitglied
Also dann gebe ich auch einmal meinen Senf dazu ;-)

ich habe mal ein holdem programm geschrieben, allerdings muss ich dazu sagen das ic hschon einige jahre java erfahrung haben. Und es hat mich schon einiges an zeit und nerven gekostet.
Neben dem Problem 5of7 gibt es spätestens große Probleme der Karten bewertung des KI-Gegners. Weil da "leider" ein paar mehr aspekte als alleine die eigenen Karten eine Rolle spielen(Position am Tisch, Spielweise des Gegners, höhe des einsatzes...).
Ich weiß jetzt natürlich nicht wie gut du dich im poker aus´kennst, aber du wirst deinem Computer schon beibringen müßen, was odds, outs, pot-odds, ... sind und wie diese dann wirklich zu bewerten sind.

Wenn ich dir einen Rat geben darf:
Wenn es schon Poker sein soll, dann fang lieber erstmal an mit 5CardDraw, da ersparst du dir schon einiges probleme:
- kein 5of7
- die möglichen Hände müßen nicht so oft bewertet werden(kein turn kein river)
und last but not least, am anfang immer die limit variante programmieren, vereinfacht sehr stark das ki programmieren.
 

ARadauer

Top Contributor
eine poker ki zu programmieren sollte keine projekt aufgabe in einem ba studium sein.
das ist mehr als eine bak arbeit, das is sogar meiner meinung nach fast mehr als eine diplom arbeit.
zum dem thema konnte man schon eine doktorarbeit schreiben. (merk mir das mal für meinen doktor vor)

ich würd die ki zufällig agieren lassen, wobei das einen extrem schweren sein wird ;-)
 

Saxony

Top Contributor
Hiho,

du kannst auch mal ne Mail an Chris "Jesus" Ferguson schreiben. Der hat nämlich mehrere Online Pokerräume bei der Entwicklung der Pokersoftware beraten. Zudem hat er einen Doktor in Mathematik mit Schwerpunkt künstliche Intelligenz. :D

bye Saxony
 

ARadauer

Top Contributor
Der hat nämlich mehrere Online Pokerräume bei der Entwicklung der Pokersoftware beraten.

Die fachliche Beratung wird einem Java Anfänger bei der technischen Umsetzung auch nix bringen. Da sind die pokertrategy.de Tabellen für limit hold em eher zu empfehlen.
Mein Bot spielt nach diesen Tabellen.
 

Saxony

Top Contributor
Hiho,

naja wenn der Bot nur nach den Wahrscheinlichkeiten spielt, ist er ja leicht zu schlagen - man braucht ihm nur die Pot Odds nehmen. :)

Viel interessanter ist aber, wie du den Bot steuerst! Er muss ja Sachen wie Fold, Call, Bet, Raise usw. ausführen ausserdem muss er die aktuellen Boardkarten ermitteln. Liest du dazu die GUI aus bzw. die Handhistorys auf der Platte. Und zur Steuerung: simulierst du da Tastendrücke oder wie machste dat? :D
Ich gehe mal davon aus, dass es sich um einen Bot für einen Online Poker Room Anbieter handelt.

bye Saxony
 

ARadauer

Top Contributor
ja der poker room für den ich den bot geschrieben habe, bietet keine Möglichkeit die Handhistory auszulesen.

Ich capture also die GUI über die Robot Klasse und simulier auch so die Tastendrücke. War eine ziehmliche Fuzeilei, bis er die Karten vom Screenshot lesen konnte, aber hat dann schon funktioniert.
 
G

Guest

Gast
neuer Vorschlag für deine Arbeit:

Hey, ich bin selbst noch Anfänger, deinen Posts zu urteilen wohl etwas "weiter" als du.
Hatte Java zwar auch nur 1 Semester, aber generell wahrscheinlich schon mehr programmiert,
vorallem in C.

Ich kann dir garantieren: Dein Vorhaben ist VIEL zu schwierig !!
Ich will, wie meine Vorredner, dich nicht runtermachen, aber denk mal nach, was dein Programm braucht:

- Künstliche Intelligenz

So, mehr sag ich nicht. Ich könnte die Liste noch ewig lange machen mit Sachen, die du niemals hinkriegen wirst
mit deinem Wissensstand, alleine eine _EINIGERMASSEN_ übersichtliche "grafische" Darstellung auf der Konsole wird
dir die komplexesten und ätzendsten Formatierungsfunktionen abverlangen, die man nur schreiben kann...

Ich wollte ja aber nen anderen Vorschlag machen:

Ich mache gerade ein Snake-Spiel, kennt ja jeder.
Das tolle ist, dass du das wirklich sehr hübsch auch in der Konsole spielen kannst.

Und ich denke es ist auf jeden Fall komplex genug, auch schwierig genug.
Und es macht einfach Spass. Wenn du denkst, das is jetzt zu langweilig:

- alleine die Steuerungsalgorithmen sind interessant (Zellen, die sich in Abhängigkeit von Nachbarszellen bewegen)
- der Wurm frisst Früchte
- wird dabei länger
- du bekommst Punkte
- das Spiel wird immer schneller, immer schwerer also für den Spieler.
- wurm darf sich nicht in den schwanz beissen
- darf nicht aus dem Consolen-Fenster laufen

und du kannst noch zig "extras" einbauen, wie z.B. vor dem wurm "fliehende" früchte, oder fake-früchte, bomben, goodies (z.B. du sammelst eine frucht ein, aber es war eine spezielle frucht und auf einmal ist die steuerung spiegelverkehrt)

also...da kann man einiges rausholen, es macht bock zu zocken, und man kann es wie gesagt auch extrem schön auf Konsolen-Ebene spielen..

Mach echt lieber das... Einen Computer simulieren als intelligenter Spielpartner ist eine der schwersten Gebiete, die es in der Programmierung seit je her gab... und das unterschätzt man extrem schnell, denn computer sind saudumm..

hoffe, ich konnte dir besinnen ;) Wie gesagt, ich will nur helfen. Dein Poker-Projekt ist aber einfach zu schwer für dich, das musst du einsehen, und das hat nix mit "durchziehen" zu tun sondern mit gesunder Selbsteinschätzung.

mfg
 

Sensewell

Mitglied
So sorry an alle. hatte eine lange Vorlesungswoche. Kam garnicht dazu eure Posts zu lesen. Also ich wollte euch nochmals sagen, dass ich keine KI in das Spiel einbauen will und es auch Laut Dozent zu schwer wäre. Ich möchte die Einsätze des Computers nach Zufall gestallten. So dass der Spieler wirklich nie weiss was der PC hat. Ich weiss es ist nicht realitätsnah aber darum geht es mir eben nicht. Ich denke das spiel bringt auch so sehr viel spass. Bitte um Rückmeldung.

LG und schönes Wochenende,

Sensewell
 

ARadauer

Top Contributor
snake in der konsole, das will ich sehen.

also back to poker. ich würd die ki dem zufall überlassen und und die kartenlogik von einer fremden bibliothek übernehmen lassen. Das drumherum ist dann nicht mehr so schwer und schafbar und man kann sehr viel dabei lernen.

also hier die bibliothek von der ich schon mal gesprochen habe

http://spaz.ca/poker/UofAHandEval.zip und hier gibts die Doku dazu http://spaz.ca/poker/doc/

Das ist von der University of Alberta Computer Poker Research Group. Uiui klingt ziemlich proffesionell.

Ich finde die Klassen total logisch aufgebaut und gut zu benutzen.
Karte, Deck, Hand, Auswerter

Das ist ein kleines Testprogram von mir:

Code:
auf Wunsch entfernt, kanns aber gerne per pm verschicken, wenns noch wer braucht[code]


Viel Spaß damit!
 

Quaxli

Top Contributor
snake in der konsole, das will ich sehen.
Ich auch!!! ???:L


Zum Thema:

Ich würde Dir aber immer noch empfehlen, etwas anderes zu machen. Die Vorredner hier hatten einige gute Vorschläge. Ich glaube nicht, daß ein Pokerprogramm wirklich Spaß macht, wenn der Gegner nicht zumindest rudimentär intelligent handelt.
Ich würde mal vermuten, daß Du Dein Programm auch mit den Basics schreiben sollst und ext. Libs nicht unbedingt erwünscht sind, oder?
 

Sensewell

Mitglied
Hi Quaxli,

also ich bin immernoch fest davon entschlossen, dass die grapfische anwendung sekundär ist. laut meinem dozenten. Es soll schön geschrieben sein. Und ich denke die ansätze von einem Poker auf konsolenebene sind doch sehr logische Abläufe. Externe Libs sind erlaubt so wie zum beispiel die IOTools!Also werde ich mich einfach mal daran versuchen.AUf ein anderes Thema kann ich immernoch einlassen. Ich hab ja ein glück ein gutes Zeitpensum.

LG und schönes WE,

Sensewell
 
P

Projektmanagement Gast

Gast
Hallo,

aus der Sicht eines Projektmanagers würde ich folgendes Empfehlen:

1. Ganz klaren Plan, welche Teile für das Programm benötigt werden. (nicht nur 3 Teile, da es hier mit der KI und den Vergleichsalgorithmen wohl eher 30 werden)

2. Klaren Zeitplan, wieviel Zeit für die Umsetzung effektiv neben den anderen Lernaufwänden und privaten Verpflichtungen bleiben.

3. Bei einem solch hohem Risikoprojekt ein SCHEITERN einkalkulieren. (Was nützt eine gescheiterte Arbeit?)

4. Plan B entwerfen (Was mache ich, wenn es nicht umsetzbar ist

5. Deadline planen (bis wann muss das Programm wieweit laufen, damit notfalls der Plan B (anderes Projekt) noch umsetzbar ist.



Für dies alles würde ich empfehlen, mit den anderen Studenten austausch zu suchen, welche Aufgaben sie umsetzen wollen und wieviel aufwand sie planen. Zudem ist anzuraten, mit den Studenten, die ein Jahr weiter sind, austausch zu suchen, was von diesen umgesetzt wurde.

Für einen Anfänger in der Programmierung würde ich ein solches Programm je nach Ausführung auf mindestens 4 Wochen Vollzeit (!) ansetzen.

Beim Umsetzen wirst Du sicher viel lernen. Vor allem im Bereich Selbstdisziplin, Zeitmanagement und Projektrisikomanagement - möglicherweise durch Schmerzen.

Trotzdem viel Spass, aber begrenze Dein Risiko mit einem guten Plan B (inklusive Zeitplanung....)
 

Wildcard

Top Contributor
Projektmanagement Gast hat gesagt.:
4. Plan B entwerfen (Was mache ich, wenn es nicht umsetzbar ist
Dem kann ich uneingeschränkt zustimmen. Ein guter Plan B ist oftmals wichtiger als ein ambitionierter Plan A.
Die Eventualität muss immer sorgsam durchdacht sein.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben