Faisons dessiner au poker avec ruby-Preparation- ↓ Faisons dessiner du poker avec la préparation de ruby-test-unit-
Suivi par.
Source: https://github.com/rytkmt/ruby_poker
À partir de ce moment, je vais enfin commencer à l'implémenter.
Je pense que l'extrémité mobile la plus simple au poker est une carte, donc je vais la faire à partir de la carte. Organisons les informations.
--Nombre --Soothe (symbole)
Tout d'abord, toutes les cartes le contiennent, alors implémentez ceci.
ruby_poker/card.rb
module RubyPoker
  class Card
    attr_reader :suit, :number
    def initialize(suit:, number:)
      @suit = suit
      @number = number
    end
  end
end
Et lisez pour un nouveau fichier
ruby_poker.rb
require "ruby_poker/card"
Je pense que c'est la fin et pense à la prochaine fois que j'utiliserai la carte.
Les cartes utilisent des nombres et de la suie pour créer des «rôles», et le rôle est jugé, alors suffit-il de se référer à la carte? J'ai aussi pensé, Si vous vérifiez l'explication du rôle en détail, il est dit qu'il y a des forces et des faiblesses entre les cartes, comme le jugement en fonction de la force des cartes utilisées dans le rôle dans le cas du même rôle.
Par exemple, dans le cas de «deux cartes» --Plus le nombre est élevé mieux c'est ――Si les chiffres sont les mêmes, celui avec la suie la plus forte l'emporte
Comme confirmé dans la section préparation, l'ordre est le suivant.
――Si deux joueurs jouent le même rôle, la carte la plus forte qui compose le rôle l'emporte.
Puisqu'il semble qu'il puisse être jugé par le numéro d'élément du tableau, définissez-le (puisque les définitions sont disposées par ordre de force, inversez l'ordre lors de la prise d'index)
ruby_poker.rb
module RubyPoker
  NUMBERS = ([1] + [*2..13].reverse).freeze
  SUITS = %i[spade heart diamond club].freeze
end
De plus, comme c'est un gros problème, je l'utilise également pour la vérification des arguments du côté card.rb
ruby_poker/card.rb
    def initialize(suit:, number:)
+      raise(ArgumentError) unless RubyPoker::SUITS.include?(suit)
+      raise(ArgumentError) unless RubyPoker::NUMBERS.include?(number)
En outre, comme cas d'utilisation pour juger de la force de l'élément, les éléments suivants ont été pris en compte.
Concernant 1, je veux prendre le plus fort parmi plusieurs, donc max
En ce qui concerne 2, grande et petite comparaison > etc.
Donc, si vous utilisez Comparable et implémentez <=>, il sera résolu (max est jugé par<=>Array # max ja / dernier / method / Array / i / max.html))
Si vous comparez des nombres avec des nombres simples, «1» sera le plus faible, alors comparez correctement en fonction de «index»
ruby_poker/card.rb
module RubyPoker
  class Card
+   include Comparable
    attr_reader :suit, :number
ruby_poker/card.rb
    def suit_level
      RubyPoker::SUITS.reverse.index(@suit)
    end
    def number_level
      RubyPoker::NUMBERS.reverse.index(@number)
    end
    def <=>(other)
      number_comparision = number_level <=> other.number_level
      number_comparision.zero? ? suit_level <=> other.suit_level : number_comparision
    end
Implémentez facilement des cas de test * test-unit est la première fois, alors dites-moi s'il existe une bonne façon de le décrire
require "test_helper"
module RubyPoker
  class CardTest < Test::Unit::TestCase
    sub_test_case "#initialize" do
      test "correct arguments" do
        assert_nothing_raised do
          Card.new(suit: :heart, number: 3)
        end
      end
      test "wrong suit" do
        assert_raise_kind_of(ArgumentError) do
          Card.new(suit: :test, number: 3)
        end
      end
      test "wrong number" do
        assert_raise_kind_of(ArgumentError) do
          Card.new(suite: :heart, number: 14)
        end
      end
    end
    sub_test_case "#<=>" do
      sub_test_case "compare number" do
        test "simple numbers" do
          a = Card.new(suit: :heart, number: 8)
          b = Card.new(suit: :heart, number: 2)
          assert(a > b)
        end
        test "compare ace" do
          a = Card.new(suit: :heart, number: 13)
          b = Card.new(suit: :heart, number: 1)
          assert(a < b)
        end
        test "max number" do
          cards = [*1..5]
            .shuffle
            .map { |i| Card.new(suit: :heart, number: i) }
          assert_equal(1, cards.max.number)
        end
      end
      sub_test_case "compare suit(same number)" do
        test "spade and heart" do
          a = Card.new(suit: :spade, number: 1)
          b = Card.new(suit: :heart, number: 1)
          assert(a > b)
        end
        test "heart and club" do
          a = Card.new(suit: :club, number: 1)
          b = Card.new(suit: :heart, number: 1)
          assert(a < b)
        end
        test "spade and diamond" do
          a = Card.new(suit: :spade, number: 1)
          b = Card.new(suit: :diamond, number: 1)
          assert(a > b)
        end
      end
    end
  end
end
Est-ce la fin de la carte pour le moment?
↓ Faisons tirer le poker avec ruby-Implementation 2 (rôle) -
Recommended Posts