Comment detail

麻雀ゲーム1 (Nested Flatten)

麻雀ゲームの部分的な作成がお題になります. 以下のメソッド/関数を組み込んで下さい.

  1. n人のプレーヤでゲームをする機能; n = 2--4.
  2. 牌をかき混ぜてから山を作成する機能.
  3. 手牌を理牌する機能.
  4. 山から牌を取る操作.
  5. 手配を切る操作 (ツモ切りで構いません).
  6. 河を保存する機能.
  7. 3--5を繰り返す機能.

ルールとしては,

  1. 配牌は親は14枚, 子は13枚.
  2. 親から順に手牌を切る.
  3. 自分の手番で始めにツモり, その後手牌を切る.
  4. 手牌の数は最大14枚.
  5. 山の牌が残り14枚になったら終了.
  6. 牌全体としては, (3人プレーヤでも) 日本で通常用いられている34種類136枚を使用.

と考えていただければ結構です.

鳴き, あがり, 自風, 場風などは考慮していただかなくて結構です.

こんな感じで. Playerクラスは拡張性を与えるために追加してみました.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
class Mahjang
  Tu, Num = :t, 14
  Hai, Tuhai = [:m, :s, :p, Tu], [:wt, :sh, :et, :nh, :hk, :ht, :tu]
  module WisePlayer
    def think
      unless @tumo
        puts [*1..Num].map{|c| format("% 3d", c)}.join(?,) + ' 0=tumo', self
        true until (0..Num).include?(i = gets.to_i)
        @tumo = true if i.zero?
      end
      @tumo ? Num : i
    end
  end
  class Player
    def initialize
      @hai, @ho = [], []
      @tumo = nil
    end
    attr_reader :ho
    def to_s
      @hai.map{|p| [p.name, p.num]}.
        map{|n,m| n != Tu ? " #{n}#{m+1}" : " #{TuHai[m]}"}.join(",")
    end
    def repai()   @hai = @hai.sort_by{|h| [h.name, h.num]}  end
    def size()    @hai.size  end
    def get(a)    @hai << a  end
    def think()   Num end
    def set()     @ho << @hai.delete_at(think-1)  end
  end
  def initialize
    pi = Struct.new("Pi", :name, :num)
    @players = Array.new(4){Player.new}
    @players[0].extend(WisePlayer)
    @hi = Hai.map{|s| Array.new(4){Array.new(9){|i|
          pi.new(s,i) unless s == Tu && i >= 7}}}.
      flatten.compact.shuffle
    init_set
  end
  def init_set
    cycle{@players.last.size >= Num-1}
    @players[0].get(@hi.delete_at(3))
  end
  def play
    cycle(true){@hi.size <= Num}
    @players.each{|p| puts p}
  end
  private
  def cycle(play=nil)
    @players.cycle{|p|
      p.get(@hi.shift) if p.size < Num
      p.set            if play
      p.repai
      break if yield}
  end
end
if __FILE__ == $0
  m = Mahjang.new
  m.play
end

Index

Feed

Other

Link

Pathtraq

loading...