HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2007
0717
アイテムの購入、使用と装備…10解決


リンク

2007/7/17(Tue) 03:04:57|NO.9568

RPGをつくりたくて最近HSPをはじめたばかりです。
テキストベース型の主人公と敵が一対一で戦うだけのRPGもどき
(アイテムや装備品、技・魔法が一切ない)は何とか作れたのですが、
アイテムの売買、管理や武器防具など装備の実装(魔法とかも同様の処理?)が
したいと思っていろいろ考えてみたのですが、その仕方がわかりません。
配列変数を使うんだろうな、ということくらいしかピンときません。
いろいろサイトは回ってみたのですが、この点についてはまったく情報がありませんでした。
いきなりそのものずばりを教えてもらおうとは思っていません。
何かヒントを、たとえば「この命令とこの命令を使う」というだけでもいいので、
ヒントを教えていただけるとありがたいです。

『本を買え』だけは言わないでください。
どうか、よろしくお願いします。



この記事に返信する


ふ〜みん

リンク

2007/7/17(Tue) 04:07:36|NO.9569

何かヒントをということなのでスクリプトはなしで行きます。



装備に関しては
武器の種類を格納する変数を作って、
その変数の値で武器を装備してるかどうかを判断。
0→素手、1→木の枝、2→こん棒
装備してなかったらそのままの攻撃力、
装備してたらその武器に応じた攻撃力をプラスする。

アイテムの管理に関しては
n*2の2次元配列を用意してアイテムの種類と個数を格納していけばいい。
売買は売るときは上の変数から個数を減らし、0個になれば種類のほうも消す。
買うときは同種のものを持ってるかのチェックをして、あれば個数の追加、なければ種類と個数を追加。


という感じでスクリプトを書いてみては??



リンク

2007/7/17(Tue) 17:51:30|NO.9578

装備もどきと購入もどきはできたのですが、
>n*2の2次元配列を用意してアイテムの種類と個数を格納していけばいい。
>売買は売るときは上の変数から個数を減らし、0個になれば種類のほうも消す。
>買うときは同種のものを持ってるかのチェックをして、あれば個数の追加、なければ種類と個数を追加。
このアイテム管理の方法がさっぱりわかりません。
なにか難しい命令を使わなければいけないのでしょうか?


/****************/ /* 武器関係 */ /****************/ sdim wp_name,64,10 //武器名称 dim wp_jdg,10 //武器装備判定 dim wp_att,10 //武器攻撃力 dim wp_price,10 //武器名称 wp_name = "素手","木の枝","こん棒","木の剣","鉄の剣" wp_eq = "素手\n木の枝\nこん棒\n木の剣\n鉄の剣" wp_shop ="素手:0\\\n木の枝:10\\\nこん棒:50\\\n木の剣120\\\n鉄の剣:480\\" //武器装備判定 repeat 5 wp_jdg.cnt = cnt wait 5 loop wp_att = 0,1,3,5,8//武器攻撃力 wp_price = 0,10,50,120,480//武器価格 power =10//力 attack = power + wp_att.0//攻撃力 /********************/ /* アイテム関係 */ /********************/ money = 10000//所持金 dim item_id,10//アイテムID dim item_have,10//アイテム所持数 repeat 5 item_id.cnt = cnt item_have.cnt = 0 wait 5 loop /********************/ /* メイン */ /********************/ *main repeat clrobj color,,:boxf color 255,255,255 pos 10,10 listbox wps,,wp_eq mes "力\t\t" + power mes "攻撃力\t\t" + attack mes "武器名称\t" + wp_name.wps mes "武器装備判定\t" + wp_jdg.wps mes "武器攻撃力\t" + wp_att.wps button "装備" , *eq pos 300,10 listbox item,,wp_shop mes "所持金\t\t" + money for id,0,5,1 mes "武器名称\t" + wp_name.id mes "アイテムID\t" + item_id.id mes "アイテム所持数\t" + item_have.id next button "購入" , *buy wait 5 stop loop //攻撃力変化 *eq if(wp_jdg.wps=wps){ attack = power + wp_att.wps } goto *main //アイテム購入 *buy if(item_id.item = item){ money -= wp_price.item item_have.item +=1 } goto *main



