|
|
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 //メインへ
| |
|
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
| |
|
2007/7/22(Sun) 21:38:34|NO.9670
謝りながら違反するな
人刺しますごめんなさいと言いながら殺人するようなもんだ
|
|
2007/7/23(Mon) 01:59:21|NO.9672
一文字ウザずぎるから出てくんなよ。
せめて的を射た批判をしろ。ウザイうえに頭が悪いのはみるに堪えん。
|
|