J'ai mis à jour mon propre blackjack réalisé avec Ruby pour mon portfolio

Blackjack fait au début ↓ ↓ J'ai fait un blackjack avec Ruby (j'ai essayé d'utiliser minitest)

Mettre à jour le contenu

règle

play.rb (classe de jeu)

play.rb


require './card'
require './deck'
require './judge'
require './money'
require './player'

class Play
    def initialize
        @player = Player.new
        @dealer = Player.new(name: 'Marchand')
        play
    end

    def message(title, choice1="frappé", choice2="supporter") # win or lose or draw or error
        case title
        when :win
            puts 'Vous gagnez'
        when :lose
            puts 'Tu as perdu'
        when :draw
            puts 'C'est un tirage au sort'
        when :error
            puts 'C'est invalide. Tapez à nouveau'
        when :choice
            puts "Veuillez sélectionner\s\sPush「 1 」→ #{choice1} 、Push「 2 」→ #{choice2}" 
        end
    end

    def dealer_turn
        #Traitement au stand (au tour du concessionnaire)
        puts 'C'est au tour du concessionnaire'
        wait
        #Manipulation du croupier lorsque le joueur est au blackjack
        if @player.blackjack?
            @dealer.draw
            @dealer.show
            if [email protected]?
                message :win
                @player.money.stock = @player.bet_judge(@@bet, :blackjack)
                @player.money.show
                return
            else
                message :draw
                @player.money.stock = @player.bet_judge(@@bet, :draw)
                @player.money.show
                return
            end
        end
        #Le processus que le croupier continue de frapper jusqu'à ce que le joueur gagne
        while true
            @dealer.draw
            @dealer.show
            wait
            if @dealer.burst?
                puts 'éclater!'
                message :win
                @player.money.stock = @player.bet_judge(@@bet, :win)
                @player.money.show
                break
            elsif @dealer.total_score == 21 && @player.total_score == 21
                message :draw
                @player.money.stock = @player.bet_judge(@@bet, :draw)
                @player.money.show
                break
            elsif @player.total_score < @dealer.total_score
                message :lose
                @player.money.stock = @player.bet_judge(@@bet, :lose)
                @player.money.show
                break
            end
        end
    end

    def bet_turn
        @player.money.show
        puts "Combien voulez-vous parier?"
        while true
            bet = gets.to_i
            if bet < 1
                message :error
                redo
            elsif bet > @player.money.stock.to_i
                puts "Votre enjeu est plus élevé que ce que vous avez. Tapez à nouveau."
                redo
            else
                puts <<~TEXT
                #{bet}J'ai fait un pari sur le yen.
                #{'-' * 41}
                TEXT
                return bet
            end
        end
    end

    def play
        while true #Traitement en boucle pour la relecture
            #Réinitialisation manuelle
            @player.reset
            @dealer.reset
            #Traitement au premier tour
            puts "Bienvenue au Blackjack"
            puts "Règle: vous gagnez si vous avez plus d'un million de yens. Vous perdez lorsque vous atteignez 0 yen."
            puts "Distribuer des cartes"
            @player.draw
            @player.draw
            @dealer.draw  
            @dealer.show
            @@bet = bet_turn
            @player.bet_calc(@@bet)
            @player.money.show
            #Traitement pour confirmer que le joueur n'est pas un blackjack
            if @player.blackjack?
                    puts "Jack noir!"
                    @player.show
            else
                @player.show
                message :choice
            end
            #Hit, traitement de stand (tour du joueur)
            while true
                #Dans le cas du blackjack, le processus de force
                if @player.blackjack?
                    command = 2
                else
                    command = gets.to_i #Choisissez hit ou stand
                end
                #Traitement en cas de hit
                if command == 1
                    while true
                        @player.draw
                        if @player.burst? #Vérifiez s'il y a une rafale
                            @player.show
                            puts "éclater! !!"
                            message :lose
                            @player.money.stock = @player.bet_judge(@@bet, :lose)
                            @player.money.show
                            break
                        end
                        #Confirmation du score total après tirage au sort
                        @player.show
                        #Dans le cas de la valeur maximale (21), le support est traité de force.
                        if @player.total_score == 21
                            puts 'Le score total a atteint le maximum'
                            command = 2
                            break
                        end
                        #Si ce n'est pas la valeur maximale, appuyez à nouveau ou procédez
                        puts "Souhaitez-vous le retirer à nouveau?"
                        message :choice
                        while true
                            command = gets.to_i #Encore une fois, frappez ou tenez la sélection
                            if command == 1
                                break
                            elsif command == 2
                                break
                            else
                                message :error
                                redo
                            end
                        end
                        #Manipulation de coup ou de stand
                        if command == 1 
                            redo
                        elsif command == 2
                            break
                        end
                    end
                    #Traitement de terminaison forcée au moment de la rafale
                    if @player.burst?
                        break
                    end
                elsif command == 2
                    dealer_turn
                    command = nil
                    break
                else
                    # h,Traitement lorsqu'une valeur autre que s est entrée
                    message :error
                    redo
                end

                if command == 2
                    dealer_turn
                    break
                end

            end
            #Jugement si le jeu est terminé
            if @player.gameover?
                puts "Le montant d'argent que j'ai est maintenant de 0 yen."
                puts "Le jeu est terminé."
                break
            elsif @player.win?
                puts "Le montant d'argent que j'ai a dépassé 1 million de yens."
                puts "Vous gagnez! !! !! !! !! !! Félicitations! !! !! !! !! !! !! !! !! !! !! !!"
                break
            end
            #Traitement de la relecture
            puts "Voulez-vous rejouer?"
            message :choice, "jouer", "Ne joue pas"
            while true
                command = gets.to_i #Choisissez de rejouer
                if command == 1
                    command = nil
                    break
                elsif command == 2
                    break
                else
                    message :error
                    redo
                end
            end
            #Traitement de la relecture

            command == nil ? redo : break
        end
    end

    def gameover

    end

    def wait(words='appuyez sur Entrée')
        puts words
        c = gets
    end
