Java-Anfänger machen Pokerspiele in 4 Tagen (2. Tag)

Motivation und Zweck

Ich habe gestern (21.06.) Begonnen zu lernen, um ein wenig über Java zu lernen. Ich habe die Grundlagen von Java mit progate am 21.06. Gelernt, also werde ich es ausgeben. Es war okay, irgendetwas zu machen, aber ich würde gerne den Gehirnsport "Texas Holdem" machen, den ich liebe.

Um die Produktionsquellen für die Beschäftigung zu erhöhen, habe ich mich entschlossen, den Lernverlauf hier im Tagebuch zu notieren.

Pläne

Tag 1: Erfahren Sie mehr über Java mit progate (weggelassen) Tag 2 und 3: Vorerst umgesetzt (ich wünschte, ich könnte es tun) Tag 4: Ordnen Sie den Code entsprechend der Objektorientierung an (geplant)

Implementierungsfunktion (der Einfachheit halber einfach)

** Spieler spielen nur für sich und ihren Gegner (CPU) Die CPU bestimmt die Aktion durch Zufallszahlen, nicht durch Handstärke BTN ist immer auf der anderen Seite ohne Jalousien Beenden Sie, wenn einer der Chips leer ist **

In Umsetzung ** Ein Deck erstellen Deck mischen Verteile deine Hand an den Spieler ** Es gab eine sehr leicht verständliche Seite für die Verarbeitung von, daher habe ich diese als Referenz verwendet. Ein Muss für alle, die etwas in Java machen wollen! Erstellen eines Spiels für diejenigen, die das Einführungsbuch gelesen haben

Die Funktionen, die am zweiten Tag implementiert werden könnten ** Preflop-Sequenz ** Es dauerte nur eine Weile, um zu verstehen, wie Werte als Referenz übergeben werden

Codekommentar

public static void main(String[] args) {

System.out.println ("Sitzung starten! Viel Glück!"); //デッキを作成

	List <Integer> deck = new ArrayList<>(52);

//デッキをシャッフル shuffleDeck(deck);

//プレイヤーの手札リストを生成 List hero = new ArrayList<>(); List enemy = new ArrayList<>();

//プレイヤーにカードを二枚ずつ配る hero.add(deck.get(0)); enemy.add(deck.get(1)); hero.add(deck.get(2)); enemy.add(deck.get(3));

//山札の進行状況を記録する変数deckCountを定義 int deckCount = 4;

//プレイヤーの持っているチップを定義(初期値100)potも定義(初期値0) int list[] = {100,100,0,0,0};

// [0] Heldenchip (Selbst) / // [1] feindlicher Chip / //[2] pot/ //[3] needChiptoCall //[4]foldFlag
//===foldFlag=== // 0 nicht gefaltet // 1 Held ist gefaltet // 2 Feind ist gefaltet

	Scanner scan = new Scanner(System.in);

//プリフロップの処理 preFlop(hero, list, scan); //各プレイヤーのアクションの後にneedtocallが0の場合にそのストリートが終了したとできる while(true) { enemyAction(list); if(list[4] == 2) { System.out.println ("Feind ist aus Heldengewinnen ausgestiegen"); break; }else if(list[3] == 0) { System.out.println ("Gehe zum Flop"); break; } preFlop(hero, list, scan);

    	if(list[4] == 1) {

System.out.println ("Held hat Feind gewonnen"); break; }else if(list[3] == 0) { System.out.println ("Gehe zum Flop"); break; } }

//ターン、リバーの処理 //ショーダウン。勝敗の決定 //チップの移動 //チップがなくなったら終了

Ich weiß noch nichts Technisches, daher ist es eine schmutzige Möglichkeit, die erforderlichen Daten in die Array-Liste aufzunehmen und vollständig zu übergeben.

Handlung von dir (Held)

