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


HSPTV!掲示板


未解決 解決 停止 削除要請

2018
0916
ぼぶHSPを使って置換をしたいです。まじめな質問です。4未解決


ぼぶ

リンク

2018/9/16(Sun) 13:22:13|NO.85335

今、phpで将棋のプログラムを書いています。
盤面のマスに2をいれると、歩兵を置きます。
盤面のマスに1をいれると、仲人を置きます。(仲人は駒の名前)
盤面のマスに0をいれると、何も駒を置きません。

駒の種類が150種類あるので、手作業ではなくて置換を使いたいと思っています。
index.phpというファイルに関数があります。その関数ban_position($x,$y)を呼び出すと、return $koma_name;で駒の名前を返します。

//関数です。 function ban_position($x,$y){ global $koma_position; if ($koma_position [$x][$y]==0) { $koma_name = " "; }else if ($koma_position [$x][$y]==1) { $koma_name = "仲人"; } * * * . . //アスタリスクを150になるまでたくさん並べます。 . . * * *//ここが150番目のelse if文にしたいと思っています。 return $koma_name; }

何をしたいのかというと、ひとつひとつのアスタリスクを下記のelse if文に置換しようとしてます。

else if ($koma_position [$x][$y]==▲▲) { $koma_name = "★★"; }
このelse if文の★★部分をpos_data.txtに書いてある150種類の駒の名前に置換しようとしています。
そのときに、▲▲部分をそれぞれの駒の名前に対応する番号に置換しようとしています。
理想図↓