end

Play.new

card.rb (classe de carte)

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' || @number == 'A'
            10
        else
            @number.to_i
        end
    end
end

deck.rb (classe de pont)

deck.rb



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 = ["❤ Coeur\s\s\s\s", "♦ ︎ diamant\s\s\s\s", "♤ Pique\s\s", "♧ Trèfle"]
        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

    #Méthode de référence de la carte pour les tests
    def show
        52.times do |n|
            puts "[ #{cards[n].mark} #{cards[n].number} ]"
        end
    end

    def reset
        @cards = @cards.shuffle
        @@draw_count = 0
    end
end

player.rb (classe de joueur)

player.rb



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

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

    
    def show
        hands = []
        self.hands.each do |hand|
            hands << "#{hand.mark} #{hand.number}"
        end
        puts "#{self.name}Est dans ta main"
        puts hands
        puts  <<~TEXT
        #{puts "[total#{@total_score} ]"}
        -----------------------------------------
        TEXT
    end

    def a_count
        a = 0
        self.hands.each do |card|
            if card.number == 'A'
                a += 1
            end
        end
        a
    end
    
    def reset
        self.hands = []
        self.total_score = 0
        @@deck.reset
    end

    def total_score_calc
        @total_score = 0 #Si vous calculez plusieurs fois, réinitialisez le score total à chaque fois afin qu'il ne soit pas ajouté
        self.hands.each do |hand|   # @S'il y a un «A» dans le nombre et que le score total est de 22 ou plus, le score total est calculé par le nombre de «A».-9 Créez une méthode pour compter le nombre de «A».
            @total_score += hand.convert
        end
        if self.burst? && self.in_a?
            @total_score -= (self.a_count * 9)                #À partir du score total par le nombre de "A"-9 Créez une méthode pour compter le nombre de «A».
        end
        @total_score
    end

    def bet_calc(bet)
        self.money.stock  = self.money.stock.to_i - bet 
    end

    #Méthode d'essai

    def test
        puts "Test --------"
    end



    def reset_score
        self.total_score = 0
    end

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

