Ich habe mit Ruby einen Blackjack gemacht (ich habe versucht, Minitest zu verwenden)

Ich habe mit Ruby einen Blackjack gemacht (ich habe versucht, Minitest zu verwenden)

Was ich dachte, als ich die Dateistruktur und den Code schrieb

Regel

--Kein Bett. (Geplant, zu einem späteren Zeitpunkt implementiert zu werden)

card.rb (Kartenklasse)

card.rb


class Card 
    attr_reader :mark, :number
    def initialize(mark, number)
        @mark   = mark.freeze
        @number = number.freeze
    end

    def convert
        if @number == 'J' || @number == 'Q' || @number == 'K'
            10
        elsif @number == 'A'
            1
        else
            @number.to_i
        end
    end
end

deck.rb (Deckklasse)

deck.rb


require './card'

class Deck
    attr_accessor :cards
    @@draw_count = 0

    def initialize
        @cards = []
        create
        @cards = @cards.shuffle
    end

    def create
        nums = ['A', 2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K']
        mark = ['❤︎', '♦︎', '♤', '♧']
        mark.each do |m|
            nums.each do |n|
                @cards << Card.new(m, n)
            end
        end
    end

    def draw
        cards[@@draw_count]
    end

    def draw_count
        @@draw_count += 1
    end

    #Kartenreferenzmethode zum Testen
    def show
        52.times do |n|
            puts "[ #{cards[n].mark} #{cards[n].number} ]"
        end
    end
end

player.rb (Spielerklasse)

player.rb


require './deck'
require './judge'


class Player
    include Judge
    attr_accessor :hands, :total_score, :name
    @@deck = Deck.new
    def initialize(name: "Spieler")
        @hands = []
        @total_score = 0
        @name = name
    end

    def draw
        self.hands << @@deck.draw
        self.total_score += @@deck.draw.convert
        @@deck.draw_count
    end

    
    def show
        puts "#{self.name}Ist in deiner Hand"
        self.hands.each do |hand|
            puts "[ #{hand.mark} #{hand.number} ]"
        end
        puts "[Gesamtpunktzahl#{@total_score} ]"
    end

    #Testmethode

    def test
        puts "Prüfung --------"
    end

    def total_score_calc
        self.hands.each do |hand|
            @total_score += hand.convert
        end
        #puts "gesamt"#{@total_score}」" 
    end

    def reset
        self.hands = []
        self.total_score = 0
    end

    def in_blackjack
        self.hands << Card.new("♦︎", "J")
        self.hands << Card.new("♦︎", "A")
    end
end

Judge.rb (Urteilsklasse)

judge.rb


module Judge
    # def game_judge(target)
    #     if self.total_score > target.total_score
    #         puts "Ihre Gesamtpunktzahl[ #{self.total_score} ]"
    #         puts "Gesamtpunktzahl des Händlers[ #{target.total_score} ]"
    #         puts 'Du gewinnst'
    #     elsif self.total_score == target.total_score
    #         puts "Ihre Gesamtpunktzahl[ #{self.total_score} ]"
    #         puts "Gesamtpunktzahl des Händlers[ #{target.total_score} ]"
    #         puts 'Es ist eine Zeichnung'
    #     else
    #         puts "Ihre Gesamtpunktzahl[ #{self.total_score} ]"
    #         puts "Gesamtpunktzahl des Händlers[ #{target.total_score} ]"
    #         puts 'Du verlierst'
    #     end
    # end

    def blackjack?
        if self.hands[1].number == "A" || self.hands[0].number == "A" 
            if  self.hands[0].number == "J" || self.hands[0].number == "Q"|| self.hands[0].number == "K" || \
                self.hands[1].number == "J" || self.hands[1].number == "Q"|| self.hands[1].number == "K"
                self.total_score = "schwarzer Jack"
                true
            else
                false
            end
        else
            false
        end
    end

    def burst?
        if self.total_score > 21
            true
        else
            false
        end
    end
end

test.rb (Funktionsprüfungstest)

test.rb


require 'minitest/autorun'
require './player'
class BlackJackTest < Minitest::Test
    #Die Markierung auf der Testkarte wird mit "♦ ︎" vereinheitlicht.
    @@test_J      = Card.new('♦︎', 'J')
    @@test_Q      = Card.new('♦︎', 'Q')
    @@test_K      = Card.new('♦︎', 'K')
    @@test_A      = Card.new('♦︎', 'A')
    @@test_5      = Card.new('♦︎', 5)
    @@test_10     = Card.new('♦︎', 10)
    @@test_player = Player.new

    def test_blackjack?
        blackjack_player = Player.new
        blackjack_player.hands << @@test_A
        blackjack_player.hands << @@test_J
        assert blackjack_player.blackjack?

        blackjack_player.reset
        blackjack_player.hands << @@test_J
        blackjack_player.hands << @@test_A
        assert blackjack_player.blackjack?

        blackjack_player.reset
        blackjack_player.hands << @@test_Q
        blackjack_player.hands << @@test_A
        assert blackjack_player.blackjack?

        blackjack_player.reset
        blackjack_player.hands << @@test_A
        blackjack_player.hands << @@test_Q
        assert blackjack_player.blackjack?

        blackjack_player.reset
        blackjack_player.hands << @@test_A
        blackjack_player.hands << @@test_K
        assert blackjack_player.blackjack?

        blackjack_player.reset
        blackjack_player.hands << @@test_K
        blackjack_player.hands << @@test_A
        assert blackjack_player.blackjack?

        #falsches Muster
        # blackjack_player.reset
        # blackjack_player.hands << @@test_A
        # blackjack_player.hands << @@test_10
        # assert blackjack_player.blackjack?

        # blackjack_player.reset
        # blackjack_player.hands << @@test_5
        # blackjack_player.hands << @@test_5
        # assert blackjack_player.blackjack?

        # blackjack_player.reset
        # blackjack_player.hands << @@test_J
        # blackjack_player.hands << @@test_Q
        # assert blackjack_player.blackjack?
        

    end

    def test_burst?
        burst_player = Player.new
        burst_player.hands << @@test_J
        burst_player.hands << @@test_J
        burst_player.hands << @@test_5
        burst_player.total_score_calc
        burst_player.total_score
        assert burst_player.burst?
        # false
        # burst_player.reset
        # burst_player.hands << @@test_10
        # burst_player.total_score
        # assert burst_player.burst?
    end

    def test_total_score_calc
        total_score_calc_player = Player.new
        total_score_calc_player.hands << @@test_10
        total_score_calc_player.hands << @@test_5
        total_score_calc_player.total_score_calc
        assert_equal 15, total_score_calc_player.total_score
        # false
        #assert_equal 10, total_score_calc_player.total_score
    end

    def test_convert
        assert_equal 10, @@test_J.convert
        assert_equal 10, @@test_Q.convert
        assert_equal 10, @@test_K.convert
        assert_equal 1, @@test_A.convert
        assert_equal 5, @@test_5.convert
    end

    def test_draw_count
        deck = Deck.new
        assert_equal 1, @@test_player.draw
        assert_equal 2, @@test_player.draw
        assert_equal 3, @@test_player.draw
    end
end

main.rb (Hauptdatei, in der Blackjack ausgeführt wird)

main.rb


require './player'

lose_message =<<~TEXT
Du verlierst
TEXT
win_message =<<~TEXT
Du gewinnst
TEXT
game_draw_message =<<~TEXT
Es ist eine Zeichnung
TEXT
error_message = "Ungültiges Zeichen. Tippen Sie es wieder ein"


class Play
    attr_accessor :player, :dealer

    def initialize
        @player = Player.new
        @dealer = Player.new(name: "Händler")
    end

    def test
        @player.draw
        @player.draw
        @player.show
    end
end

while true #Schleifenverarbeitung für die Wiedergabe
    #Verarbeitung der ersten Runde
    player = Player.new
    dealer = Player.new(name: "Händler")
    puts "Willkommen bei Blackjack"
    puts "Karten verteilen"
    player.draw
    player.draw
    dealer.draw  
    dealer.show
    #Blackjack Test
    # dealer.reset
    # dealer.in_blackjac 
    # dealer.show
    # player.reset
    # player.in_blackjack
    # player.show

    #Verarbeitung, um zu bestätigen, dass der Spieler kein Blackjack ist
    if player.blackjack?
            puts "schwarzer Jack!"
            player.show
    else
        player.show
        puts h_or_s_message =<<~TEXT
Bitte auswählen
        Push「h」,schlagen
        Push「s」,Stand
        TEXT
    end

    #Treffer, Standverarbeitung (Spieler ist an der Reihe)
    while true
        #Im Falle von Blackjack der Prozess des gewaltsamen Stehens
        if player.blackjack?
            command = 's'
        else
            command = gets.chomp #Wählen Sie Treffer oder Stand
        end
        #Bearbeitung bei Treffer
        if command == "h"
            while true
                player.draw
                if player.burst? #Überprüfen Sie, ob ein Burst vorliegt
                    player.show
                    puts "platzen! !!"
                    puts lose_message
                    break
                end
                #Bestätigung der Gesamtpunktzahl nach der Auslosung
                player.show
                #Beim Maximalwert (21) wird der Stand zwangsweise bearbeitet.
                if player.total_score == 21
                    puts 'Die Gesamtpunktzahl hat das Maximum erreicht'
                    command = 's'
                    break
                end
                #Wenn es nicht der Maximalwert ist, drücken Sie erneut oder verarbeiten Sie
                puts "Möchten Sie es noch einmal ziehen?"
                puts h_or_s_message
                while true
                    command = gets.chomp #Wieder schlagen oder stehen Auswahl
                    if command == 'h'
                        break
                    elsif command == 's'
                        break
                    else
                        puts error_message
                        redo
                    end
                end
                #Schlag- oder Standhandhabung
                if command == 'h' 
                    redo
                elsif command == 's'
                    break
                end
            end
            #Erzwungene Terminierungsverarbeitung zum Zeitpunkt des Bursts
            if player.burst?
                break
            end
        else
            # h,Verarbeitung, wenn andere als s eingegeben werden
            puts error_message
            redo
        end
        #Bearbeitung am Stand (Händler an der Reihe)
        if command == 's'
            #Dealer-Handling, wenn der Spieler Blackjack ist
            if player.blackjack?
                dealer.draw
                dealer.show
                if !dealer.blackjack?
                    puts win_message
                    break
                else
                    puts game_draw_message
                    break
                end
            end
            #Der Prozess, den der Dealer so lange durchführt, bis der Spieler gewinnt
            while player.total_score > dealer.total_score
                dealer.draw
                dealer.show
                if dealer.burst?
                    puts 'platzen!'
                    puts win_message
                    break
                elsif dealer.total_score == 21 && player.total_score == 21
                    break
                end
            end
            if dealer.burst? #Wenn es einen Burst gibt, endet die Verarbeitung
                break
            elsif dealer.total_score == 21 && player.total_score == 21 #Überprüfen Sie, ob die anderen den Maximalwert nicht erreicht haben
                puts game_draw_message
                break
            else
                puts lose_message
                break
            end
        end
    end
    #Wiederholungsverarbeitung
    puts <<~TEXT
Möchten Sie noch einmal spielen?
Bitte auswählen
    Push「h」,Ja
    Push「s」,Nein
    TEXT
    while true
        command = gets.chomp #Wählen Sie die Wiedergabe
        if command == "h"
            command = nil
            break
        elsif command == "s"
            break
        else
            puts error_message
            redo
        end
    end
    #Wiederholungsverarbeitung
    if command == nil
        redo
    else
        break
    end
end

Was ich gelernt habe

Zuerst habe ich "p" anstelle von minitest verwendet, aber Ich habe verstanden, dass die Arbeit schneller sein würde, wenn ich sie verwenden würde.

Wenn Sie nicht "test" in das erste Wort des Methodennamens von minitest einfügen Ich habe völlig vergessen, es nicht zu testen und ich war besorgt über 2 Tage, aber lol

Sie werden Ihr Verständnis vertiefen, wenn Sie Dinge, die Sie noch nie benutzt haben, aktiv nutzen.

Es gibt noch viele Orte, die umgestaltet werden können, Ich war es fast leid, es zu schaffen, also schrieb ich einmal Qiita.

Recommended Posts

Ich habe mit Ruby einen Blackjack gemacht (ich habe versucht, Minitest zu verwenden)
Ich habe DI mit Ruby versucht
Ich habe versucht, JOOQ mit Gradle zu verwenden
Ich habe meinen eigenen mit Ruby erstellten Blackjack für mein Portfolio aktualisiert
Ich habe versucht, Realm mit Swift UI zu verwenden
Ich habe versucht, Scalar DL mit Docker zu verwenden
Ich habe versucht, OnlineConverter mit SpringBoot + JODConverter zu verwenden
Ich habe mit Ruby einen riskanten Würfel gemacht
Ich habe versucht, OpenCV mit Java + Tomcat zu verwenden
Ich habe versucht, Gson zu benutzen
Ich habe versucht, TestNG zu verwenden
Ich habe versucht, Galasa zu benutzen
Ich habe mit Ruby On Rails ein Portfolio erstellt
[Ruby] Ich habe einen Crawler mit Anemone und Nokogiri gemacht.
Ich habe versucht, Azure Cloud-Init zu verwenden
Ich habe versucht, Apache Wicket zu verwenden
Ich habe versucht, Java REPL zu verwenden
Ich habe UPSERT mit PostgreSQL ausprobiert.
Ich habe BIND mit Docker ausprobiert
Ich habe versucht, das Ruby on Rails-Plugin mit vim-plug zu installieren
Ich habe einen Interpreter (Compiler?) Mit ungefähr 80 Zeilen in Ruby erstellt.
Ich habe versucht, mit Swagger mit Spring Boot zu beginnen
Ich habe versucht, die CameraX-Bibliothek mit Android Java Fragment zu verwenden
Ich habe jetzt versucht, Anakia + Jing zu verwenden
Ich habe versucht, Spring + Mybatis + DbUnit zu verwenden
Ich habe eine morphologische Analyse mit MeCab versucht
Ich habe mit Swing eine GUI erstellt
Ich habe versucht, mit Java zu interagieren
Ich habe versucht, UDP mit Java zu kommunizieren
Ich habe versucht, die Java8 Stream API zu verwenden
Ich habe versucht, JWT in Java zu verwenden
Ich habe GraphQL mit Spring Boot ausprobiert
[Android] Ich habe versucht, das Koordinatorlayout zu verwenden.
Ich habe Flyway mit Spring Boot ausprobiert
Ich habe versucht, Pari GP Container zu verwenden
Ich habe versucht, WebAssembly Stadio (Version 2018/4/17) zu verwenden.
Ich habe versucht, Slim mit Scaffold anzupassen
Ich habe versucht, Java Memo LocalDate zu verwenden
Ich habe versucht, Google HttpClient von Java zu verwenden
Ich habe mit JD-Core eine Befehlszeilenschnittstelle mit dem WinMerge Plugin erstellt
Ich habe versucht, das Problem der "mehrstufigen Auswahl" mit Ruby zu lösen
Ich habe versucht, mithilfe von JDBC Template mit Spring MVC eine Verbindung zu MySQL herzustellen
Ich habe versucht, Ruby's Float (arg, Ausnahme: true) mit Builtin neu zu implementieren
Ich habe versucht, die Elasticsearch-API in Java zu verwenden
[Ruby] Ich habe einen einfachen Ping-Client erstellt
Ich habe versucht, das Java-Diagnosetool Arthas zu verwenden
Ich habe versucht, UICollectionViewListCell zu verwenden, das von Xcode12 hinzugefügt wurde.
Ich habe mit Thymeleaf meinen eigenen Dialekt erstellt und eingestellt und versucht, ihn zu verwenden
Ich habe versucht, mit Web Assembly zu beginnen
Ich habe verschiedene Funktionen der Fibonacci-Sequenz (Ruby) erstellt.
Ich habe einen Öko-Server mit Scala gemacht
Hinweise zur Verwendung von FCM mit Ruby on Rails
Ich habe mit Studyplus zeitsparendes Management-Lernen versucht.
Es ist neu, aber ich habe versucht, Groonga zu verwenden
Ich habe versucht, ein wenig mit BottomNavigationView zu spielen ①
Ich habe versucht, das Problem der Tribonacci-Sequenz in Ruby mit Wiederholung zu lösen.
Ich habe Lazy Initialization mit Spring Boot 2.2.0 ausprobiert