function ban_position($x,$y){ global $koma_position; if ($koma_position [$x][$y]==0) { $koma_name = " "; }else if ($koma_position [$x][$y]==1) { $koma_name = "仲人"; }else if ($koma_position [$x][$y]==2) { $koma_name = "歩兵"; }else if ($koma_position [$x][$y]==3) { $koma_name = "飛車"; }else if ($koma_position [$x][$y]==4) { $koma_name = "左車"; }else if ($koma_position [$x][$y]==5) { $koma_name = "右車"; } * * * . .//150番目まで続く。 . * * * return $koma_name; }
gitにindex.phpとpos_data.txtがあります。
https://gist.github.com/Zerosen/033ad85a37f44aeb5a94a902891b737c
教えてくれる方いたら、よろしくお願いします。
pos_data.txtの今回重要な置換したい部分だけ一応ここに貼っておきます。

0駒なし 1仲人 2歩兵 3飛車 4左車 5右車 6横行 7横飛 8堅行 9角行 10龍馬 11龍王 12摩羯 13鉤行 14奔王 15驢馬 16桂馬 17猛牛 18飛龍 19羅刹 20夜叉 21力士 22金剛 23狛犬 24老鼠 25嗔猪 26盲熊 27悪狼 28麒麟 29鳳凰 30師子 31反車 32猫叉 33淮鶏 34古猿 35蟠蛇 36臥龍 37猛豹 38盲虎 39醉象 40香車 41土将 42石将 43瓦将 44鉄将 45銅将 46銀将 47金将 48提婆 49無明 50玉将 100駒なし 101奔人 102金 103金 104金 105金 106金 107金 108金 109金 110成らず 111成らず 112金 113金 114成らず 115金 116金 117金 118金 119金 120金 121金 122金 123金 124蝙蝠 125奔猪 126奔熊 127奔狼 128師子 129奔王 130成らず 131金 132奔猫 133仙鶴 134山母 135奔蛇 136奔龍 137奔豹 138奔虎 139王子 140金 141奔土 142奔石 143奔瓦 144奔鉄 145奔銅 146奔銀 147奔金 148教王 149法性 150自在王



この記事に返信する


科学太郎

リンク

2018/9/16(Sun) 17:03:23|NO.85337

理想図を見て参照テーブルを用意すれば良いと思います。

つまり、HSPでPHPソースを置換命令で編集するよりも
PHPソースそのものを見直すわけです。

function init_table(){ global $koma_table; n=-1; n++;koma_table[n]=" "; // 0番目 n++;koma_table[n]="仲人"; n++;koma_table[n]="歩兵"; n++;koma_table[n]="飛車"; n++;koma_table[n]="左車"; n++;koma_table[n]="右車"; n++;koma_table[n]="横行"; n++;koma_table[n]="横飛"; n++;koma_table[n]="堅行"; n++;koma_table[n]="角行"; n++;koma_table[n]="龍馬"; // 10番目 n++;koma_table[n]="龍王"; n++;koma_table[n]="摩羯"; n++;koma_table[n]="鉤行"; n++;koma_table[n]="奔王"; n++;koma_table[n]="驢馬"; n++;koma_table[n]="桂馬"; n++;koma_table[n]="猛牛"; n++;koma_table[n]="飛龍"; n++;koma_table[n]="羅刹"; n++;koma_table[n]="夜叉"; // 20番目 n++;koma_table[n]="力士"; n++;koma_table[n]="金剛"; n++;koma_table[n]="狛犬"; n++;koma_table[n]="老鼠"; n++;koma_table[n]="嗔猪"; n++;koma_table[n]="盲熊"; n++;koma_table[n]="悪狼"; n++;koma_table[n]="麒麟"; n++;koma_table[n]="鳳凰"; n++;koma_table[n]="師子"; // 30番目 n++;koma_table[n]="反車"; n++;koma_table[n]="猫叉"; n++;koma_table[n]="淮鶏"; n++;koma_table[n]="古猿"; n++;koma_table[n]="蟠蛇"; n++;koma_table[n]="臥龍"; n++;koma_table[n]="猛豹"; n++;koma_table[n]="盲虎"; n++;koma_table[n]="醉象"; n++;koma_table[n]="香車"; // 40番目 n++;koma_table[n]="土将"; n++;koma_table[n]="石将"; n++;koma_table[n]="瓦将"; n++;koma_table[n]="鉄将"; n++;koma_table[n]="銅将"; n++;koma_table[n]="銀将"; n++;koma_table[n]="金将"; n++;koma_table[n]="提婆"; n++;koma_table[n]="無明"; n++;koma_table[n]="玉将"; // 50番目 : (省略) : n++;koma_table[n]="駒なし"; // 100番目 n++;koma_table[n]="奔人"; n++;koma_table[n]="金"; n++;koma_table[n]="金"; n++;koma_table[n]="金"; n++;koma_table[n]="金"; n++;koma_table[n]="金"; n++;koma_table[n]="金"; n++;koma_table[n]="金"; n++;koma_table[n]="金"; n++;koma_table[n]="成らず"; // 110番目 n++;koma_table[n]="成らず"; n++;koma_table[n]="金"; n++;koma_table[n]="金"; n++;koma_table[n]="成らず"; n++;koma_table[n]="金"; n++;koma_table[n]="金"; n++;koma_table[n]="金"; n++;koma_table[n]="金"; n++;koma_table[n]="金"; n++;koma_table[n]="金"; // 120番目 n++;koma_table[n]="金"; n++;koma_table[n]="金"; n++;koma_table[n]="金"; n++;koma_table[n]="蝙蝠"; n++;koma_table[n]="奔猪"; n++;koma_table[n]="奔熊"; n++;koma_table[n]="奔狼"; n++;koma_table[n]="師子"; n++;koma_table[n]="奔王"; n++;koma_table[n]="成らず"; // 130番目 n++;koma_table[n]="金"; n++;koma_table[n]="奔猫"; n++;koma_table[n]="仙鶴"; n++;koma_table[n]="山母"; n++;koma_table[n]="奔蛇"; n++;koma_table[n]="奔龍"; n++;koma_table[n]="奔豹"; n++;koma_table[n]="奔虎"; n++;koma_table[n]="王子"; n++;koma_table[n]="金"; // 140番目 n++;koma_table[n]="奔土"; n++;koma_table[n]="奔石"; n++;koma_table[n]="奔瓦"; n++;koma_table[n]="奔鉄"; n++;koma_table[n]="奔銅"; n++;koma_table[n]="奔銀"; n++;koma_table[n]="奔金"; n++;koma_table[n]="教王"; n++;koma_table[n]="法性"; n++;koma_table[n]="自在王"; // 150番目 } function ban_position($x,$y){ global $koma_position; return koma_table[ $koma_position[$x][$y] ]; }

このようにPHPソースを見直せば高速になります。
※初期化処理で init_table 関数を1回だけ呼び出して ban_position 関数で判定を行う。



科学太郎

リンク

2018/9/16(Sun) 19:06:02|NO.85338

追記。

参照テーブルは固定データですから

$koma_table[]={ "仲人","歩兵","飛車","左車","右車","横行","横飛","堅行","角行","龍馬", "龍王","摩羯","鉤行","奔王","驢馬","桂馬","猛牛","飛龍","羅刹","夜叉", "力士","金剛","狛犬","老鼠","嗔猪","盲熊","悪狼","麒麟","鳳凰","師子", "反車","猫叉","淮鶏","古猿","蟠蛇","臥龍","猛豹","盲虎","醉象","香車", "土将","石将","瓦将","鉄将","銅将","銀将","金将","提婆","無明","玉将", : (省略) : "駒なし","奔人","金","金","金","金","金","金","金","金", "成らず","成らず","金","金","成らず","金","金","金","金","金", "金","金","金","金","蝙蝠","奔猪","奔熊","奔狼","師子","奔王", "成らず","金","奔猫","仙鶴","山母","奔蛇","奔龍","奔豹","奔虎","王子", "金","奔土","奔石","奔瓦","奔鉄","奔銅","奔銀","奔金","教王","法性","自在王" };
とした方が良さそうですね。



いののて

リンク

2018/9/16(Sun) 22:13:23|NO.85340

置き換えのためにプログラムを組むより、正規表現でpos_data.txtを置き換えてコピペするほうが手っ取り早いかと。

pos_data.txtを正規表現置き換え対応エディタで開き、
検索文字列を「([0-9]+)([\s\S]+)$」に
置き換え文字列を「}else if (\$koma_position [\$x][\$y]==$1) {\n\t\$koma_name = "$2";」
で置き換えを実行すると、
0駒なし
1仲人 2歩兵

}else if ($koma_position [$x][$y]==0) {
$koma_name = "駒なし"; }else if ($koma_position [$x][$y]==1) { $koma_name = "仲人"; }else if ($koma_position [$x][$y]==2) { $koma_name = "歩兵";
になりますので、
あとは、1行目のelseを消したりとちょこっと修正すれば手早く終わります。

※HSPで同様のことを行うスクリプト
#include "mod_regexp.as"
sdim out notesel buf noteload "hoge.txt" //pos_data.txtの「0駒なし」以降のテキストデーター repeat noteinfo(0) noteget s, cnt out += replace(s,"([0-9]+)([\\s\\S]+)$","}else if (\\$koma_position [\\$x][\\$y]==$1) {\n\t\$koma_name = \"$2\";\n") //正規表現置換 loop notesel out notesave "out.txt"



ぼぶ

リンク

2018/9/17(Mon) 07:47:08|NO.85342

おー。ありがとうございます。まずよく読んでみます。



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