素数大富豪を作ったのでJavaScriptでもつくってみようと考えています。カードゲームをJavaScriptでつくったことはあったよね?と思って過去記事を調べてみたけれども見つからない。実はカードゲームはC#でデスクトップアプリとして作ったことはあるけれどもJavaScriptで作ったことはありません。

ということで今回はweb版素数大富豪をつくる準備としてJavaScriptでカードを表示させます。まずはカードを表示させるためのクラスをつくります。管理人はクラスが大好きです。クラスは初心者には難しいからクラスをできるだけ使わない説明をしているという方もいるようですが、私はそうは思いませんね。不必要にクラスをつくります。

HTML部分

まずHTML部分を示します。Cardsというクラスのインスタンスを生成して、そこからカードを初期化するInitCards関数を呼び出しています。実際にカードが表示されるのはボタンがクリックされてShowAllCards関数が呼び出されるときです。

ではCardsクラスの説明をしたいのですが、そのまえにSuitクラスとCardクラスをつくります。CardクラスのインスタンスをCardsクラスで管理するという感じです。

Suitクラス

Suitクラスはカードのスート(素数大富豪ではスートはあまり関係ないのだが)を管理します。列挙体のような使い方をしています。enum型は列挙型ともよばれ、複数の定数をひとつにまとめ一連の値を付けることができる型のことですが、JavaScriptには残念ながらenum型はありません。ただ同じようなものは作ることができます。

card.js

クラスを使わずに辞書型を使う方法もあります。

card.js

カードのイメージを取得するときにトランプ カードイラスト – No: 934665/無料イラストなら「イラストAC」を使うので、値は上と同じにしておかなければなりません。

Cardクラス

次にCardクラスを示します。コンストラクタの引数はスートと番号、そして親になる要素です。親になる要素とはカードはdivとして追加したいのですが、そのときに親になる要素を指します。

プロパティとしてSuit、Number、ParentElement、X、Yがあります。前三者はコンストラクタと同じです。X、Yはカードが表示される座標です。positionにabsoluteを指定して絶対配置をします。これならどこにでも配置することができます。

X、Yプロパティはとりあえず0にします。CardWidthとCardHeightはHTMLで定数として宣言されています。Imageクラスのインスタンスを生成してsrcに画像ファイルのパスを設定しています。画像が読み込まれたらcanvasを生成し、context.drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh)関数をつかって範囲を指定してイメージを描画し、カードを描画するために必要なイメージを取得しています。

これを実際に試すときはサーバー上でないとエラーがでます。ローカルサーバーでもかまいません。xamppを使えば動作することを確認できます。

カードを移動させるときはParentElementに追加されているかどうかを確認し、すでに追加されている場合はいったんremoveChild関数を実行してから再度appendChild関数を実行しています。そうしないとカードが重なったときにあとからappendChild関数で追加したカードのほうが移動後も上に描画されてしまいます。最後に移動したカードを一番上に表示させたいのでこのような処理をしています。

card.js

Cardsクラス

次にCardsクラスですが、クラスのなかにCardクラスのインスタンスを格納する配列をつくっておきます。Cardクラスのインスタンスを作成したらこのなかに追加していきます。InitCards関数を使えば

カードを移動させたいときは移動対象になるものをカードのスートと番号をつかって指定したい場合と要素で指定したい場合が考えられます。クリックされたものを移動させたいのであれば要素で指定することになります。そこで配列の中からカードのスートと番号で探したいときはGetObjectFromNumber関数を、要素で探したい場合はGetObjectFromElement関数をつかって見つけることができるようにしました。

card.js

あとはCardsクラスのインスタンスを生成してInitCards関数を実行したあとShowAllCards関数を実行すればすべてのカードを表示させることができます。