Class: Mjai::Pai
Constant Summary collapse
- TSUPAI_STRS =
" ESWNPFC".split(//)
- UNKNOWN =
Pai.new(nil, nil)
Instance Attribute Summary collapse
-
#number ⇒ Object
readonly
Returns the value of attribute number.
-
#type ⇒ Object
readonly
Returns the value of attribute type.
Class Method Summary collapse
Instance Method Summary collapse
- #<=>(other) ⇒ Object
- #==(other) ⇒ Object (also: #eql?)
- #data ⇒ Object
- #fonpai? ⇒ Boolean
- #hash ⇒ Object
-
#initialize(*args) ⇒ Pai
constructor
A new instance of Pai.
- #inspect ⇒ Object
- #next(n) ⇒ Object
- #red? ⇒ Boolean
- #remove_red ⇒ Object
- #same_symbol?(other) ⇒ Boolean
- #sangenpai? ⇒ Boolean
-
#succ ⇒ Object
Next pai in terms of dora derivation.
- #to_s ⇒ Object
- #valid? ⇒ Boolean
- #yaochu? ⇒ Boolean
Constructor Details
#initialize(*args) ⇒ Pai
Returns a new instance of Pai.
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
# File 'lib/mjai/pai.rb', line 36 def initialize(*args) case args.size when 1 str = args[0] if str == "?" @type = @number = nil @red = false elsif str =~ /\A([1-9])([mps])(r)?\z/ @type = $2 @number = $1.to_i() @red = $3 != nil elsif number = TSUPAI_STRS.index(str) @type = "t" @number = number @red = false else raise(ArgumentError, "Unknown pai string: %s" % str) end when 2, 3 (@type, @number, @red) = args @red = false if @red == nil else raise(ArgumentError, "Wrong number of args.") end if @type != nil || @number != nil if !["m", "p", "s", "t"].include?(@type) raise("Bad type: %p" % @type) end if !@number.is_a?(Integer) raise("number must be Integer: %p" % @number) end if @red != true && @red != false raise("red must be boolean: %p" % @red) end end end |
Instance Attribute Details
#number ⇒ Object (readonly)
Returns the value of attribute number.
87 88 89 |
# File 'lib/mjai/pai.rb', line 87 def number @number end |
#type ⇒ Object (readonly)
Returns the value of attribute type.
87 88 89 |
# File 'lib/mjai/pai.rb', line 87 def type @type end |
Class Method Details
.dump_pais(pais) ⇒ Object
32 33 34 |
# File 'lib/mjai/pai.rb', line 32 def self.dump_pais(pais) return pais.map(){ |pai| "%-3s" % pai }.join("") end |
.parse_pais(str) ⇒ Object
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
# File 'lib/mjai/pai.rb', line 9 def self.parse_pais(str) type = nil pais = [] red = false str.gsub(/\s+/, "").split(//).reverse_each() do |ch| next if ch =~ /^\s$/ if ch =~ /^[mps]$/ type = ch elsif ch =~ /^[1-9]$/ raise(ArgumentError, "type required after number") if !type pais.push(Pai.new(type, ch.to_i(), red)) red = false elsif TSUPAI_STRS.include?(ch) pais.push(Pai.new(ch)) elsif ch == "r" red = true else raise(ArgumentError, "unexpected character: %s", ch) end end return pais.reverse() end |
Instance Method Details
#<=>(other) ⇒ Object
133 134 135 136 137 138 139 |
# File 'lib/mjai/pai.rb', line 133 def <=>(other) if self.class == other.class return self.data <=> other.data else raise(ArgumentError, "invalid comparison") end end |
#==(other) ⇒ Object Also known as: eql?
123 124 125 |
# File 'lib/mjai/pai.rb', line 123 def ==(other) return self.class == other.class && self.data == other.data end |
#data ⇒ Object
119 120 121 |
# File 'lib/mjai/pai.rb', line 119 def data return [@type || "", @number || -1, @red ? 1 : 0] end |
#fonpai? ⇒ Boolean
107 108 109 |
# File 'lib/mjai/pai.rb', line 107 def fonpai? return @type == "t" && (1..4).include?(@number) end |
#hash ⇒ Object
129 130 131 |
# File 'lib/mjai/pai.rb', line 129 def hash() return self.data.hash() end |
#inspect ⇒ Object
83 84 85 |
# File 'lib/mjai/pai.rb', line 83 def inspect return "Pai[%s]" % self.to_s() end |
#next(n) ⇒ Object
115 116 117 |
# File 'lib/mjai/pai.rb', line 115 def next(n) return Pai.new(@type, @number + n) end |
#red? ⇒ Boolean
99 100 101 |
# File 'lib/mjai/pai.rb', line 99 def red? return @red end |
#remove_red ⇒ Object
141 142 143 |
# File 'lib/mjai/pai.rb', line 141 def remove_red() return Pai.new(@type, @number) end |
#same_symbol?(other) ⇒ Boolean
145 146 147 |
# File 'lib/mjai/pai.rb', line 145 def same_symbol?(other) return @type == other.type && @number == other.number end |
#sangenpai? ⇒ Boolean
111 112 113 |
# File 'lib/mjai/pai.rb', line 111 def sangenpai? return @type == "t" && (5..7).include?(@number) end |
#succ ⇒ Object
Next pai in terms of dora derivation.
150 151 152 153 154 155 156 157 158 159 |
# File 'lib/mjai/pai.rb', line 150 def succ if (@type == "t" && @number == 4) || (@type != "t" && @number == 9) number = 1 elsif @type == "t" && @number == 7 number = 5 else number = @number + 1 end return Pai.new(@type, number) end |
#to_s ⇒ Object
73 74 75 76 77 78 79 80 81 |
# File 'lib/mjai/pai.rb', line 73 def to_s() if !@type return "?" elsif @type == "t" return TSUPAI_STRS[@number] else return "%d%s%s" % [@number, @type, @red ? "r" : ""] end end |
#valid? ⇒ Boolean
89 90 91 92 93 94 95 96 97 |
# File 'lib/mjai/pai.rb', line 89 def valid? if @type == nil && @number == nil return true elsif @type == "t" return (1..7).include?(@number) else return (1..9).include?(@number) end end |
#yaochu? ⇒ Boolean
103 104 105 |
# File 'lib/mjai/pai.rb', line 103 def yaochu? return @type == "t" || @number == 1 || @number == 9 end |