** card.rb (classe de carte) **
J'ai utilisé attr_reader pour que les données de chaque carte ne puissent pas être réécrites (afin que les données ne soient pas corrompues).
** deck.rb (classe de pont) ** --Au stade de l'instanciation, je me suis assuré que le deck était mélangé et l'ai testé.
J'ai écrit la génération de deck de manière aussi concise que possible en utilisant chaque déclaration.
En utilisant des variables de classe, lorsque vous piochez une carte, il compte maintenant le nombre de cartes de votre deck qui sont tirées.
** player.rb (classe de joueur) ** --Commun aux joueurs et aux concessionnaires, afin d'utiliser le même deck, j'ai assigné une instance du deck à la variable de classe et utilisé le deck.
** juge.rb (classe de jugement) ** ――La classe pour juger, par souci de clarté, j'ai osé utiliser un module séparément du lecteur.
** test.rb (test de contrôle de fonctionnement) ** --minitest est * "Introduction à Ruby pour ceux qui veulent devenir un professionnel" *, et je ne l'ai pas utilisé depuis que je l'ai écrit, donc je l'ai utilisé pour approfondir ma compréhension.
** main.rb (fichier principal qui exécute le blackjack) **
Pour plus de clarté, je n'ai d'abord écrit que le flux global du jeu À partir de là, j'ai pensé aux classes et méthodes nécessaires et les ai ajoutées.
--Pas de lit. (Prévu pour être mis en œuvre à une date ultérieure)
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
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
    #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
end
player.rb
require './deck'
require './judge'
class Player
    include Judge
    attr_accessor :hands, :total_score, :name
    @@deck = Deck.new
    def initialize(name: "joueur")
        @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}Est dans ta main"
        self.hands.each do |hand|
            puts "[ #{hand.mark} #{hand.number} ]"
        end
        puts "[Score total#{@total_score} ]"
    end
    #Méthode d'essai
    def test
        puts "Test --------"
    end
    def total_score_calc
        self.hands.each do |hand|
            @total_score += hand.convert
        end
        #puts "total"#{@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
module Judge
    # def game_judge(target)
    #     if self.total_score > target.total_score
    #         puts "Votre score total[ #{self.total_score} ]"
    #         puts "Score total du concessionnaire[ #{target.total_score} ]"
    #         puts 'Vous gagnez'
    #     elsif self.total_score == target.total_score
    #         puts "Votre score total[ #{self.total_score} ]"
    #         puts "Score total du concessionnaire[ #{target.total_score} ]"
    #         puts 'C'est un tirage au sort'
    #     else
    #         puts "Votre score total[ #{self.total_score} ]"
    #         puts "Score total du concessionnaire[ #{target.total_score} ]"
    #         puts 'Tu as perdu'
    #     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?
        if self.total_score > 21
            true
        else
            false
        end
    end
end
test.rb
require 'minitest/autorun'
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
        # 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
require './player'
lose_message =<<~TEXT
Tu as perdu
TEXT
win_message =<<~TEXT
Vous gagnez
TEXT
game_draw_message =<<~TEXT
C'est un tirage au sort
TEXT
error_message = "Caractère non valide. Tapez à nouveau"
class Play
    attr_accessor :player, :dealer
    def initialize
        @player = Player.new
        @dealer = Player.new(name: "Marchand")
    end
    def test
        @player.draw
        @player.draw
        @player.show
    end
end
while true #Traitement en boucle pour la relecture
    #Traitement au premier tour
    player = Player.new
    dealer = Player.new(name: "Marchand")
    puts "Bienvenue au Blackjack"
    puts "Distribuer des cartes"
    player.draw
    player.draw
    dealer.draw  
    dealer.show
    #Test de Blackjack
    # dealer.reset
    # dealer.in_blackjac 
    # dealer.show
    # player.reset
    # player.in_blackjack
    # player.show
    #Traitement pour confirmer que le joueur n'est pas un blackjack
    if player.blackjack?
            puts "Jack noir!"
            player.show
    else
        player.show
        puts h_or_s_message =<<~TEXT
Veuillez sélectionner
        Push「h」,frappé
        Push「s」,supporter
        TEXT
    end
    #Hit, traitement de stand (tour du joueur)
    while true
        #Dans le cas du blackjack, le processus de force
        if player.blackjack?
            command = 's'
        else
            command = gets.chomp #Choisissez hit ou stand
        end
        #Traitement en cas de hit
        if command == "h"
            while true
                player.draw
                if player.burst? #Vérifiez s'il y a une rafale
                    player.show
                    puts "éclater! !!"
                    puts lose_message
                    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 = 's'
                    break
                end
                #Si ce n'est pas la valeur maximale, appuyez à nouveau ou procédez
                puts "Souhaitez-vous le retirer à nouveau?"
                puts h_or_s_message
                while true
                    command = gets.chomp #Encore une fois, frappez ou tenez la sélection
                    if command == 'h'
                        break
                    elsif command == 's'
                        break
                    else
                        puts error_message
                        redo
                    end
                end
                #Manipulation de coup ou de stand
                if command == 'h' 
                    redo
                elsif command == 's'
                    break
                end
            end
            #Traitement de terminaison forcée au moment de la rafale
            if player.burst?
                break
            end
        else
            # h,Traitement lorsqu'une valeur autre que s est entrée
            puts error_message
            redo
        end
        #Traitement au stand (au tour du concessionnaire)
        if command == 's'
            #Manipulation du croupier lorsque le joueur est au blackjack
            if player.blackjack?
                dealer.draw
                dealer.show
                if !dealer.blackjack?
                    puts win_message
                    break
                else
                    puts game_draw_message
                    break
                end
            end
            #Le processus que le croupier continue de frapper jusqu'à ce que le joueur gagne
            while player.total_score > dealer.total_score
                dealer.draw
                dealer.show
                if dealer.burst?
                    puts 'éclater!'
                    puts win_message
                    break
                elsif dealer.total_score == 21 && player.total_score == 21
                    break
                end
            end
            if dealer.burst? #S'il y a une rafale, le traitement se termine
                break
            elsif dealer.total_score == 21 && player.total_score == 21 #Vérifiez si l'un et l'autre n'ont pas atteint la valeur maximale
                puts game_draw_message
                break
            else
                puts lose_message
                break
            end
        end
    end
    #Traitement de la relecture
    puts <<~TEXT
Voulez-vous rejouer?
Veuillez sélectionner
    Push「h」,Oui
    Push「s」,Non
    TEXT
    while true
        command = gets.chomp #Choisissez de rejouer
        if command == "h"
            command = nil
            break
        elsif command == "s"
            break
        else
            puts error_message
            redo
        end
    end
    #Traitement de la relecture
    if command == nil
        redo
    else
        break
    end
end
Au début, j'ai utilisé "p" au lieu de minitest, mais J'ai compris que le travail serait plus rapide si je l'utilisais.
Si vous ne mettez pas "test" dans le premier mot du nom de méthode du minitest J'ai complètement oublié de ne pas le tester et j'étais inquiet 2 jours mais lol
Vous approfondirez votre compréhension si vous utilisez activement des choses que vous n'avez jamais utilisées.
Il y a encore de nombreux endroits qui peuvent être refactorisés, J'étais presque fatigué de le faire, alors j'ai écrit Qiita une fois.
Recommended Posts