# player = Player.new
# enemy  = Player.new
# player.draw
# player.draw
# enemy.draw
# enemy.draw
# player.hands
# player.total_score_calc
# enemy.total_score_calc
# p player.blackjack?
# p enemy.blackjack?

juge.rb (module de jugement)

judge.rb


module Judge

    def bet_judge(bet, judge)
        stock = self.money.stock
        case judge
        when :win
            stock += bet * 2
        when :lose
            stock += 0
        when :blackjack
            stock += bet * 3
        when :draw
            stock += bet
        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 = "Jack noir"
                true
            else
                false
            end
        else
            false
        end
    end

    def burst?
        self.total_score > 21 ? true : false
    end

    def in_a?
        self.hands.map do |card|
            if card.number == 'A'
                return true
            end
        end
        false
    end

    def gameover?
        self.money.stock <= 0 ? true : false
    end

    def win?
        self.money.stock > 1000000 ? true : false
    end

end

test.rb(minitest)

test.rb


require 'minitest/autorun'
require './card'
require './deck'
require './judge'
require './money'
require './player'
class BlackJackTest < Minitest::Test
    #La marque sur la carte de test est unifiée avec "♦ ︎"
    @@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?

        #faux motif
        # 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
        total_score_calc_player.reset
        total_score_calc_player.hands << @@test_A
        total_score_calc_player.hands << @@test_10
        total_score_calc_player.hands << @@test_5
        total_score_calc_player.total_score_calc
        assert_equal 16, total_score_calc_player.total_score
        total_score_calc_player.reset
        total_score_calc_player.hands << @@test_A
        total_score_calc_player.hands << @@test_J
        assert_equal 20, total_score_calc_player.total_score_calc
        total_score_calc_player.hands << @@test_5
        assert_equal 16, total_score_calc_player.total_score_calc
        total_score_calc_player.hands << @@test_A
        assert_equal 17, total_score_calc_player.total_score_calc
        # 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 10, @@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


    def test_a_count
        a_player = Player.new
        a_player.hands << @@test_A
        a_player.hands << @@test_A
        a_player.hands << @@test_A
        assert_equal 3, a_player.a_count
    end

    def test_bet_calc
        #assert_equal 19000, @@test_player.bet_calc(1000)
        
    end

    def test_bet_judge
        p @@test_player.money.stock -= 250 #Lit
        assert_equal 20250, @@test_player.bet_judge(250,  :win)
        assert_equal 19750, @@test_player.bet_judge(250,  :lose)
        assert_equal 20500, @@test_player.bet_judge(250,  :blackjack)
        assert_equal 20000, @@test_player.bet_judge(250,  :draw)
    end

end

Recommended Posts

J'ai mis à jour mon propre blackjack réalisé avec Ruby pour mon portfolio
J'ai fait un blackjack avec Ruby (j'ai essayé d'utiliser minitest)
J'ai fait un portfolio avec Ruby On Rails
J'ai créé mon propre outil Instagram automatique [Ruby]
[Paiza] J'ai créé mon propre utilitaire pour répondre aux questions [Java]
J'ai fait une mort risquée avec Ruby
[Ruby] J'ai fait un robot avec de l'anémone et du nokogiri.
J'ai fait un interpréteur (compilateur?) Avec environ 80 lignes en Ruby.
J'ai essayé DI avec Ruby
J'ai fait un adaptateur pour la classe de communication avec Retrofit2 + Rx2
J'ai recherché un framework web avec Gem en Ruby
J'ai créé une interface graphique avec Swing
J'ai créé et défini mon propre dialecte avec Thymeleaf et j'ai essayé de l'utiliser
Premiers pas avec Ruby pour les ingénieurs Java
[Ruby] J'ai créé un simple client Ping
J'ai fait diverses fonctions de la séquence de Fibonacci (Ruby)
J'ai créé un serveur écologique avec scala
J'ai créé un plug-in pour IntelliJ IDEA
J'ai créé une application Janken avec kotlin
J'ai créé une application Janken avec Android