質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

1574閲覧

場に出た時に発動する効果の実装方法

fjaiofjawiefjaw

総合スコア210

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2016/10/13 17:15

編集2016/10/13 17:17

シャドウバースというゲームを参考にカードゲームを作っております。

カードは↓のように管理しております。
{"name": "Quick Blader", "ability": "storm", "attack": 1, "defense": 1, "cost": 1, "type": "follower", "trait": "officer"},
{"name": "Fencer", "ability": "fanfare", "attack": 2, "defense": 2, "cost": 3, "type": "follower", "trait": "commander"}

この'Fencer'の様に'ability'が'fanfare'のカードは、場に出た時、効果が発動します。
'Fencer'の場合は、場にいる'trait'が'officer'のカード一体の'attack'と'defense'をそれぞれプラス1します。

上記の効果を実装する場合、'Fencer'カードに効果の情報を持たせると思いますが、どのようにすればいいか、検討が付きません。

自分は、下記の様なものを'Fencer'カードに追加しようと考えました。
{'abilityInfo':{'target':'trait', 'targetInfo':'officer', 'targetAmount':1,'attack':1, 'defense':1}}
場に出した時、'ability'が'fanfare'の場合、'abilityInfo'を見に行くようなイメージです。

普通は、どのように実装するのでしょうか?
まだ、動かしてもないので、大変恐縮ですが。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ターン制処理であればシークエンスの合間にチェック処理を挟めばよいでしょう
発動条件も複数あるでしょうからきちんと場合分けしておかないと拡張しづらくなるかも
・手札をだしたら
・攻撃したら、されたら
・宣言したら
・ターン毎、何ターン間、何ターン後
・キャラクターの状態変更にあわせて
etc・・・

投稿2016/10/14 02:58

yambejp

総合スコア114812

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fjaiofjawiefjaw

2016/10/14 03:09

回答ありがとうございます。 参考にさせて頂きます。
guest

0

ベストアンサー

'Fencer'の様に'ability'が'fanfare'のカードは

ということなので、他のカードもfanfareやその他のabilityを持つことになると考えられますね。
そうしたら、カード自体にその効果を持つのではなく、別で共通的に効果を管理したらどうでしょうか?
Quick Bladerのstorm方は例で効果を追加してみました。

javascript

1abilityInfo = { 'fanfare': {'target':'trait', 'targetInfo':'officer', 'targetAmount':1,'attack':1, 'defense':1}, 'storm': {'target':'trait', 'targetInfo':'officer', 'targetAmount':3,'attack':4, 'defense':5}} 2 3fencer = {"name": "Fencer", "ability": "fanfare", "attack": 2, "defense": 2, "cost": 3, "type": "follower", "trait": "commander"} 4 5quickBlader = {"name": "Quick Blader", "ability": "storm", "attack": 1, "defense": 1, "cost": 1, "type": "follower", "trait": "officer"}, 6 7// Fencerのabilityを取得する場合 8fencerAbility = AbilityInfo[fencer.ability] 9 10// quickBladerのabilityを取得する場合 11quickBladerAbility = AbilityInfo[quickBlader.ability] 12 13// もしその他にfanfareを持つカードがある場合も、効果の情報を重複して持たせる必要がなくなります。 14attacker = {"name": "Attacker", "ability": "fanfare", "attack": 5, "defense": 2, "cost": 3, "type": "follower", "trait": "commander"} 15 16attackerAbility = AbilityInfo[attacker.ability]

投稿2016/10/13 23:01

cameluby

総合スコア891

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fjaiofjawiefjaw

2016/10/14 03:00

回答ありがとうございます。 上記の考え方によりプログラムを組むのが、楽になりました。 以下、追加で不明点がありましたので、追記します。回答して頂けますと幸いです。 今回の'Fencer'の場合は、場にいるフォロワーのステータスを上げる効果です。 しかしながら、他にも自分の場にフォロワーを召喚する効果を持つものもいます。 例えば、'Oathless Knight'は、場に出た時'fanfare'の効果により、自分の場に'Knight'1体を召喚します。 同じく、'Floral_Fencer'は、'Knight'と'Steelclad_Knight'を1体ずつ召喚します。 以下のように実装しました。これで大体、合っているでしょうか? summonInfo = { 'Knight': {"name": "Knight", "ability": "", "attack": 1, "defense": 1, "cost": 1, "type": "follower", "trait": "officer"}, 'Steelclad_Knight': {"name": "Steelclad Knight", "ability": "", "attack": 2, "defense": 2, "cost": 2, "type": "follower", "trait": "officer"}, } abilityInfo = { 'fanfare_Fencer': {'abilityType':'status', 'target':'trait', 'targetInfo':'officer', 'targetAmount':1,'attack':1, 'defense':1}, 'fanfare_Oathless_Knight': {'abilityType':'summon', 'summonFollower':'Knight', 'target':'myField'}, 'fanfare_Floral_Fencer': {'abilityType':'summon', 'summonFollower':['Knight', 'Steelclad_Knight'], 'target':'myField'} } Fencer = {"name": "Fencer", "ability": "fanfare", "abilityInfo": 'fanfare_Fencer', "attack": 2, "defense": 2, "cost": 3, "type": "follower", "trait": "commander"} Oathless Knight = {"name": "Oathless Knight", "ability": "fanfare", "abilityInfo": 'fanfare_Oathless_Knight', "attack": 1, "defense": 1, "cost": 2, "type": "follower", "trait": "officer"} Floral Fencer = {"name": "Floral Fencer", "ability": "fanfare", "abilityInfo": 'fanfare_Floral_Fencer', "attack": 3, "defense": 4, "cost": 4, "type": "follower", "trait": "commander"} if(card.ability === 'fanfare') { if(AbilityInfo[card.abilityInfo].abilityType === 'status') { // ステータス系の処理 } else if (AbilityInfo[card.abilityInfo].abilityType === 'summon') { // 召喚系の処理 var summonFollower = AbilityInfo[card.abilityInfo].summonFollower; summonFollower.forEach(function(summonName, index){ var summonCard = summonInfo[summonName]; field.push[summonCard]; }); } }
fjaiofjawiefjaw

2016/10/14 03:04

コードが読みにくいですね。 コードは、どうすれば、回答者様のようにJavaScriptで書けるのでしょうか?
cameluby

2016/10/14 03:11

```javascript // javascript のコード ``` のように囲むと、見やすくできますよ! (コメント欄では多分できません) コメントの質問についてですが、いろいろな書き方はありますが、そのような実装で問題は無いと思います。簡単な修正ですと、switch文を使うのもいいかもしれません。 もしあれでしたら、 「タイプ別の処理の方法」のような質問を別でしてもらえると、答えやすいと思います!
fjaiofjawiefjaw

2016/10/14 08:55

回答ありがとうございます。 そうですね。また、別の質問としてさせて頂きたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問