段級位制を採用しており、通常段位（級位及び段位）は"経験値"によって判断される。経験値は、現在の級位及び段位によって増減値は異なるが、高順位で対局を終了したり評価ポイントを貯めることにより増えてゆく。対局を強制中断したり低順位を取ると、当然減少してしまう。ネットワークトラブルによりサテライト筐体の動作が止まった（ハングアップした）場合も、強制的に経験値が減少してしまう。プロリーグは全段位で一律の増減値となっており、特に高段位では他と比べ最下位での経験値減少が若干緩和されている。十段より上の段位である強者以上の上級段位には経験値でも昇格できるものの、そのための経験値は遥かに高い。このため通常は、プロリーグでのリーグ階級維持または昇格等、一定の条件を満たす事で幻球を獲得し強者に昇格する（イベントに優勝または入賞することによるボーナス経験値は膨大であるため、これで昇格するケースもある）。なお、経験値で上級段位に昇格した場合は、その時点で経験値を90点減算される（上級段位から陥落した場合は通常は昇格時点の経験値が保持され、その経験値から再開となるが、経験値による昇格の場合に同様に保持すると陥落後即座に再昇格してしまうための措置と思われる）。
初段未満の級位では公式モードでは段位別戦（東風戦）のみしか選択できない。ただし級位では店内対戦等、公式モード以外のゲームモードでも経験値の増減がある（雀荘モードおよび、経験値変動無しのイベントモードを除く）。
1976年、ニクラウス・ヴィルトは単純なpコードマシンを自著 Algorithms + Data Structures = Programs で定義した。このマシンには3つのレジスタがある。プログラムカウンタ(p)、スタックベースレジスタ(b)、スタックポインタ(t) である。8種類の命令があり、うち1種 (opr) は複数の形式がある。このマシンのコードは以下のようになる (Pascal):constlevmax=3;amax=2047; type fct=(lit,opr,lod,sto,cal,int,jmp,jpc);instruction=packed record f:fct;l:0..levmax;a:0..amax;end;procedure interpret;  const stacksize = 500;  var    p, b, t: integer; {program-, base-, topstack-registers}    i: instruction; {instruction register}    s: array [1..stacksize] of integer; {datastore}  function base(l: integer): integer;    var b1: integer;  begin    b1 := b; {find base l levels down}    while l > 0 do begin      b1 := s[b1];      l := l - 1    end;    base := b1  end {base};begin  writeln(' start pl/0');  t := 0; b := 1; p := 0;  s[1] := 0; s[2] := 0; s[3] := 0;  repeat    i := code[p]; p := p + 1;    with i do      case f of        lit: begin t := t + 1; s[t] := a end;        opr:           case a of {operator}            0:               begin {return}                t := b - 1; p := s[t + 3]; b := s[t + 2];              end;            1: s[t] := -s[t];            2: begin t := t - 1; s[t] := s[t] + s[t + 1] end;            3: begin t := t - 1; s[t] := s[t] - s[t + 1] end;            4: begin t := t - 1; s[t] := s[t] * s[t + 1] end;            5: begin t := t - 1; s[t] := s[t] div s[t + 1] end;            6: s[t] := ord(odd(s[t]));            8: begin t := t - 1; s[t] := ord(s[t] = s[t + 1]) end;            9: begin t := t - 1; s[t] := ord(s[t] <> s[t + 1]) end;            10: begin t := t - 1; s[t] := ord(s[t] < s[t + 1]) end;            11: begin t := t - 1; s[t] := ord(s[t] >= s[t + 1]) end;            12: begin t := t - 1; s[t] := ord(s[t] > s[t + 1]) end;            13: begin t := t - 1; s[t] := ord(s[t] <= s[t + 1]) end;          end;        lod: begin t := t + 1; s[t] := s[base(l) + a] end;        sto: begin s[base(l)+a] := s[t]; writeln(s[t]); t := t - 1 end;        cal:           begin {generate new block mark}            s[t + 1] := base(l); s[t + 2] := b; s[t + 3] := p;            b := t + 1; p := a          end;        int: t := t + a;        jmp: p := a;        jpc: begin if s[t] = 0 then p := a; t := t - 1 end      end {with, case}  until p = 1;  writeln(' end pl/0');end {interpret};このマシンはヴィルトのPL/0の実行に使われた。PL/0 はコンパイラ開発の教育用に使われたPascalのサブセットである。