ライセン

リンク

2007/7/17(Tue) 18:05:02|NO.9579

一番下は、種類を持っていれば1とし、もっていなければ0とします。(二次元配列の種類のほう)
木の枝を買おうとしたときに、その種類があるか検索します。あれば(1)個数を増やします。
種類がなければ(0)、種類(1にする)と個数を増やします。

真ん中は、個数が0になると種類がある意味が無いので、消すという事です。
種類がアイテムの名前だったら、別の変数を用意。



リンク

2007/7/17(Tue) 21:27:40|NO.9582

n*2をn^2と勘違いして考えてました。そりゃさっぱりわからないですよね…

>買うときは同種のものを持ってるかのチェックをして、
>木の枝を買おうとしたときに、その種類があるか検索します。
これは、たとえば、上のスクリプトの

listbox item,,wp_shop
のリストボックス内の文字列とアイテム所持用リストボックス(?)内の両方を
検索し比較する、ということで、

>売買は売るときは上の変数から個数を減らし、0個になれば種類のほうも消す。
>買うときは同種のものを持ってるかのチェックをして、あれば個数の追加、なければ種類と個数を追加。

>種類がなければ(0)、種類(1にする)と個数を増やします。
>真ん中は、個数が0になると種類がある意味が無いので、消すという事です。
は、アイテム所持用リストボックスに種類がなければリストボックスにその文字列を追加して、
種類が0個になったらリストボックスから消去するといった感じでいいのでしょうか?

なにやら手ごわそうな雰囲気ですが、がんばります。



リンク

2007/7/19(Thu) 23:32:26|NO.9615

かなり醜いスクリプトですが…
「買う」と「個数管理」はなんとか形にはなったかと思います。「売る」はまだですが…
上で戴いたレスでのヒント「二次元配列」の、持ってると「1」で持ってないと「0」という
管理方法ですが、二次元配列の使い方(方法?)がよくわからなかったので、
以下のようにチェック用に配列変数(shop)を用意しました。すべて一次配列です。
ふ〜みんさんやライセンさんの「二次元配列」所持非所持で1と0にするという管理法は、
概念(という言葉でいいのかわかりませんが)はなんとなくわかるのですが、
具体的な方法が浮かびません。もう少し何かヒントがあれば教えていただけませんか?


