Faisons dessiner du poker avec ruby ~ Implémentation 4 (Deck) ~

Aperçu

Faisons dessiner au poker avec ruby-Preparation-Faisons dessiner du poker avec la préparation de ruby-test-unit-Faisons tirer le poker avec ruby-Implementation 1 (carte) -Faisons tirer le poker avec ruby-Implementation 2 (rôle) -Faisons tirer le poker avec ruby-Implementation 3 (joueur) - Suivi par.

Source: https://github.com/rytkmt/ruby_poker

Mise en œuvre du deck

Oui, cette fois aussi, nous commencerons par organiser les exigences.

C'est comme ça?

Échange de main de joueur fixe

J'ai remarqué ici, mais dans l'implémentation précédente du joueur, il était implémenté en supprimant simplement de la carte de la main en échangeant la main. Modifiez pour récupérer les cartes à défausser ...

ruby_poker/player.rb


    def change(indexes:, new_cards:)
       raise(ArgumentError) unless indexes.size == new_cards.size
       raise(ArgumentError) unless indexes.all? { |i| (0..4).include?(i) }
-      indexes.sort.reverse_each { |i| @cards.delete_at(i) }
+      trushed = indexes.sort.reverse.each_with_object([]) { |i, trushed| trushed << @cards.delete_at(i) }
       @cards += new_cards
       @hand = Hand.new(cards: @cards)
+      trushed
     end

Créer un deck

ruby_poker/deck.rb


module RubyPoker
  class Deck
    def initialize
      @cards = init_cards
      @trushed = []
    end
  private

    def init_cards
      RubyPoker::SUITS.each_with_object([]) do |suit, cards|
        cards.concat(
          RubyPoker::NUMBERS.map { |number| Card.new(suit: suit, number: number) }
        )
      end.shuffle
    end
  end
end

Au début, je l'ai implémenté en utilisant + = dans each_with_object, mais si vous y réfléchissez bien, il s'agit d'une affectation de variable de ce qui a été combiné avec + avec =, donc un autre objet combiné avec la même variable Cela n'a pas fonctionné parce que je l'ai simplement stocké et que je n'ai fait aucun changement destructeur.

Utilisez concat pour changer de carte de manière destructive.

Collection de cartes par échange manuel

C'est facile car tout ce que vous avez à faire est de collecter et de conserver les cartes inutiles renvoyées par le «# change» du joueur.

ruby_poker/deck.rb


    def trush(cards:)
      @trushed += cards
    end

Tirage au sort

--Tirez n'importe quel nombre du jeu

ruby/ruby_poker/deck.rb


    def draw(count:)
      merge_trushed if @cards.size < count
      raise(ArgumentError, "No cards.") if @cards.size < count
      @cards.shift(count)
    end

  private

    def merge_trushed
      @cards += @trushed
      @cards.shuffle!
      @trushed = []
    end

J'ai l'impression que le nombre de joueurs n'est pas réglé correctement car ce n'est pas suffisant, j'ai donc essayé de lancer une erreur en supposant que cela ne se produira pas.

À la fin

Le pont était également simple. Est-ce la prochaine fois que vous implémentez la progression du jeu? Je pense.

Il est presque terminé. Je veux le terminer en 4 jours fériés consécutifs et je le ferai jusqu'au bout.

Recommended Posts

Faisons dessiner du poker avec ruby ~ Implémentation 4 (Deck) ~
Faisons tirer le poker avec ruby ~ Implémentation 1 (carte) ~
Faisons tirer le poker avec ruby ~ Implémentation 3 (joueur) ~
Faisons dessiner du poker avec ruby ~ Implémentation 2 (rôle) ~
Faisons dessiner du poker avec du rubis ~ Préparation ~
Faisons Draw Poker avec Ruby ~ Préparation de l'unité de test ~
Faisons une carte de Noël avec Processing!
Faisons un écran d'erreur avec Rails
Faisons une fonction de recherche avec Rails (ransack)
Faisons un Bot LINE avec Ruby + Sinatra - Partie 2
[Bases de Java] Créons un triangle avec une instruction for
Faisons un Bot LINE avec Ruby + Sinatra - Partie 1
Faisons dessiner du poker avec du rubis ~ Préparation ~
Faisons ressembler à des rails (vue)
Raclons avec Java! !!
Écrivons comment créer une API avec SpringBoot + Docker à partir de 0
Faisons une API simple avec EC2 + RDS + Spring boot ①