import std.stdio : writef; //標準出力writef()使用
import std.random : uniform; //乱数関数uniform()使用
import std.algorithm : swap; //変数入れ替え swap()使用

int main(){
Yama y = new Yama;
    Player p = new Player;
    y.sort();    // 牌山を並び替え
    // 13牌山からツモる
    for(int i=0;i<13;i++) {
        p.tsumo(y.tsumo()); //山からツモってきた牌をプレイヤーがツモる
    }
    // 配牌を表示
    for(int i=0;i<34;i++) {
        for(int j=0;j<p.get(i);j++) {
            mj_PutHaiName(i);
        }
    }
    return 0;
}

// プレイヤークラス
class Player{
    int haipai[34]; //全34種の牌をいくつづつ持ってるか格納する配列
    this(){
        haipai[]=0; //牌パイリセット 配列全てを0で初期化
    }
    void tsumo(int hai){haipai[hai]++;} //ツモ
    void dahai(int hai){haipai[hai]--;} //打牌
    int get(int n){return haipai[n];} //0~33の番号を与えるとその種類の牌の所持数を返す
} // D言語では;不要

// 牌山操作クラス
class Yama {
    int yama[136];
    int idx;
    this(){ // コンストラクタ
        for(int i=0;i<136;i++){yama[i] = i%34;}
        idx=0;
    }
    void sort(){ // 牌のソート
        // 牌を乱数使って適当に入れ替え
        for(int j=0;j<1000;j++) { // 1000回もやらなくていいような気がするがw
            for(int i=0;i<136;i++){
                swap(yama[i],
                     yama[uniform(0,135)]); // i番目の山と0~135番目の山を交換
            }
        }
    }
    int tsumo(){return yama[idx++];}
    void reset(){idx=0;}
    int get(int i){return yama[i];}
}

// 指定された番号(0~33)の牌を表示する
void mj_PutHaiName(int i){
    static auto hainame = "{1} {2} {3} {4} {5} {6} {7} {8} {9} [1] [2] [3] [4] [5] [6] [7] [8] [9] (1) (2) (3) (4) (5) (6) (7) (8) (9) [E] [S] [W] [N] { } {*} {+} ";
    writef("%c",hainame[i*4+0]);
    writef("%c",hainame[i*4+1]);
    writef("%c",hainame[i*4+2]);
}

/*
実行結果1
{1}{2}{3}{3}{4}{9}[4](1)(3)(3)(5)(9){+}

実行結果2
{1}{9}[1][6][8](7)[E][S][W][W][N][N]{+}

実行結果3
{3}{3}{4}{5}{8}[4][5][7](7)(7)(8)(8)[E]
*/


インデント修正しました。

なんか先頭の半角スペースやTABが

うまく行かなかったので、

インデントは全角スペースです。

import std.stdio : writef; //標準出力writef()使用
import std.random : uniform; //乱数関数uniform()使用
import std.algorithm : swap; //変数入れ替え swap()使用

int main(){
Yama y = new Yama;
Player p = new Player;
y.sort(); // 牌山を並び替え
// 13牌山からツモる
for(int i=0;i<13;i++) {
p.tsumo(y.tsumo()); //山からツモってきた牌をプレイヤーがツモる
}
// 配牌を表示
for(int i=0;i<34;i++) {
for(int j=0;j<p.get(i);j++) {
mj_PutHaiName(i);
}
}
return 0;
}

// プレイヤークラス
class Player{
int haipai[34]; //全34種の牌をいくつづつ持ってるか格納する配列
this(){
haipai[]=0; //牌パイリセット 配列全てを0で初期化
}
void tsumo(int hai){haipai[hai]++;} //ツモ
void dahai(int hai){haipai[hai]--;} //打牌
int get(int n){return haipai[n];} //0~33の番号を与えるとその種類の牌の所持数を返す
} // D言語では;不要

// 牌山操作クラス
class Yama {
int yama[136];
int idx;
this(){ // コンストラクタ
for(int i=0;i<136;i++){yama[i] = i%34;}
idx=0;
}
void sort(){ // 牌のソート
// 牌を乱数使って適当に入れ替え
for(int j=0;j<1000;j++) { // 1000回もやらなくていいような気がするがw
for(int i=0;i<136;i++){
swap(yama[i],
yama[uniform(0,135)]); // i番目の山と0~135番目の山を交換
}
}
}
int tsumo(){return yama[idx++];}
void reset(){idx=0;}
int get(int i){return yama[i];}
}

// 指定された番号(0~33)の牌を表示する
void mj_PutHaiName(int i){
static auto hainame = "{1} {2} {3} {4} {5} {6} {7} {8} {9} [1] [2] [3] [4] [5] [6] [7] [8] [9] (1) (2) (3) (4) (5) (6) (7) (8) (9) [E] [S] [W] [N] { } {*} {+} ";
writef("%c",hainame[i*4+0]);
writef("%c",hainame[i*4+1]);
writef("%c",hainame[i*4+2]);
}

