Class: Mjai::Pai

Inherits:
Object
  • Object
show all
Includes:
Comparable
Defined in:
lib/mjai/pai.rb

Constant Summary collapse

TSUPAI_STRS =
" ESWNPFC".split(//)
UNKNOWN =
Pai.new(nil, nil)

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

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

#numberObject (readonly)

Returns the value of attribute number.



87
88
89
# File 'lib/mjai/pai.rb', line 87

def number
  @number
end

#typeObject (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

#dataObject



119
120
121
# File 'lib/mjai/pai.rb', line 119

def data
  return [@type || "", @number || -1, @red ? 1 : 0]
end

#fonpai?Boolean

Returns:

  • (Boolean)


107
108
109
# File 'lib/mjai/pai.rb', line 107

def fonpai?
  return @type == "t" && (1..4).include?(@number)
end

#hashObject



129
130
131
# File 'lib/mjai/pai.rb', line 129

def hash()
  return self.data.hash()
end

#inspectObject



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

Returns:

  • (Boolean)


99
100
101
# File 'lib/mjai/pai.rb', line 99

def red?
  return @red
end

#remove_redObject



141
142
143
# File 'lib/mjai/pai.rb', line 141

def remove_red()
  return Pai.new(@type, @number)
end

#same_symbol?(other) ⇒ Boolean

Returns:

  • (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

Returns:

  • (Boolean)


111
112
113
# File 'lib/mjai/pai.rb', line 111

def sangenpai?
  return @type == "t" && (5..7).include?(@number)
end

#succObject

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_sObject



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

Returns:

  • (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

Returns:

  • (Boolean)


103
104
105
# File 'lib/mjai/pai.rb', line 103

def yaochu?
  return @type == "t" || @number == 1 || @number == 9
end