my_have = "木の枝\nこん棒\n薬草\n水晶\nキノコ" //所持品 wp_shop1 = "ヒノキの棒\n木の枝\nこん棒\n木の剣\n鉄の剣\nグラム\n水晶\nキノコ" //店の商品 dim i_have,8 //所持数(所持可能な最大種類数を8として) i_have = 1,2,3,4,5,0,0,0 //仮に持っている個数 sdim wps,255,10 //所持リスト一時退避用の変数配列 dim shop,10 /*商品が所持品一致してるかどうか を調べる変数配列。店ごとに設定?*/ *main //メインループ repeat clrobj color ,, :boxf color 255,255,255 pos 10,10 mes "店1" //商品リストボックス listbox aaa, , wp_shop1 //aaaは状態保持変数 button "買う", *buy_jdg1 pos 200,10 mes "所持" //所持リストボックス listbox zzz, , my_have //zzzは状態保持変数 notesel my_have //所持品リストの変数 obj_id = stat repeat notemax //現在所持種類数回ループ pos 300,10+cnt*20 //リストの横に個数表示 mes "" + (cnt+1) + ":" + i_have(cnt) + "個" await 10 loop stop await 10 loop *buy_jdg1 notesel wp_shop1 //品揃え用の変数 noteget wp1, aaa //リストボックスから文字列を取得 mes wp1 //状態保持してる文字列を表示 notesel my_have //所持品用の変数 repeat notemax //上の変数の行数回ループ noteget wps(cnt), cnt //先頭から順に1行ずつ取り出す loop repeat length(wps) //所持リスト一時退避用の変数配列分だけループ if wp1==wps(cnt){ //所持リスト内に商品と一致するものがあれば mes "cnt=" + cnt //リストの状態(cnt)を表示 qqq = cnt //リストの状態をqqqに代入 mes "qqq=" + qqq //qqq表示 shop(0) = 1 //一致したら「1」を代入 break //一致したものがあればループを抜ける }else{ notesel my_have //所持品リスト qqq = notemax //現在の所持品数を代入 shop(0) = 0 //一致しなかったら「0」を代入 } loop mes "所持=1、非所持=0:shop(0)=" + shop(0) //所持か非所持か、目視のために mes "qqq=" + qqq //所持リストの状態保持を代入したもの switch shop(0) //一致してるかしてないか case 0 //持ってない mes "" + wp1 + "を持っていません。" //wp1は商品リストから選択したもの notesel my_have //所持品リスト if notemax < 8{ //所持品数が最大所持数以下の場合 noteadd wp1,-1,0 //商品を所持品の最後尾に追加 objprm obj_id,my_have //商品を追加した所持品リストを更新 mes "i_have(qqq)=" + i_have(qqq) //目視確認 i_have(qqq)++ //所持個数に+1 mes "i_have(qqq)=" + i_have(qqq) //目視確認 mes "" + wp1 + "を購入しました。" mes "" + i_have(qqq) + "個" }else{ //所持品数が最大所持数以上の場合 mes "これ以上所持できません。" } wait 200 swbreak case 1 //すでに持っている i_have(qqq)++ //所持個数に+1 mes "" + wp1 + "を購入しました。" mes "" + i_have(qqq) + "個" wait 200 swbreak swend goto *main //メインへ



Elfizm

リンク

2007/7/20(Fri) 02:17:47|NO.9616

とてもよくできています。
ただし、購入の度に文字列を比較するのは、あまり効率がよくないです。

元のスクリプトをできるだけ維持した形で二次配列を用いた例です。
ただし、購入部分は作成していません。


item_max = 9 // アイテムの種類の数 sdim item_name, 255, item_max // アイテムの名前リスト item_name(0) = "なし" // ID = 0 のアイテム item_name(1) = "ヒノキの棒" // ID = 1 のアイテム item_name(2) = "木の枝" // ID = 2 のアイテム item_name(3) = "こん棒" // ID = 3 のアイテム item_name(4) = "木の剣" // ID = 4 のアイテム item_name(5) = "鉄の剣" // ID = 5 のアイテム item_name(6) = "グラム" // ID = 6 のアイテム item_name(7) = "水晶" // ID = 7 のアイテム item_name(8) = "キノコ" // ID = 8 のアイテム // 店の設定 shop_max = 8 // 店で扱う商品の数 dim shop_have, shop_max // 店の商品を設定する配列変数 sdim shop_list, 1024 // リストボックス用の文字列 shop_have = 1, 2, 3, 4, 8, 6, 7, 5 /* ID = 1, 2, 3, 4, 8, 6, 7, 5 の順に商品を扱う。 リストボックスに表示される文字列が 上のitem_nameと連動してるのが分かると思います。 */ notesel shop_list // リストボックス用の文字列を作成 repeat shop_max noteadd item_name( shop_have(cnt) ), -1, 0 loop have_max = 8 // 所持品の最大数 dim i_have, item_max, 2 // 所持品の配列変数(アイテムID, 個数) sdim i_have_list, 256 // リストボックス用の文字列 i_have(0,0) = 1 // 所持品ID=0 の アイテムID を 1 に設定 i_have(0,1) = 1 // 所持品ID=0 の アイテム個数 を 1 に設定 i_have(1,0) = 6 // 所持品ID=1 の アイテムID を 6 に設定 i_have(1,1) = 2 // 所持品ID=1 の アイテム個数 を 2 に設定 notesel i_have_list // リストボックス用の文字列を作成 repeat have_max noteadd item_name( i_have(cnt, 0) ), -1, 0 loop

