2018年3月13日火曜日

SASでトランプを作る



SGPLOTでトランプ作ってみました。

以下のような感じで1枚ずつ、マーク4種類 × 数字13枚 = 52枚のトランプがグラフとして出力されます。


出力結果の一部を切り貼りした寄せ集め



プログラム


※SAS9.4で動作します。バージョンや環境などで結果が綺麗に出力されないとかあるかもしれません。

ハッキリいってプログラムとしては汚いです。とりあえず作ったって感じです。
あとジョーカーを含めるとプログラムが複雑になっちゃうので、やめました。やるとしたらsymbolimageステートメントとか使って好きな画像をトランプの絵柄にしてジョーカーにする感じになります。


/*** トランプの数字とマークの表示位置をデータ化 ***/
data CARD;
    input SYMBOL:$7. NUMBER:$5. X Y;
    TOP_X     = 1.5;
    TOP_Y1    = 14;
    TOP_Y2    = 12.5;
    BOTTOM_X  = 3.5;
    BOTTOM_Y1 = 0;
    BOTTOM_Y2 = 1.5;
cards;
symbol1 1  2.5  7
symbol1 2  2.5  12
symbol2 2  2.5  2
symbol1 3  2.5  12
symbol2 3  2.5  2
symbol1 3  2.5  7
symbol1 4  2    12
symbol2 4  2    2
symbol1 4  3    12
symbol2 4  3    2
symbol1 5  2    12
symbol2 5  2    2
symbol1 5  3    12
symbol2 5  3    2
symbol1 5  2.5  7
symbol1 6  2    12
symbol2 6  2    2
symbol1 6  3    12
symbol2 6  3    2
symbol1 6  2    7
symbol1 6  3    7
symbol1 7  2    12
symbol2 7  2    2
symbol1 7  3    12
symbol2 7  3    2
symbol1 7  2    7
symbol1 7  3    7
symbol1 7  2.5  9.5
symbol1 8  2    12
symbol2 8  2    2
symbol1 8  3    12
symbol2 8  3    2
symbol1 8  2    7
symbol2 8  2.5  4.5
symbol1 8  3    7
symbol1 8  2.5  9.5
symbol1 9  2    12
symbol2 9  2    2
symbol1 9  2.5  6.999
symbol1 9  2    8.666
symbol2 9  2    5.333
symbol1 9  3    8.666
symbol2 9  3    5.333
symbol1 9  3    12
symbol2 9  3    2
symbol1 10 2    12
symbol2 10 2    2
symbol1 10 2.5  10.333
symbol2 10 2.5  3.666
symbol1 10 2    8.666
symbol2 10 2    5.333
symbol1 10 3    8.666
symbol2 10 3    5.333
symbol1 10 3    12
symbol2 10 3    2
symbol1 J  2.5  10
symbol1 J  3    10
symbol1 J  2.8  7.5
symbol1 J  2.8  5
symbol1 J  2.4  3.5
symbol1 J  1.9  4.5
symbol1 Q  2    10.5
symbol1 Q  2.5  11
symbol1 Q  3    10.5
symbol1 Q  3.2  8.5
symbol1 Q  3.2  6.5
symbol1 Q  3.05 3.85
symbol1 Q  2.5  4
symbol1 Q  2    4.5
symbol1 Q  1.8  6.5
symbol1 Q  1.8  8.5
symbol1 Q  2.75 5.8
symbol1 K  2    10.5
symbol1 K  2    8
symbol1 K  2    5.5
symbol1 K  2    3
symbol1 K  3    10.5
symbol1 K  2.8  8
symbol1 K  2.6  5.3
symbol1 K  3    3
;


/*** マーク別に1~Kまでのトランプを作成 ***/
%macro trump( unicode=, color= );


/* Attribute Map */
data MYMAP;
     ID="myid";
     VALUE="symbol1"; MARKERCOLOR="&color"; MARKERSYMBOL="symbol1"; output;
     VALUE="symbol2"; MARKERCOLOR="&color"; MARKERSYMBOL="symbol2"; output;
run;


/* Plot */
proc sgplot data=CARD noautolegend dattrmap=MYMAP;
     by NUMBER notsorted;

     xaxis min=-1 max=5   display=none;
     yaxis min=-1 max=15  display=none;

     /* トランプの形に線を引く */
     refline 1.2 3.8  / axis=x;
     refline -1 15 / axis=y;

     /* トランプのマークをUnicodeで取得 */
     symbolchar name=symbol1  char=&unicode;
     symbolchar name=symbol2  char=&unicode / rotate=180;

     /* トランプの左上の数字とマークをPlot */
     text    x=TOP_X    y=TOP_Y1    text=NUMBER  / textattrs=(size=0.6cm color=&color) ;
     scatter x=TOP_X    y=TOP_Y2                 / markerattrs=(symbol=symbol1 size=1.3cm color=&color);

     /* トランプの右下の数字とマークをPlot */
     text    x=BOTTOM_X y=BOTTOM_Y1 text=NUMBER  / textattrs=(size=0.6cm color=&color)  rotate=180 ;
     scatter x=BOTTOM_X y=BOTTOM_Y2              / markerattrs=(symbol=symbol2 size=1.3cm color=&color) ;

     /* トランプの真ん中のマークをPlot */
     scatter x=X        y=Y                      / attrid=myid  markerattrs=(size=2.1cm) group=symbol;

run;

%mend;

%trump( unicode='2660'x, color=black )  /* スペード */
%trump( unicode='2663'x, color=black )  /* クラブ */
%trump( unicode='2665'x, color=red   )  /* ハート */
%trump( unicode='2666'x, color=red   )  /* ダイヤ */




0 件のコメント:

コメントを投稿