・カードの構造体を設定する
カードのデータは、後に紹介するカードリストjsonファイルから読み込みます。
id pictures_path name furigana card_type tags energy power class skills required_energy effects flavor_text element pack_info rarity energy_color rising_from
以上の属性を追加する。
id picures_path card_type 半角の文字列を一つ格納する
tags skills全角の文字列を格納する。それは、複数持つことも、一つも持たないこともある。
rising_from name furigana flavor_text effects class全角の文字列を格納する。一つ持つか一つも持たない。
power energy rarity required_energy数字を一つ格納するか、一つも持たない。
energy_color 文字列を格納する 一つも持たないか一つ格納する。
element pack_info 半角の文字列を一つも持たないか一つ格納する
以下がカードリストのjsonファイルの一例です。
・プレイに使われる領域を設定する。プレイヤーは二人いてそれぞれが、以下の5つの領域を管理する。プレイヤー1は、Fゾーン1Sゾーン1Xゾーン1山札1手札1墓地1を持つ。同様にプレイヤー2は、Fゾーン2Sゾーン2Xゾーン2山札2手札2墓地2を持つ。
・カードの状態を設定する。カードにはそれぞれ、裏向き状態、表向き状態(同時に片方しか持てない)と、スピンとリスピン状態(同時に片方しか持てない)召喚酔いを持つ。
以下はゲームの機能である。
・カードリストのjsonファイルから全てのカードリストを読み込む そのログをつける
・プレイヤー1とプレイヤー2のデッキリストのjsonファイルから現在のデッキリストを読み込む。そのログをつける。
・デッキリスト二つの情報を解析しdeckキーを持つカードの名前を読み込み、それを参照して、カードリストからカードの情報全てを取得する。プレイヤー1のデッキリストを山札1に格納する。その際、count要素も読み込んで、同じカードをcountの数値分読み込む。(今回の場合は40枚)そのログをつける。同様に、プレイヤー2のデッキリストを山札2に格納する。そのログをつける。
・読み込んだ山札1と2の順番をランダムに入れ替える。そのログをつける
・プレイヤー1のデッキリストのfirst_energyキーを持つカードの情報を解析し、その名前からカードリストを検索し、その情報を取得する。それらすべてをSゾーン1に裏側状態で置く。そのログをつける。同様にプレイヤー1のデッキリストのfirst_energyキーを持つカードの情報を解析し、その名前からカードリストを検索し、その情報を取得する。それらすべてをSゾーン2に裏側状態で置く。そのログをつける。
・プレイヤー1は山札の上から5枚を手札に加える。その手札を表示する。
・プレイヤー1からの入力を受け付け、望むなら山札1と手札1を加えてシャッフルし、5枚を手札に加える操作をする。なお、そのたび、引き直した手札を表示する。 それは2回まで可能である。
プレイヤー2からの入力を受け付け、望むなら山札2と手札2を加えてシャッフルし、5枚を手札に加える操作をする。なお、そのたび、引き直した手札を表示する。それは、2回まで可能である。
・プレイヤー1が2回引き直すことを選んでいた場合、プレイヤー2はカードを山札から1枚引く
・プレイヤー2が2回引き直すことを選んでいた場合、プレイヤー1はカードを山札から1枚引く
・プレイヤー1と2の入力をそれぞれ受け付け、じゃんけんを行う。勝った方のプレイヤーが先行か後攻かを選択する。
・プレイヤー1と2のSゾーンにある、裏向きのファーストエナジーカードを表向きにし、「ファーストエナジー、オープン!」と表示する。
・先行を選んだプレイヤーをターンプレイヤー、そうでないプレイヤーを非ターンプレイヤーとしてゲームを開始する。
・以下ターン進行ループと以上ターン進行ループの間をどちらかのプレイヤーのXゾーンのカードが6枚以上になるまで、ループさせる。
ターンの進行は、ターンスタート、準備フェーズ、撤退フェーズ、Xフェーズ、メインフェーズ、ターンエンドを繰り返す。
以下ターン進行ループ
・ターンスタートと表示して、ターンプレイヤーの自分のターンであることのフラグを作る。
・(準備フェーズ)準備フェーズと表示する。ドロータイムと表示して、山札からカードを1枚引く
なお、先行を選んだプレイヤーの1ターン目はカードを引くことはできない。
・ターンプレイヤーのFゾーンのスピン状態のカードすべてをリスピン状態にする。
この際、Fゾーンのカード全てを、召喚酔いをしていない状態にする。
・ターンプレイヤーのSゾーンのスピン状態のカードすべてをリスピン状態にする。
・(撤退フェーズ)撤退フェーズと表示し、ターンプレイヤーのFゾーンにカードがある場合以下の処理を行う。まず、Sゾーンにあるカードのエナジーの値の合計Aを計算する。その後、ターンプレイヤーのFゾーンのカード1,2,3...のエナジーB_1,B_2,B_3,...をそれぞれ読み込む。A+B_nを計算し、その和が10以下になるようなFゾーンのカードnを全て表示する。(なお、この計算が出来ればよいので、AやBという代数を使う必要はない)また、撤退しないという選択肢も表示する。プレイヤーからの入力を受け付け、条件を満たしたFゾーンのカードが選ばれた場合、そのカードをSゾーンに表向き裏向き、召喚酔い、スピンリスピン状態の情報を維持したままで移動する。撤退しないという選択肢が表示された場合、次の処理に進む。
・ターンプレイヤーのXゾーンのカードの枚数をカウントし、0枚なら、次の処理に、進む。そうでないなら、Xフェーズと表示し、Xスキルを使うか使わないかの選択肢を表示し、プレイヤーからの入力を受け付ける。使わないを選択した場合は、次の処理に移動する。使うを選択した場合、使いましたと表示して、次の処理に移動します。
・(メインフェーズ)メインフェーズを開始したと表示し、メインフェーズであることのフラグを作成する。フリー状態に移行する。
メインフェーズは複雑なので以下の様に1, 2, 3の区分分けを行う。
1が基本の状態で、入力を受け付け2,3 に遷移し、必要な入力が終われば、1に戻る。 1で入力を受け付け、ターンエンドに遷移する。このような構造になっている。
1フリー状態 この状態になる度、ターンプレイヤーのSゾーンのリスピン状態のカードのエナジーをエレメントごとに読み込む。
そして、Sゾーンのリスピン状態のカードのエナジーの合計をNATURE, FIRE, AQUA, DARK, FENE毎に計算して、それぞれをA, B, C, D, Eとおく。そして、A+E, B+E, C+E, D+Eを計算し、保存しておく。さらに、ターンプレイヤーのFゾーンのカードの状態(カード名、スピンリスピン状態と、召喚酔いの情報、パワー等)を読み込んでおく。
手札のカード1,2,3,...kについてそれぞれのエレメントF_nとエナジーH_nを確認し、F_nがNATUREだった場合H_nをA+Eと、FIREだった場合B+Eと、AQUAだった場合はC+Eと、DARKだった場合はD+Eと比較する。H_nが比較した値以下になるような、手札nの一覧を表示する。(代数は、この計算が出来ればいいのでこのような文字である必要はない。)その際{カード名}{F_n}{H_n}エナジーのカードを使用しますか?という選択肢を条件を満たすカードそれぞれの分表示(選択肢列a)する。
そして、Fゾーンのカードに、リスピン状態で、召喚酔いをしていないカードnがあった場合は、それぞれにおいて、{nのカード名}パワー{nのパワー}で攻撃しますか??と、表示する(選択肢列b)。
そして、ターンを終了する。という選択肢cを表示する。
プレイヤーからの入力を受け付け、選択肢列aが選ばれた場合は、2の処理に移動する。
選択肢列bが選ばれた場合は、3の処理に移動する。
選択肢列cが選ばれた場合は、4の処理に移行する。
2エナジー選択状態
選択したカードがファイターカードだった場合は、2-1に移行する
選択したカードがタクティクスカードだった場合は、2-2に移行する
2-1
選択したカードのエレメントとエナジーをAとBとする。Sゾーンにあるリスピン状態のカードのうち、Aと同じであるか、FENEであるカードのカード名とエナジーの値をすべて表示する。複数チェックリスト方式で選択できるようにしておく。プレイヤーからの入力を受け付け選択されたら、選択されたカードのエナジーの合計を計算し、それ以上であれば、決定という選択肢を表示させる。その選択したカードを手札からFゾーンに召喚酔いした状態で移動させる。その場合2-1-1に移行する
2-1の操作や入力全般において、やっぱりやめるという選択肢を置いておき、それが選択された場合には、1に移行するようにする。
2-1-1 召喚時の処理
召喚されたと表示する。
選択されたカードが手札から召喚されたというフラグを作成する。
1に移行する
2-2
選択したカードのエレメントと必要エナジーをAとBとする。Sゾーンにあるリスピン状態のカードのうち、Aと同じであるか、FENEであるカードのカード名とエナジーの値をすべて表示する。複数チェックリスト方式で選択できるようにしておく。プレイヤーからの入力を受け付け選択されたら、選択されたカードのエナジーの合計を計算し、それ以上であれば、決定という選択肢を表示させる。その選択したカードを手札からSゾーンにリスピン状態で移動する。
その後、Sゾーンのカードのエナジーの合計を計算し、10を超えていたら、2-2-1, そうでないなら、2-3に移行する。
2-2-1エナジーの調整
自分のSゾーンの合計エナジーが10以下になるように、自分のSゾーンのカードを自分のXゾーンに裏側で移動させる。その際に、SゾーンにあるカードSゾーンに送るカードの枚数は最小でなければならない。2-2-2に移行する。
2-2-2 タクティクスカード効果の処理
選択されていたカードを発動したと表示する。
手札から発動時というフラグを作成する。
1に戻る
3アタック状態
非ターンプレイヤーのFゾーンのスピン状態のカードすべてと、非ターンプレイヤーのSゾーンのカード全てを読み込み選択肢として表示させる。すべてのカード名と、パワー(存在すれば)を表示する、またやっぱりやめるという選択肢を置く。ターンプレイヤーに入力させる。
そして、1で選択したファイターをスピンさせる。攻撃時というフラグを作成する。
その後、非ターンプレイヤーFゾーンにリスピン状態の、ガードスキルを持つファイターがいた場合、それぞれのガードを持つカードの名前とパワーを表示し、非ターンプレイヤーにどのファイターでガードをするのか、それともしないのか入力を求める。
ガードを宣言した場合、そのファイターをスピンさせる。
ターンプレイヤーが選択したカードが、Fゾーンのカードだった場合、若しくは、ガードを宣言された場合3-1Sゾーンのファイターだった場合、3-2Sゾーンのタクティクスだった場合、3-3Sゾーンのファーストエナジーだった場合、3-4
やっぱりやめた場合、1に移行する。
3-1
バトルのフラグを作成する
攻撃ファイターのパワーと、ガードを宣言された場合はガードファイターとを比べる。ガードを宣言されていない場合は、ターンプレイヤーが攻撃したファイターのパワーとを比較する。
その際、パワーが同じ場合は、お互いのファイターをバトルで破壊します。パワーが違う場合は、大きい方がバトルに勝利し、小さいほうがバトルで破壊されます。
その後、バトルで破壊されたファイターがいる場合、ターンプレイヤー優先で以下の処理をします。
バトルで破壊されたファイターのコントローラーのSゾーンのカードのエナジーの合計Aを計算する。その後、破壊されたファイターのエナジーBとの合計A+Bを計算し、その和が10以下になるならば、撤退をするか、それとも墓地に送るかという選択肢を表示する。和が10より大きくなるならば、選択肢を表示せずにバトルで破壊されたファイターを自動的に墓地に移動する。
撤退を選んだ場合、バトルで破壊されたファイターをSゾーンに移動する。
バトルのフラグを回収する。
1に戻る
3-2
バトルのフラグを作成する。
攻撃ファイターのパワーと、ターンプレイヤーが攻撃したファイターのパワーとを比較する。
その際、パワーが同じかそれ以上の場合は、非ターンプレイヤーのファイターをバトルで破壊します。パワーが小さい場合は、何も起きません。
バトルで破壊された非ターンプレイヤーのファイターはその持ち主のXゾーンに裏側で送られます。
バトルのフラグを回収する。
1に戻る
3-3
バトルのフラグを作成する。
攻撃したタクティクスカードをバトルで破壊する。
バトルで破壊されたタクティクスカードは、自動的にXゾーンに裏側で移動する。
バトルのフラグを回収する。
1に戻る
3-4
非ターンプレイヤーの山札の1番上から1枚目を1枚Xゾーンに移動する。
1に戻る
・メインフェーズを終了メインフェーズのフラグを回収し、次の処理に移行する。
・自分のターンであるというフラグを回収する。ターンプレイヤーを非ターンプレイヤーに移行し、非ターンプレイヤーをターンプレイヤーに移行する
以上ターンループ
・Xゾーンが6枚以上になったプレイヤーのSゾーンにあるファーストエナジーのカードを、Xゾーンに移動させる。
・Xゾーンにファーストエナジーが送られたプレイヤーは敗北する。
・ゲームを終了する。
エナジーのスピンの組み合わせの実装が難しい。
最適な組み合わせを導出するためには、以下の数学的アプローチが考えられます。この問題は、部分集合のエネルギー合計を計算し、特定の条件を満たす部分集合を見つけるという形で扱うことができます。
### ステップバイステップのアプローチ
1. **カードのエナジーリストの定義**:
まず、Sゾーンにあるカードのエナジー値をリストとして定義します。
[
E = [E_1, E_2, E_3, E_4, E_5] = [3, 2, 4, 5, 1]
]
2. **手札カードのエネルギーの設定**:
手札のカードのエナジーを設定します。
[
l = 5
]
3. **部分集合の生成**:
Sゾーンのカードから可能なすべての部分集合を生成します。これには、各カードを選ぶか選ばないかの二項選択を考慮します。全カードの数が ( n ) なら、部分集合の数は ( 2^n ) になります。
4. **部分集合のエナジー合計の計算**:
各部分集合のエナジー合計を計算します。部分集合 ( S ) が与えられたとき、そのエナジー合計は次のように計算できます。
[
ext{Total Energy}(S) = sum_{i in S} E_i
]
5. **条件のチェック**:
各部分集合のエナジー合計が手札のエナジー ( l ) 以上であるかどうかを確認します。
[
ext{Total Energy}(S) geq l
]
6. **最適な組み合わせの選択**:
条件を満たす部分集合をリストアップします。必要に応じて、エナジー合計が ( l ) ちょうどである部分集合を優先する場合もあります。条件を満たす部分集合から最適な組み合わせを選びます。
### 数学的な計算の実装
このアプローチは、実際にはプログラミングで簡単に実装できますが、手動で行う場合は次のように進めることができます。
- **組み合わせのリストを作成**:
- 1枚の場合: ( E_4 )
- 2枚の場合: ( E_1, E_2 ); ( E_3, E_5 ); など
- **各組み合わせの合計エナジーを計算し、手札のエナジーと比較する**:
- ( E_1 + E_2 = 3 + 2 = 5 )
- ( E_3 + E_5 = 4 + 1 = 5 )
### 結果
このプロセスを通じて、条件を満たすすべての組み合わせを確認し、最適なもの(この場合は合計エナジーがちょうど ( l ) のもの)を選び出すことができます。
この方法論に従って、手動またはプログラムによって最適な組み合わせを見つけることができるでしょう。 これにより、最終的に ( {E_4}, {E_1, E_2}, {E_3, E_5} ) のような組み合わせが得られます。
同様の理由でエナジーの調整の実装も難しい。
今目の前にいる黒人女性が上着のジャンパーを半分開けて、そこにマフラーを流し込んでてめっちゃ爆乳みたいになってる。