Beim Poker gibt es fünf grundlegende Aktionen: Überprüfen, callen, wetten, erhöhen und folden. Wenn die Wette (Erhöhung) des Gegners nicht enthalten ist, gibt es zwei Arten: "check, bet" Wenn die Wette (Erhöhung) des Gegners enthalten ist, gibt es drei Arten von Aktionen: "callen, erhöhen, folden". Sie sind als "checkBet" - bzw. "callRaiseFold" -Methoden definiert. (Es gibt keinen Sinn zu benennen) checkBet

 private static boolean checkBet(int list[], String str, Scanner scan){

if ("c" .equals (str)) {// Verarbeitung bei Prüfung //相手に回す System.out.println ("geprüft"); return true; } else if ("b" .equals (str)) {// Beim Wetten. Hören Sie sich den Einsatzbetrag an und bewegen Sie den Chip. //ベット額を聞く while(true) { System.out.println ("Wie viel möchten Sie setzen? Maximum" + Liste [0] + "$"); int bet = scan.nextInt(); if (Wette <= Liste [0] && Wette> = Liste [2]) {// Wenn der Einsatzbetrag den Betrag überschreitet, den Sie haben, und wenn er unter dem Pot liegt bet(list, bet); break; }else { System.out.println ("Der Einsatzbetrag ist falsch. Bitte geben Sie den richtigen Wert ein"); } } return true; }else { return false; } }

callRaiseFold private static boolean callRaiseFold(int list[], String str, Scanner scan){ if ("c" .equals (str)) {// Was tun, wenn Sie aufrufen? //相手に回す System.out.println ("aufgerufen"); return true; } else if ("r" .equals (str)) {// Beim Wetten. Hören Sie sich den Einsatzbetrag an und bewegen Sie den Chip. //ベット額を聞く while(true) { System.out.println ("Wie viel möchten Sie erhöhen? Maximum" + list [0] + "$"); int raise = scan.nextInt(); if (erhöhen <= Liste [0] && erhöhen> = Liste [3]) {// Wenn der Gespenstbetrag den Betrag überschreitet, den Sie haben, und wenn er kleiner als der vorherige Einsatz ist (erhöhen) raise(list, raise); break; }else { System.out.println ("Der Erhöhungsbetrag ist falsch. Bitte geben Sie den richtigen Wert ein"); } } return true; }else if("f".equals(str)){ System.out.println ("fold"); list[4] = 1; return true; }else { return false; } }

Als boolescher Typ definiert. Wenn die Eingabe über die Befehlszeile ungültig ist, wird false zurückgegeben und eine Schleife ausgeführt. Außerdem wird beim Fold die Liste [4] als foldFlag festgelegt, 1 beim Fold des Helden und 2 beim Fold des Feindes. (Standard ist 0)

Aktion der anderen Partei (Feind)

Verwenden Sie die Zufallsbibliothek, um Zufallszahlen zu generieren, durch Zahlen zu teilen, Aktionen zu klassifizieren und zu bestimmen. Ich mag die switch-Anweisung sehr, weil sie leicht zu lesen ist.

private static void feindAction (int list []) {// Feindliche Aktion (variiert mit Zufallszahlen) Random rand = new Random(); int randomValue = rand.nextInt (100); // Zufallszahlen generieren

	if(list[3] == 0) {//check or bet
		switch(randomValue%2) {

Fall 0: // Überprüfen System.out.println ("Feind überprüft."); break; Fall 1: // Wette int bet = list [2]; // Der Einsatzbetrag ist auf die Potgröße festgelegt System.out.println ("Ememy Bet" + Bet + "."); //手持ちチップを減らし、ポットをふやす、needtoCallも増やす list[1] = list[1] - bet; list[2] = list[2] + bet; list[3] = bet; break; } }else {//call or raise or fold switch(randomValue % 3) { Fall 0: // aufrufen System.out.println ("Feind gerufen."); //手持ちチップを減らしポットをふやす。needtocallをリセット list[1] = list[1] - list[3]; list[2] = list[2] + list[3]; list[3] = 0; break; case 1: int raise = list[3] * 2; if(raise >= list[1]) { raise = list[1]; System.out.println ("Ememy is All-in."); }else { System.out.println ("Ememy erhöht auf" + erhöhen + "."); } // Needtocall-Raise = nächster Needtocall list[1] = list[1] - raise; list[2] = list[2] + raise; list[3] = list[3] - raise; break; case 2: System.out.println ("Feind gefaltet"); list[4] = 2; break; } } }

Preflop-Verarbeitung

Ob es einen Raise gibt (Voraus zum Flop) oder nicht, wird danach beurteilt, ob Liste [3] 0 ist oder nicht. Ich habe eine Weile gebraucht, um zu entscheiden, was ich hier tun soll. Ich habe es mir in einem öffentlichen Bad ausgedacht. Wenn die Eingabe fehlerhaft ist, fordern Sie die Eingabe erneut an. Wenn foldFlag festgelegt ist, fahren Sie mit dem Gewinnen oder Verlieren fort.

private static void preFlop(List<Integer> hero, int list[], Scanner scan) {
	printData(hero, list);

if (list [3] == 0) {// Wenn Needchiptocall 0 ist, dh wenn keine Wette erhöht wird while(true) { System.out.println ("Bitte wählen Sie eine Aktionsprüfung aus: c oder Wette: b"); String str = scan.next(); boolean flag = checkBet(list, str, scan); if(flag == true) { break; }else { System.out.println ("Falsche Eingabe!"); } } }else { while(true) { System.out.println ("Bitte wählen Sie einen Aktionsaufruf aus: c oder erhöhen: r oder falten: f"); String str = scan.next(); boolean flag = callRaiseFold(list, str, scan); if(flag == true) { break; }else { System.out.println ("Falsche Eingabe!"); } } } }

Ausführungsergebnis

Starten Sie eine Sitzung! Viel Glück! Deine Hand ist ♥ A ♣ K. Sie haben 100 Chips Der Topf ist 0 Bitte wählen Sie eine Aktionsüberprüfung: c oder Wette: b b Wie viel möchten Sie wetten? Bis zu 100 $ 3 Ich wette 3 $ Der Feind erhöhte auf 6 $. Deine Hand ist ♥ A ♣ K. Ihr Chip ist 97 Der Topf ist 9 Bitte wählen Sie einen Aktionsaufruf: c oder erhöhen: r oder folden: f r Wie viel erhöhen Sie? Bis zu 97 $ 30 Auf 30 $ erhöht Feind gerufen. Geh zum Flop

Übermorgen

Wenn Sie die Aktionsmethode verwenden, können Sie die Turn- und River-Verarbeitung problemlos implementieren. Ich weiß immer noch nicht, wie ich über das Ergebnis der Hand (Rolle) entscheiden soll. Es scheint, dass es einige Zeit dauern wird Mein verlegter Nacken tut weh (ziemlich)

Normalerweise schreibe ich keine Sätze + es ist nicht zum Zeigen für Leute gedacht, also bitte vergib mir, dass ich schwer zu lesen bin ...

Recommended Posts

Java-Anfänger machen Pokerspiele in 4 Tagen (2. Tag)
Java-Anfänger machen Pokerspiele in 4 Tagen (3. Tag)
Machen Sie einen Blackjack mit Java
Refactoring: Machen Sie Blackjack in Java
Anfänger spielen Janken-Spiele in Java
[Für Anfänger] Führen Sie Selenium auf Java aus
Neuer Ingenieur, der in 100 Tagen (2. Tag) eine sein wird
Neuer Ingenieur, der in 100 Tagen einer sein wird (Tag 0)
Neuer Ingenieur, der in 100 Tagen (5. Tag) eine sein wird
Neuer Ingenieur, der in 100 Tagen (6. Tag) eine sein wird
Neuer Ingenieur, der in 100 Tagen (1. Tag) eine sein wird
Neuer Ingenieur, der in 100 Tagen (4. Tag) eine sein wird
Neuer Ingenieur, der in 100 Tagen (2. Tag) eine sein wird
26. Tag des Ingenieurs, der in 100 Tagen vollwertig sein wird
28. Tag des Ingenieurs, der in 100 Tagen vollwertig sein wird
Java-Anfänger machen Pokerspiele in 4 Tagen (3. Tag)
[Java] Anfänger wollen Dating machen. 1
Java Day 2018
Ich wollte (a == 1 && a == 2 && a == 3) in Java wahr machen
Repräsentiert "nächster Tag" und "vorheriger Tag" in Java / Android
[Java-Anfängerangst] In Junit implementierter schwer zu testender Code