アイテムの文字列を配列で管理することでちょっとスムーズにしています。
所持品や、ショップのアイテムはすべて文字列ではなくID(番号)で管理します。
こうすると、購入処理はIDの比較だけですむので楽になります。
ただし、アイテムが少ない場合はわざわざ「アイテムID|個数」という配列を用いないでも
配列のキー(番号)をそのままアイテムのIDとして扱ってしまってもOKでしょう。

頑張ってください。



リンク

2007/7/20(Fri) 20:18:13|NO.9624

二次元配列でのアイテム管理法のヒント(というかそのままズバリ?)ありがとうございます。
軽く頭がこんがらがりそうになってますが、じっくりとよく考えて、
二次元配列を使った方法で、まず、購入売却とアイテム管理の仕方を構築してみようと思います。

(これに加えて、アイテムの値段や、アイテム使用時の効果、
 武器防具の脱着などなどを組み合わせると考えると、ちょっとしたパニックに…)



リンク

2007/7/22(Sun) 17:42:29|NO.9668

教えていただいた二次元配列を使ったアイテム管理がなんとかそれっぽい形になりました。
武器脱着やアイテム使用、他に魔法や技は、これの応用でなんとかなると思います。
いろいろヒントをありがとうございました。
最後に、スクリプトを貼ってみます。いろいろと効率が悪かったり無駄な処理をしてたりしてそう…
>不要部分の多い長いスクリプトの投稿は ご遠慮ください。
すみません。