/*
実行結果1
{1}{2}{3}{3}{4}{9}[4](1)(3)(3)(5)(9){+}

実行結果2
{1}{9}[1][6][8](7)[E][S][W][W][N][N]{+}

実行結果3
{3}{3}{4}{5}{8}[4][5][7](7)(7)(8)(8)[E]
*/


今回はD言語では配列の初期化を↓のように書けるというだけ。

haipai[]=0;


牌牌、解説:

実行結果1は1メンツ、マンズの123で完成してるだけで3シャンテン?リーのみ1300点

実行結果2は19字牌が多いから、コクシかチャンタ狙い

実行結果3はクイタン狙い


どっちにしろ、分かりずらい!!


けど、僕はかなりのマアジャン熟練者なのでこれでも分かりますw


MS-DOS時代はみんな、こうだったんだよ!!!!!!(多分w)




だんだんわざわざD言語じゃなくてもいいような気がしなくなってきたような気がしなくも無い

数学には結構自信があったので。

相対性理論のwikipedia見てみた。


なんだこれ?

さっぱり分からんwwwww


だいたい原理は分かるのだが、

数式で証明しているのがすごい。



自分が宇宙がどうのこうのとか

ビッグバン、ブラックホール、時空時間移動とか

語ってたのが何か恥ずかしくなってきた。




なんていうか、

知ったかぶりってやつでした。

すみませんwww




で、このアインシュタインが神をどういう風にとらえてたか

調べてみたら、


汎神論(はんしんろん)


という単語が出てきた。


全ての物体や概念・法則が の顕現であり神性 を持つ、あるいは そのものであるという宗教 観・哲学 。万有神論。


うーむ、良く分からん。(そして深く考えるのをやめた。)




昔、自分は宇宙がビッグバンでできたと知って、

ビッグバンが起きた後は、物体の移動方向などは全て決まっているので

その瞬間、未来も全部決まっていると信じていた。


しかし、最近量子力学かなんかで、電子や素粒子なんかの配置が神でも予測できない

とか何とかで未来は決定不可能という論もでてきているらしい。



うーむ、宇宙は奥が深い。

頭いたい。

終了。




ちなみに関係ないけど、相対性理論ってバンドがあるんですが、

こっちも好きです。





import std.stdio : writef; //標準出力writef()使用
import std.random : uniform; //乱数関数uniform()使用
import std.algorithm : swap; //変数入れ替え swap()使用

int main(){
// Yama y; // C++と違ってこれだけではインスタンスが生成されないので注意 javaと同じ
        // 実体は、必ずヒープ領域におかれ、 ガベージコレクション対象となるので
        // マシンパワーの無い、ゲームプログラムには致命的かも この辺、今後修正してほしい。

 Yama y = new Yama; // javaやC++とやや同じ ()不要
               //Yamaクラスは下に記述されているがD言語では問題なし
 // 牌山を並び替え
 y.sort(); // C++ならy->sort()と書かなくてはならない。この辺はjavaと同じ
// 山を全表示
 for(int i=0;i<136;i++){
  if(!(i%17)){writef("\n");} // 一行17個ずつ表示 javaではこのif文内の記述はエラー
  mj_PutHaiName(y.get(i));
 }
 delete(y); // これは無くてもD言語は勝手に後処理してくれる。javaでは不要
 return 0;
}

// 牌山操作クラス
class Yama {
 int yama[136];
 this(){ // コンストラクタ D言語ではthis()に変わりました
  for(int i=0;i<136;i++){yama[i] = i%34;}
 }
 void sort(){ // 牌のソート
  // 牌を乱数使って適当に入れ替え
  for(int j=0;j<1000;j++) { // 1000回もやらなくていいような気がするがw 
   for(int i=0;i<136;i++){
    swap(yama[i],
    yama[uniform(0,135)]); // i番目の山と0~135番目の山を交換
   }
  }
 }
 int get(int i){return yama[i];}
} // ;不要

// 指定された番号(0~33)の牌を表示する
void mj_PutHaiName(int i){
 static auto hainame = "{1} {2} {3} {4} {5} {6} {7} {8} {9} [1] [2] [3] [4] [5] [6] [7] [8] [9] (1) (2) (3) (4) (5) (6) (7) (8) (9) [E] [S] [W] [N] { } {*} {+} ";
 writef("%c",hainame[i*4+0]);
 writef("%c",hainame[i*4+1]);
 writef("%c",hainame[i*4+2]);
}


