|
|
2010/5/6(Thu) 21:48:45|NO.32501
始めまして・・・かも知れません。
ずっと前に利用したかも・・・
CSV形式を、どのようにプログラム内に組み込んで、数値を弄れるようにするか?
と言う事で質問が有ります。
私の思いつく限り、CSVは、マップデータとか、SLGの人物や国データとか、
勿論もっと色々使われているのだと思いますが
SLGの人物データを作るとして、
人物名,数値1,数値2,・・・と言うのを何行も作ったテキストデータ(test.txt)を、
#include "hspda.as"
sdim test,30,30
notesel txt
noteload "test.txt"
repeat notemax
loop
で読み込み、
notegetで読み込んでcsvstrで指定し、配列にした何行目の横何列目を読み込み、test(x)で表示したり出来る所までは行くのですが
その数値をどう足したり引いたり、一斉に判定したり出来るか、と言う所が上手くいきません
年が明ければ全員の人物の年を1足し、寿命が来ている者は死なせる・・・
と言う判定にしても、まず全人数分を読み込んで全人数の寿命のデータに年齢に+1し、寿命が来てる者は死んだ事を表す数値にして
プログラムに読み込ませなくする、と言う判定をさせなければ行けないと思うのですが
intや色々な命令を試してみたのですがどうも・・・
誰かヒントや、こう言う所が間違っている、等教えてください
また、
HSPで本格的なSLGと言うと、私はまだトホホッティーさんの「ブランカ」シリーズしか見ていません
(きっともっと有るのでしょう)。
HSPでSLGは、難しいのでしょうか?
それともあまり作る人が少ないだけなのでしょうか?
詳しい方に是非聞いてみたいです。
|
|
2010/5/6(Thu) 22:14:46|NO.32502
CSVがどうこうと言うより、文字列型変数と整数型変数は使い分けが出来ていないんだと思います。
文字列データは文字列型の配列変数。
数値データは整数型の配列変数。
それぞれ別にして管理するとよいと思います。
キャラクターの管理は「キャラクター名」ではなくキャラクターにID番号を振り分けて管理するといいでしょう。
どうしても文字列型の配列変数だけで管理したいなら、
sdim a, 64, 10
a(2) = "123"
a(2) = str( int(a(2))+1 )
a(2) = a(2) + "test"
mes a(2)
というような方法もありますが、速度的にどうなんでしょうね?
一番スマートなのはモジュール変数を使う方法ですが、こちらはちょっと敷居が高いと思います。
> HSPでSLGは、難しいのでしょうか?
そんなことは無いと思います。
作りたいと考える人の中に、たまたまHSPユーザーが少ないのではないでしょうか。
ちなみに今回の質問内容はSLGに限らずAVG、STG、などでも起きる問題です。
|
|
2010/5/6(Thu) 22:56:22|NO.32504
SLGやRPGを作る場合データはツリー状になることが多いのですが、
これをHSPで作ろうと思うと面倒なんですよね。
(作っても再利用できなさそうでやる気が・・・)
>年が明ければ全員の人物の年を1足し、寿命が来ている者は死なせる・・・
>と言う判定にしても、まず全人数分を読み込んで全人数の寿命のデータに年齢に+1し、寿命が来てる者は死んだ事を表す数値にして
>プログラムに読み込ませなくする、と言う判定をさせなければ行けないと思うのですが
SQLiteのようなDBを利用すると検索したり更新したりするのは楽になると思います。
ただし、使いこなすためにDBやSQLについて勉強するのが大変かもしれません。
http://sprocket.babyblue.jp/html/hsp_sqlele.htm
|
|
2010/5/6(Thu) 23:10:28|NO.32505
>年が明ければ全員の人物の年を1足し、寿命が来ている者は死なせる・・・
>と言う判定にしても、まず全人数分を読み込んで全人数の寿命のデータに年齢に+1し、>寿命が来てる者は死んだ事を表す数値にして
いろいろ書いていますが、1つ解決すれば同時に解決するものも
多いはずなので、まず1つに絞りましょう。
>プログラムに読み込ませなくする、と言う判定をさせなければ行けないと思うのですが
普通、「読み込ませなく」したりはしません。
データが変化すれば変化したデータを保存すればいいだけです。
元のCSVを書き換える方法もありますが、配列をそのまま保存すると
読み込みが楽です。
総てを保存するのか一部を保存するのかということもあります。
極端な話、「ゲーム開始から何年たったか」というデータを保存するだけでも
多くの問題が解決しそうです。
|
|
2010/5/6(Thu) 23:15:26|NO.32506
配列をそのまま保存する場合は、そのファイルがあるかどうか調べて、
あればそのファイルを読む、なければCSVファイルを読みます。
|
|
2010/5/7(Fri) 21:27:56|NO.32522
単に?HSP3.2のsplitを駆使してひねりまくって適当に
(何を言っているんだwww)
teststr = "桃,栗,柿"
notesel teststr
dim aa,notemax,100
bkupcnt=0
repeat notemax
noteget tmp, bkupcnt
count=0
repeat strlen( tmp )
a = instr( tmp, cnt, "," )
if a=-1:break
if a!backup:aa(bkupcnt,cnt)=strmid( tmp, backup, a-cnt ):count++
backup=a
loop
foreach aa.bkupcnt
b.cnt=aa.bkupcnt.cnt
loop
split tmp, ",", (b)
foreach b
mes ""+bkupcnt+"行目 "+cnt+"番目のデータ:"+b.cnt
loop
bkupcnt++
loop
この手法だと複数行データが読み込めないので\nを,に置き換えて改行のインデックスを
バックアップしておく。
|
|
2010/5/7(Fri) 21:28:54|NO.32523
でもって上の配列bをターゲットに操作すれば完璧
|
|
2010/5/7(Fri) 23:33:15|NO.32525
皆さん返答有難うございます
>>GENKIさん
文字列と整数型に分けると言う事は、
文字だけを書いたtxtと、数値を書いたtxtに分けて、それぞれ分けると言う事でしょうか?
文字列形配列にこだわる、と言うことは考えていません。
考えられる中で一番確実な方法を選びたいと思います。
>そんなことは無いと思います。
>作りたいと考える人の中に、たまたまHSPユーザーが少ないのではないでしょうか。
そうですか、それを聞いてもっとSLG分野を作ってみたくなりました
>>maaさん
まだ、私はHSPの基礎的な事も出来ているのか怪しいのですが、
そのページを見ると、画像やサンプルを見る限り、自分のやりたい事が出来そうな感じがします。
ダウンロードして、色々触れてみたいと思います。
>>ANTARESさん
>いろいろ書いていますが、1つ解決すれば同時に解決するものも
>多いはずなので、まず1つに絞りましょう。
はい。
>まず全人数分を読み込んで全人数の寿命のデータに年齢に+1し
この部分だけでも出来れば、良いのですが・・・
CSV形式のTXTを、配列に読み込んで、数字を弄れるような状態にするプログラムとは、
どんな物でしょうか?
>>総てを保存するのか一部を保存するのかということもあります。
vsaveで全て保存すると言う事を考えていますが、何かデメリットは有りますか?
>>backdropさん
やはり、プログラムの中で配列を作るんでしょうか。
repeat notemax
noteget tmp, bkupcnt
count=0
repeat strlen( tmp )
a = instr( tmp, cnt, "," )
if a=-1:break
if a!backup:aa(bkupcnt,cnt)=strmid( tmp, backup, a-cnt ):count++
backup=a
loop
この部分は、どう言う部分なんでしょうか?
|
|
2010/5/7(Fri) 23:46:53|NO.32526
|
|
2010/5/8(Sat) 00:33:53|NO.32528
>この部分は、どう言う部分なんでしょうか?
自分で解読するつもりがないのなら、HSPの習得は諦めましょう。
自分には難しすぎると思うのなら、まだまだ勉強が足りないということです。
もっと勉強して出直しましょう。
>>まず全人数分を読み込んで全人数の寿命のデータに年齢に+1し
>この部分だけでも出来れば、良いのですが・・・
>CSV形式のTXTを、配列に読み込んで、数字を弄れるような状態にするプログラムとは、
>どんな物でしょうか?
csvstrを使いたいというので、
それを使ったサンプルを書こうと思いましたが、
仕様をみてびっくり。使い物になりません。
--- busho.csv ---
織田信長,1534
羽柴秀吉,1536
松平元康,1542
--- busho.csv 終わり ---
year=1560 ;現在の年
nbusho=3 ;武将の数
sdim nmBusho,20,nbusho ;武将の名前
dim ybirth,nbusho ;武将の生年
notesel buf
noteload "busho.csv"
tmp=""
mes "名前 生年 年齢"
y=16
repeat nbusho
noteget lbuf,cnt
p=0
getstr nmBusho.cnt,lbuf,p,',': p+=strsize
getstr tmp,lbuf,p,',': p+=strsize
ybirth.cnt=int(tmp)
pos 0,y: mes nmBusho.cnt
pos 72,y: mes ybirth.cnt
pos 112,y: mes year-ybirth.cnt
y+=16
loop
|
|
2010/5/8(Sat) 01:21:01|NO.32529
GENKIさんの貼られた所で学習してみようと思います
有難うございました
|
|
2010/5/8(Sat) 01:57:07|NO.32530
> GENKIさんの貼られた所で学習してみようと思います
うーん、提示したアドレスはあくまで一例です。あそこだけでは足りないはずです。
必ず自分でGoogle先生に聞く、マニュアルを見る、解説サイトをハシゴして回る、サンプルスクリプトをいじってみる、などなどをやってみてください。
機会があれば市販のHSP本を読んで試行錯誤してみるのもいいでしょう。
…マニュアルの場所はわかりますよね。
HSPスクリプトエディタの「ヘルプ」→「HSPマニュアル目次」です。F1ではありません。念のため。
> 仕様をみてびっくり。使い物になりません。
最近は私は使わないので問題ないんですが、ちょっと気になった。何がまずいんだろう…。
|
|
2010/5/8(Sat) 16:29:30|NO.32537
csvの扱いについては置いておいて
>年が明ければ全員の人物の年を1足し、寿命が来ている者は死なせる・・・
>と言う判定にしても、まず全人数分を読み込んで全人数の寿命のデータに年齢に+1し、寿命が来てる者は死んだ事を表す数値にして
>プログラムに読み込ませなくする、と言う判定をさせなければ行けないと思うのですが
この部分についてはこんな方法もあります。
#include "hspda.as"
寿命 = 55
data = "名前,年齢\n信長,50\n秀吉,40\n家康,30"
notesel data
; csvデータを配列に取り出す
sdim index, 64, 2
sdim str_tmp, 64, 3
sdim name
dim age
noteget index_buf, 0
csvstr index, index_buf
repeat notemax-1, 1
noteget index_buf, cnt
csvstr str_tmp, index_buf
name(cnt-1) = str_tmp(0)
age(cnt-1) = int(str_tmp(1))
loop
*put
cls
color 0
repeat 2
pos cnt*64, 0 : mes index(cnt)
loop
repeat 3
color 0
; 年齢がマイナス(死亡)なら赤字で表示
if age(cnt) < 0 {
color 255
pos 0, cnt*16+16 : mes name(cnt)
pos 64, cnt*16+16 : mes age(cnt)*-1
} else {
color 0
pos 0, cnt*16+16 : mes name(cnt)
pos 64, cnt*16+16 : mes age(cnt)
}
loop
pos 0 : button "一年経過" ,*age_plus
stop
*age_plus
; 年齢が寿命に達していなければ年齢を+1、そうでないならそのまま
repeat 3
if age(cnt) >= 寿命 {
age(cnt)*-1
} else : if age(cnt) > 0 : age(cnt) +1
loop
goto *put
stop
|
|
2010/5/8(Sat) 23:27:17|NO.32564
皆さん有難うございます
検索してみて、色々見比べて思ったのですが
TXTで扱うCSV形式って、複雑ですね・・・
もう少し慣れればそう思う事も無くなるのでしょうが。
|
|
2010/5/9(Sun) 01:05:01|NO.32565
あまり初心者向けではないかもしれませんが、sqliteを使ったサンプルを貼っておきます。
;sqlite3.dll, sqlele.hspと同じフォルダに作成してください
#include "sqlele.hsp"
font msgothic, 11
;データベースファイル「sengoku.db」を開く(無ければ作成)
sql_open "sengoku.db"
;「Busho」テーブルを作成(無ければ作成)
sql_q "CREATE TABLE IF NOT EXISTS Busho (ID INTEGER PRIMARY KEY, Name, Age, LifeSpan, Death)"
;LifeSpanは寿命、Deathは死亡しているかどうかを表す
sql_q "BEGIN TRANSACTION"
;レコードを全て削除
sql_q "DELETE FROM Busho"
;武将を追加
addUnit "信長", 40, 42
addUnit "秀吉", 38, 44
addUnit "家康", 36, 46
sql_q "COMMIT TRANSACTION"
showList ; 一覧表示
repeat 9
update ; 年齢の更新
showList ; 一覧表示
wait 20
loop
stop
#deffunc addUnit str _name, int _age, int _lifeSpan
name = _name
age = _age
lifeSpan = _lifeSpan
;武将を追加する
sqlstr = "INSERT INTO Busho (Name, Age, LifeSpan, Death) VALUES ("
sqlstr += prm_text(name) + ","+ prm_i(age) + "," + prm_i(lifeSpan) + "," + prm_i(0)
sqlstr += ")"
sql_q sqlstr
return
#deffunc update
sql_q "BEGIN TRANSACTION"
;生存している武将の年齢を加算する
sql_q "UPDATE Busho SET Age = Age + 1 WHERE Death = 0"
;寿命に達していたらDeathを1にする
sql_q "UPDATE Busho SET Death = 1 WHERE Death = 0 AND Age >= LifeSpan"
sql_q "COMMIT TRANSACTION"
return
#deffunc showList
mes "-------------------------------------------"
sql_q "SELECT Name, Age, LifeSpan, Death FROM Busho"
repeat stat
mes "名前:" + sql_v("Name") + ", 年齢:" + sql_v("Age") + ", 寿命:" + sql_v("LifeSpan") + ", 死亡:" + sql_v("Death")
sql_next
loop
return
次に作るゲームではこの方法を使おうかな。
| |
|