/********************************/ /*アイテム管理(二次元配列使用)*/ /********************************/ title "アイテム管理" //変数の宣言 //アイテム item_variety_max = 50 //50種類 sdim item_name , 255 , item_variety_max //アイテムの名前リスト //ID0〜ID49のアイテム名 item_name(0) = "なし","薬草","毒けし草","傷薬(軟膏)","傷薬(飲み薬)" item_name(5) = "高級傷薬","神薬","目薬","きつけ薬","痺れとり薬" item_name(10) = "興奮剤","安定剤","幻覚剤","睡眠薬","麻酔薬" item_name(15) = "腕力の実","体力の実","脚力の実","知力の実","魔力の実" item_name(20) = "キノコ","鯛","いくら","ウニ","栗" item_name(25) = "","","","","" item_name(30) = "木の枝","木の剣","石の剣","鉄の棒","鉄の剣" item_name(35) = "漆黒の短刀","安物ナイフ","ナイフ","果物ナイフ","正宗" item_name(40) = "普段着","革の服","大木の樹皮","革の簡易鎧","鉄の鎧" item_name(45) = "暗黒の衣","ミスリルメイル","スチールアーマー","","" dim item_value , item_variety_max //アイテムの価格リスト item_value(0) = 0,50,120,100,110 item_value(5) = 500,10000,80,1000,100 item_value(10) = 300,300,300,200,400 item_value(15) = 1500,1500,1500,1500,1500 item_value(20) = 30,120,250,10,550 item_value(25) = 0,0,0,0,0 item_value(30) = 5,50,100,250,400 item_value(35) = 5000,15000,15000,15000,15000 item_value(40) = 200,150,300,450,600 item_value(45) = 5000,15000,15000,0,0 //店 shop_variety_max = 2 //店の数は全部で2店舗 shop_goods_max = 8 //1店舗で扱う商品数 dim shop_have1 , shop_goods_max // 店の商品を設定する配列変数 dim shop_have2 , shop_goods_max // 店の商品を設定する配列変数 sdim shop_list , 1024 , 2 // リストボックス用の文字列(2店舗分) dim shop_variety_id , 2 //リストボックスの状態保持用変数(2店舗分) dim temp , shop_goods_max //購入時、店ごとの商品IDを一時避難させるための配列 shop_have0 = 1, 2, 3, 7, 8, 13, 14, 5 //ID = 1, 2, 3, 7, 8, 13, 14, 5 の順に商品を扱う shop_have1 = 31, 32, 33, 34, 40, 41, 42, 44 //リストボックスに表示される文字列が上のitem_nameと連動 notesel shop_list(0) // リストボックス用の文字列を作成 repeat shop_goods_max //取り扱い種類数回ループ noteadd item_name( shop_have0(cnt) ), -1, 0 //商品をリストに追加 loop notesel shop_list(1) // リストボックス用の文字列を作成 repeat shop_goods_max //取り扱い種類数回ループ noteadd item_name( shop_have1(cnt) ), -1, 0 //商品をリストに追加 loop //主人公アイテム管理 money = 10000 //所持金 i_have_max = 8 // 所持品の最大数 dim i_have, i_have_max, 2 // 所持品の配列変数(アイテムID, 個数) sdim i_have_list, 512 // リストボックス用の文字列 i_have_id = 0 //リストボックス状態保持用変数 i_have(0,0) = 1 // 所持品ID=0 の アイテムID を 1 に設定 i_have(0,1) = 3 // 所持品ID=0 の アイテム個数 を 3 に設定 i_have(1,0) = 5 // 所持品ID=1 の アイテムID を 5 に設定 i_have(1,1) = 1 // 所持品ID=1 の アイテム個数 を 1 に設定 i_have(2,0) = 32 i_have(2,1) = 1 notesel i_have_list // リストボックス用の文字列を作成 repeat i_have_max noteadd item_name( i_have(cnt, 0) ), -1, 0 loop //================================ // リストボックス表示 //================================ *main repeat redraw 0 clrobj color ,, : boxf : color 255,255,255 pos 10,10 sysfont mes "道具屋" listbox shop_variety_id(0) , , shop_list(0) //店舗1の商品リスト button "購入" , *buy //アイテム購入処理へ aaa = stat //オブジェクトID button "売却" , *sale lll = stat //オブジェクトID mes "aaa:lll=" +aaa+ ":" +lll //ID目視確認 pos 80,30 font "MS明朝",12 repeat shop_goods_max mes "" + item_value( shop_have0(cnt) ) + "G" //価格表示 loop pos 150,10 sysfont mes "武具屋" listbox shop_variety_id(1) , , shop_list(1) //店舗2の商品リスト button "購入" , *buy //アイテム購入処理へ bbb = stat //オブジェクトID button "売却" , *sale mmm = stat //オブジェクトID mes "bbb:mmm=" + bbb + ":" + mmm //ID目視確認 pos 220,30 font "MS明朝",12 repeat shop_goods_max mes "" + item_value( shop_have1(cnt) ) + "G" //価格表示 loop pos 400,10 sysfont mes "所持品" + money + "G" listbox i_have_id , , i_have_list //主人公の所持品リスト iii = stat mes "iii=" + iii pos 470,30 font "MS明朝",12 repeat i_have_max mes "" + i_have(cnt, 1) + "個" //所持数表示 loop redraw 1 stop await 10 loop //==================== // アイテム購入 //==================== *buy switch stat //リストボックス毎(リストボックスに対応するボタン毎)に購入処理の変数を設定 case aaa //道具屋リストボックスに対応するボタンオブジェクトのシステム変数 repeat shop_goods_max temp(cnt) = shop_have0(cnt) //道具屋の商品IDをコピー loop id = 0 //道具屋に対応するID //配列の要素に使う swbreak case bbb //武器屋リストボックスに対応するボタンオブジェクトのシステム変数 repeat shop_goods_max temp(cnt) = shop_have1(cnt) //武器屋の商品IDをコピー loop id = 1 //武器屋に対応するID //配列の要素に使う swbreak swend //商品リストで選択した項目と所持品が一致しているか判定 notesel i_have_list // リストボックス用の文字列を作成 repeat notemax //アイテム所持数回ループ if(temp(shop_variety_id(id)) == i_have(cnt,0)){ xxx = 1 //持っていたら1 how_many = cnt //所持リストのindexIDを一時保持 break }else{ xxx = 0 //持っていない0 } await 10 loop switch xxx case 0 //持っていない if(money >= item_value(temp(shop_variety_id(id)))){ //所持金が足りてる場合 notesel i_have_list repeat notemax if(i_have(cnt,0) == 0){ //所持品のアイテムIDが0の場合 noteadd item_name(temp(shop_variety_id(id))),cnt,1 //商品を上書き追加 objprm iii,i_have_list //商品を追加した所持品リストを更新 money -= item_value(temp(shop_variety_id(id))) //商品価格を所持金から引く i_have(cnt,0) = temp(shop_variety_id(id)) //所持品アイテムID i_have(cnt,1)++ //所持数に追加 break }else{ if(cnt = 7){ //最大所持品数に達したら mes "それ以上持てません。" await 1000 } } await 10 loop }else{ mes "所持金が足りません。"} swbreak case 1 //持っている if(money >= item_value(temp(shop_variety_id(id)))){ //所持金が足らない場合 money -= item_value(temp(shop_variety_id(id))) //商品価格を所持金から引く i_have(how_many,1)++ //所持数に追加 }else{ mes "所持金が足りませんよ。"} swbreak swend await 10 goto *main //========================================================== // アイテム売却 //========================================================== *sale switch stat //リストボックス毎(リストボックスに対応するボタン毎)に購入処理の変数を設定 case lll //道具屋リストボックスに対応するボタンオブジェクトのシステム変数 item_down_limit = 1 //分類が道具に相当するアイテムIDの上限と下限 item_up_limit = 25 swbreak case mmm //武器屋リストボックスに対応するボタンオブジェクトのシステム変数 item_down_limit = 30 //分類が武器に相当するアイテムIDの上限と下限 item_up_limit = 49 swbreak swend //道具屋の売却ボタンなら道具相当のIDだけ売却可(武器屋のボタンなら以下略) notesel i_have_list if((i_have(i_have_id,0) >= item_down_limit) && (i_have(i_have_id,0) < item_up_limit)){ i_have(i_have_id,1)-- //所持数からマイナス1個 money += (item_value(i_have(i_have_id,0)) / 2) //価格の半分を売却額として所持金に追加 if(i_have(i_have_id,1) <= 0){ //所持数が0個以下になったら i_have(i_have_id,0) = 0 //アイテムIDを0(なし)に i_have(i_have_id,1) = 0 //アイテム所持数を0に(この処理は必要なのか?) noteadd item_name(0),i_have_id,1 //所持数が0になった所持リストindexにアイテムID0を上書き objprm iii,i_have_list //所持品を変更した所持品リストを変更 } }else{ if(i_have(i_have_id,0) == 0){ mes "何も持ってませんよ。" //道具は道具屋、武器は武器屋でしか売れない wait 150 }else{ mes "それはうちでは買い取れません。" wait 150 } } await 10 goto *main



a

リンク

2007/7/22(Sun) 21:38:34|NO.9670

謝りながら違反するな
人刺しますごめんなさいと言いながら殺人するようなもんだ



フォトン

リンク

2007/7/23(Mon) 01:59:21|NO.9672

一文字ウザずぎるから出てくんなよ。
せめて的を射た批判をしろ。ウザイうえに頭が悪いのはみるに堪えん。



ONION software Copyright 1997-2021(c) All rights reserved.