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


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0506
牛痘マンCSV形式をどのように組み込むか?15解決


牛痘マン

リンク

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は、難しいのでしょうか?
それともあまり作る人が少ないだけなのでしょうか?
詳しい方に是非聞いてみたいです。



この記事に返信する


GENKI

リンク

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、などでも起きる問題です。



maa

リンク

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



ANTARES

リンク

2010/5/6(Thu) 23:10:28|NO.32505

>年が明ければ全員の人物の年を1足し、寿命が来ている者は死なせる・・・
>と言う判定にしても、まず全人数分を読み込んで全人数の寿命のデータに年齢に+1し、>寿命が来てる者は死んだ事を表す数値にして
 いろいろ書いていますが、1つ解決すれば同時に解決するものも
多いはずなので、まず1つに絞りましょう。

>プログラムに読み込ませなくする、と言う判定をさせなければ行けないと思うのですが
 普通、「読み込ませなく」したりはしません。
データが変化すれば変化したデータを保存すればいいだけです。
元のCSVを書き換える方法もありますが、配列をそのまま保存すると
読み込みが楽です。

 総てを保存するのか一部を保存するのかということもあります。
極端な話、「ゲーム開始から何年たったか」というデータを保存するだけでも
多くの問題が解決しそうです。



ANTARES

リンク

2010/5/6(Thu) 23:15:26|NO.32506

 配列をそのまま保存する場合は、そのファイルがあるかどうか調べて、
あればそのファイルを読む、なければCSVファイルを読みます。



backdrop

リンク

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を,に置き換えて改行のインデックスを
バックアップしておく。



backdrop

リンク

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




GENKI

リンク

2010/5/8(Sat) 00:27:15|NO.32527

> 文字だけを書いたtxtと、数値を書いたtxtに分けて、それぞれ分けると言う事でしょうか?

なるほど。やっぱり「変数の型」について理解していないように思います。
CSVなどファイルの読み書きを考える前に変数について、もっと習得が必要なようです。
変数には型があること。型が変わるのはどういうときか、を調べるといいと思います。

とりあえずググってみて丁寧そうな説明を見つけてみました。他にもあると思うのでもっとググってみるなり、マニュアルを見るなりしてみてください。
http://kouza.hamuinu.com/hsp/view/00006.html
http://kouza.hamuinu.com/hsp/view/00012.html



ANTARES

リンク

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さんの貼られた所で学習してみようと思います

有難うございました



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形式って、複雑ですね・・・
もう少し慣れればそう思う事も無くなるのでしょうが。



maa

リンク

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



次に作るゲームではこの方法を使おうかな。



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