/*
実行結果その1

[7]{+}(2){3}[E](2)(6){*}{1}[4]{8}[5][9][5](7){9}(8)
{7}(5){2}{+}(4){3}{3}[3][2](8)(4){1}[1]{7}{3}{9}(9)
(6){4}(1)[2][W][S][2]{6}{9}[3](7){7}[8][7]{ }[W](7)
[N]{ }{ }(5){1}{8}(1)[2][W][1](3){ }{+}{*}[S]{+}[N]
[3]{6}{8}(9)[8](3)(1)[7][9][6]{2}{2}{8}(2)(8)[4](2)
[9](9)[S](4)[E][W](6)(5)(8)[4]{7}[5][8](3)[6][3][9]
[S]{*}{5}(7)(5){4}{6}(6)[1](4){9}[6][N]{6}(9)[4]{1}
[7][6]{4}[E][1][5]{*}(3){5}{5}{5}[N]{2}{4}(1)[E][8]

実行結果その2
{3}(8)(3){7}[1](2)(4)[7][1](1)(3)[N]{4}[W](9){4}{3}
[1](4){8}[7]{9}[6][2]{5}[E][8](5){+}{7}[5][9]{8}[2]
{7}{+}{1}{1}[E](2){ }[N]{3}[8]{7}[3][9][W]{6}(4)(1)
[S]{6}{2}{2}{1}[8]{8}[4][4][S]{9}{5}[4]{*}{2}{9}(7)
{4}{*}(7){*}{+}[5](3){ }[E](6)(5)(5)(7)(7)[S](9){9}
[3][5][2](5){2}[N](9)[E][N]{ }(6){6}[9](8){1}{5}[6]
[6][6]{+}[S](1){*}(6)[7][W](9)[W][3][3]{6}(2)(6){ }
[1]{5}[2][8](3)[9][5]{3}{8}(8)[4](1)(4)(8)(2)[7]{4}
*/
[EOF]


実行結果は前と同じです。

アロー演算子 -> ポインタ * はD言語では

javaと同じでほとんど出番は無いでしょう。

今のところ、

C++とjavaを合体したような感じです。

import std.stdio : writef; //標準出力writef()使用
import std.random : uniform; //乱数関数uniform()使用
import std.algorithm : swap; //変数入れ替え swap()使用

int main(){
int yama[136]; //牌の山

// 牌をとりあえず、整列させる
for(int i=0;i<136;i++){
yama[i] = i%34;
}
// 牌を乱数使って適当に入れ替え
for(int j=0;j<1000;j++) { // 1000回もやらなくていいような気がするがw
for(int i=0;i<136;i++){
swap(yama[i],
yama[uniform(0,135)]); // i番目の山と0~135番目の山を交換
}
}
// 山を全表示
for(int i=0;i<136;i++){
if(!(i%17)){writef("\n");} // 一行17個ずつ表示
mj_PutHaiName(yama[i]);
}
return 0;
}

// 指定された番号(0~33)の牌を表示する
void mj_PutHaiName(int i){
static auto hainame = "{1} {2} {3} {4} {5} {6} {7} {8} {9} [1] [2] [3] [4] [5] [6] [7] [8] [9] (1) (2) (3) (4) (5) (6) (7) (8) (9) [E] [S] [W] [N] { } {*} {+} ";
writef("%c",hainame[i*4+0]);
writef("%c",hainame[i*4+1]);
writef("%c",hainame[i*4+2]);
}


/*
実行結果その1


[7]{+}(2){3}[E](2)(6){*}{1}[4]{8}[5][9][5](7){9}(8)
{7}(5){2}{+}(4){3}{3}[3][2](8)(4){1}[1]{7}{3}{9}(9)
(6){4}(1)[2][W][S][2]{6}{9}[3](7){7}[8][7]{ }[W](7)
[N]{ }{ }(5){1}{8}(1)[2][W][1](3){ }{+}{*}[S]{+}[N]
[3]{6}{8}(9)[8](3)(1)[7][9][6]{2}{2}{8}(2)(8)[4](2)
[9](9)[S](4)[E][W](6)(5)(8)[4]{7}[5][8](3)[6][3][9]
[S]{*}{5}(7)(5){4}{6}(6)[1](4){9}[6][N]{6}(9)[4]{1}
[7][6]{4}[E][1][5]{*}(3){5}{5}{5}[N]{2}{4}(1)[E][8]

実行結果その2


{3}(8)(3){7}[1](2)(4)[7][1](1)(3)[N]{4}[W](9){4}{3}
[1](4){8}[7]{9}[6][2]{5}[E][8](5){+}{7}[5][9]{8}[2]
{7}{+}{1}{1}[E](2){ }[N]{3}[8]{7}[3][9][W]{6}(4)(1)
[S]{6}{2}{2}{1}[8]{8}[4][4][S]{9}{5}[4]{*}{2}{9}(7)
{4}{*}(7){*}{+}[5](3){ }[E](6)(5)(5)(7)(7)[S](9){9}
[3][5][2](5){2}[N](9)[E][N]{ }(6){6}[9](8){1}{5}[6]
[6][6]{+}[S](1){*}(6)[7][W](9)[W][3][3]{6}(2)(6){ }
[1]{5}[2][8](3)[9][5]{3}{8}(8)[4](1)(4)(8)(2)[7]{4}
*/

[EOF]



乱数はuniform関数を使う

import std.random : uniform と書いておけば使える。


変数入れ替えは一応、swap関数というのが用意されている。