- NScripter Ver.18.00
437 :名前は開発中のものです。[sage]:2011/12/25(日) 08:50:59.36 ID:6cu7T9Y+ - >>436
二つミスがある。 一つはfuncそのもの。 このfuncは、引数として与えられた文字列と数値を加工して返すものだと想像できる。 a.文字列については、"関数"と言う文字列を末尾に加えて返し、 b.数値については3倍して返す そういう動作をするものだと考えられる。 function func(str, num) return str.."関数", num*3 end これが一番簡単な実装。欲を言えば引数チェックも欲しい。 function func(str, num) if type(str)~="string" then NSOkBox("第一引数には文字列を指定してください。", "func"); NSEnd() end if type(num)~="number" then NSOkBox("第二引数には数値を指定してください。", "func"); NSEnd() end return str.."関数", num*3 end 二つ目のミスは、記述の順番。 Luaに限った話ではないが、プログラムは上から下に向かって実行される。 >>436 では、下の方でfuncを定義しているので、上の方ではまだfuncが未定義である。 なのにfuncを実行しようとしているので、「funcはnil(未定義)なのに、関数として実行しようとした」と言うエラーメッセージが出る。 順番を入れ替えるとこれは解消される。 NScripterでは、実行の前にラベルを解析してしまうので、これでも動くのだが、Luaではそうはいかない。
|
- NScripter Ver.18.00
438 :名前は開発中のものです。[sage]:2011/12/25(日) 09:36:34.45 ID:6cu7T9Y+ - >>436
しかしまあ、どこの例題か知らんけど、例題のための例題って感じがして、糧になりにくいと思わせるなあ。 前提として、以下のURLの記述を仕様とせよ。 http://wikiwiki.jp/imagine/?%B0%AD%CB%E2%B9%E7%C2%CE%2F2%BF%C8%B9%E7%C2%CE 一体の悪魔は、一つのテーブルで表現されるとする。 例)妖精ピクシーの場合 pixie = {} pixie.level = 4 -- レベルは4 pixie.race = "ピクシー" -- 種族はピクシー pixie.category = "妖精" -- 分類は妖精 悪魔表は一つのテーブルで表現されるとする。 例) daemons = {} daemons[1] = pixie daemons[2] = garm 以下、たくさん。 参考)http://kimamaneko.fc2web.com/megami/devil/devil-kyu2.htm 例題1)引数に悪魔を一体受け、その合体コストを返す関数how_much_for_uniteを作成せよ。 例題2)引数に悪魔を二体受け、それらが合体した場合の新しい分類名を返す関数new_categoryを作成せよ。 ※合体できない組みわせの場合は、nilを返すものとする。 例題3)引数に悪魔を二体受け、それらが合体した場合の新しいレベルを返す関数new_levelを作成せよ。 ※合体できない組み合わせの場合は、nilを返すものとする。 例題4)引数にレベルと分類を受け取り、それに最も近い悪魔を返す関数select_daemonを作成せよ。 ※レベルと分類が完全に一致する悪魔を返すのがよいが、それがなければ、レベルを一つ落として再検索せよ。これを見つかるまで繰り返す。 ※レベルが0が検索されるようであれば、nilを返せ。
|
- NScripter Ver.18.00
440 :438[sage]:2011/12/25(日) 09:44:00.24 ID:6cu7T9Y+ - 例題5)悪魔合体の成功率を返す関数success_rate_for_uniteを作成せよ。
※仕様は適当。自分がルールデザイナーになった気分で考えること。 ※なお、悪魔とプレイヤーとの親密度が高いほど、成功率も高くなるものとする。 こういうゲームのルールを自分で設定して、そのルールを実装するのが、一番訓練になると思う。 その時に心掛けるのは、最初から全部作ろうとしないで、バラバラの部品にしてしまうこと。 難度100の問題を1個解くよりも、難度1の問題を100個解く方が簡単で早いからね。 例題6)例題1〜5までの成果物を組み合わせて、悪魔合体の関数daemon_uniteが作れ。 ※実際にはまだ足りないものがあるはずなので、足りない部分を指摘せよ。 ※足りない部分は作成せよ。
|
- NScripter Ver.18.00
441 :438[sage]:2011/12/25(日) 09:51:11.63 ID:6cu7T9Y+ - >>439
うん、抽象的すぎると思う。俺も思う。 言われたこと、仕様書をただ実装するだけのコーダーならその反論もありだと思う。 けど、このスレにいるのはプログラマーだけじゃないだろうし、 少人数での同人ゲーム開発なんかの場合、ルールデザイナーとプログラマーが兼任することも多いんじゃないか。 なので、ルールデザイナーとしての練習もやって損はないと思う。 ちなみに例題のように分割してやると、後でルールが変わった時にも変更箇所が少なくなって楽になる。
|
- NScripter Ver.18.00
442 :438[sage]:2011/12/25(日) 10:07:01.45 ID:6cu7T9Y+ - 例題1)の回答例
悪魔合体のコストは、悪魔のレベルの二乗の半分切り捨て。 function how_much_for_unite(daemon) local level = daemon.level return math.floor(level * level / 2) end
|
- NScripter Ver.18.00
443 :438[sage]:2011/12/25(日) 10:14:30.54 ID:6cu7T9Y+ - 例題2)の回答例
予め、可能な組み合わせ表を作っておく。 local unite_matrix = {} unite_matrix["鬼神+女神"] = "地母" -- こういうのがずらっと続く function new_category(daemon1, daemon2) local key = daemon1.category.."+"..daemon2.category return unite_matrix[key] end
|
- NScripter Ver.18.00
444 :438[sage]:2011/12/25(日) 10:18:39.99 ID:6cu7T9Y+ - 例題3)の回答例
合体後の悪魔のレベルの最低値は、合体前悪魔のレベルの平均(切り捨て)+1 function new_level(daemon1, daemon2) return math.floor((daemon1.level + daemon2.level)/2)+1 end
|
- NScripter Ver.18.00
445 :438[sage]:2011/12/25(日) 10:26:24.71 ID:6cu7T9Y+ - 例題4)の回答例
お詫び。ルールの読解に間違いがあった模様。合体後のレベルは、例題3の関数で計算した後、そのレベルより上でもっとも近いものだった。 よって、例題4は変更する。 例題4)引数にレベルと分類を受け取り、それに最も近い悪魔を返す関数select_daemonを作成せよ。 ※レベルと分類が完全に一致する悪魔を返すのがよいが、それがなければ、レベルを一つ増やして再検索せよ。これを見つかるまで繰り返す。 ※レベルが100以上で検索されるようであれば、nilを返せ。 悪魔表を使う。 function select_daemon(category, level) if level>99 then return nil end -- デフォルトでレベルが100以上の悪魔は存在しないので、自動的に失敗。 for i, daemon in ipairs(daemons) do -- daemonsは悪魔表テーブル if daemon.category==category and daemon.level == level then -- カテゴリーとレベルが一致したならば、 return daemon -- その悪魔を返す。 end end return select_daemon(category, level+1) -- 一致する悪魔がいなければ、レベルを一つ増やして再検索。 end
|