challenge 麻雀ゲーム1

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

  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

Posted feedbacks - C#

C#で書いてみました。

 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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using 牌 = System.String;

class 卓 {
    static [] s = { "一", "二", "三", "四", "伍", "六", "七", "八", "九" };
    static [] s = { "白", "發", "中", "東", "南", "西", "北" };
    static [] s = { "索", "筒", "萬" };
    int 人数;
    public List<> s = new List<> { };
    public List<>  = new List<>();
    public List<List<>> s = new List<List<>>();
    public (int 人数) {
        this.人数 = 人数;
        .AddRange((
            from  in s
            from  in s
            from 枚数 in Enumerable.Range(0, 4)
            select  + ).ToList());
        .AddRange((
            from  in s
            from 枚数 in Enumerable.Range(0, 4)
            select  + " ").ToList());

        Random rand = new Random();
        for (int i = 0; i < .Count; i++) {
            int r1 = rand.Next(.Count);
            int r2 = rand.Next(.Count);
             tmp = [r1];
            [r1] = [r2];
            [r2] = tmp;
        }

        for (int i = 0; i < 人数; i++) {
            s.Add(new List<string>());
        }
    }
    public void 配牌() {
        for (int i = 0; i < 人数; i++) {
            s.Add(new (i));
            for (int j = 0; j < 13; j++) {
                s[i].摸打();
            }
            s[i].s.Sort();
        }
    }
    public void () {
        int  = 0;
        while (.Count > 14) {
            s[].摸打();
            s[].Add(s[].打牌());
             = ( + 1) % 人数;
        }
    }
}
class 家 {
    int id;
    string name { get { return "東南西北"[id]+"家"; } }
    public (int id) {
        this.id = id;
    }
    public List<string> s = new List<string>();
    public void 摸打(List<string> ) {
        Console.WriteLine("{0}は牌を引きました。{1}", name, [0]);
        s.Add([0]);
        .RemoveAt(0);
    }
    public string 打牌() {
        var 捨て牌 = s[s.Count-1];
        s.RemoveAt(s.Count - 1);
        Console.WriteLine("{0}は牌を捨てました。{1}", name, 捨て牌);
        return 捨て牌;
    }
}
class 麻雀 {
    static void Main(string[] args) {
        Console.Write("プレイヤーは何人?:");
        int 人数 = int.Parse(Console.ReadLine());
        var  = new (人数);
        .配牌();
        .();
        Console.ReadKey();
    }
}

Index

Feed

Other

Link

Pathtraq

loading...