コミュニティアイコン プチコン 非公式コミュニティ プレイ日記

アバター
ジドオブ ◆C5SvT64/Rtme
2022/8/15 9:37
私、こんなコードで隠しキャラの設定してます、すごく疲れます。

IF SCHR==2 OR SCHR==3 OR SCHR==6 OR SCHR==7 OR SCHR==10 OR…
IF SCHR==4 OR SCHR==5 OR SCHR==6 OR SCHR==7 OR SCHR==12 OR…

コレ、どうやって節約すればいいんでしょうか…
1は
IF (SCHR MOD 2)==1 THEN
でいけるのですが…

コメント

アバター
こういち 2022/8/15 10:32 ◆ou0jbJnEJ0Kb
カルノー図ってのがあって、それで節約するのがセオリーだと思います。(ただしSCHARは0〜15あたりが限度)
アバター
ジドオブ 2022/8/15 12:03 ◆C5SvT64/Rtme
>>こういちさん
…カルノー図?教えてくださったのに私の理解が足りなくてすみません…
教えてくださってありがとうございます!!!!!
アバター
あきと 2022/8/15 13:43 ◆Bz8zeG7wRHNQ
SCHRが何なのか分かりませんがマップに隠しキャラの配置をしてるということでしょうか
隠しの位置だけをIF文で指定するよりもマップ全体を表現する配列を持ってしまったほうが後々変更も楽になります

'マップの大きさに合わせてデータを用意
@MAP1
data 0,0,0,1,0,0,0,0,0,0
data 0,0,0,0,0,0,0,0,0,0
data 0,0,0,0,0,1,0,0,0,0
data 0,0,0,0,0,0,0,0,0,0

RESTORE @MAP1  '読み込み位置指定
FOR Y=0 TO 10 '10*3はマップの大きさに合わせる
 FOR X=0 TO 3
  READ ATTR 'DATAから読み込む
  IF ATTR==1 THEN 位置X,Yに隠しキャラ配置
 NEXT
NEXT
アバター
ツララ 2022/8/15 14:02 ◆ArUdBYOYME1V
SCHRは察するにシークレットキャラクター(Secret CHaRacter)、つまり隠しキャラの略なんじゃないんです?

ジドオブさんは「”複数の条件式をOR演算子で連結”した条件式を”短く記述”」したいんですよね?
理解が追いつかない時は頭の中を整理ですよ。
例1に関してはちゃんとできてるんだし
羅列した条件式の最大公約数的な条件を探すのを諦めないで。
スマイルベーシックだろうがC言語だろうが、アルゴリズムさえ理解できていれば
あとは言葉の言い換えみたいなもんですから、実装は語彙力の問題になるので
ネット検索して資料に辿り着けたら、「やること」の「手順」を書き出して整理してみたらいいと思いますよ。
その上で「やること」の抽出が難しい場合に再度質問してみるようにしてみたら
話はスムーズに進むはず。

ちなみに条件式”(SCHR MOD 2)==1”は別の言い換えすると”奇数”判定してるのと同じだったりするで
SCHRが整数型の変数なら”SCHR AND 1”とも書き換え可能
※奇数の条件は2N+1(Nは任意の整数)なので2進数だと1の位のビットが立っていると奇数

あー、でも自らのスキルアップとかどうでもよくて
単に短く記述したいだけなら、コードゴルフを装って皆さんに頼ってズルしちゃうってのも手ですね
頼られるの好きって人もいるだろうし
アバター
うょリウム(元 SPDX) 2022/8/15 14:49 ◆gZYHRw9FSPa8
カルノー図とかいうハイレベルな式を使いこなせればスイスイ行くのかもしれませんが………

私ならこのように文字列を使って
簡略化してしまいます。
SCHRがどこまであるかによりますが……

…あ、MID$をVAL()で囲むのを忘れてた!
VALで数値に変換しないとエラーになります!
SCHR==VAL(MID$(そこに書いてある式)) THEN でokです
アバター
うんざり 2022/8/15 16:19 ◆VZlRV0xeWZeS
配列に比較する数値群を入れておいてfind関数で一発

具体例
dim sh1[]=[2,3,6,7,10,...]
dim sh2[]=[4,5,6,7,12,...]
:
if find(sh1,schr)!=-1 then ...
if find(sh1,schr)!=-1 then ...

3号だったらfind関数がないので、キャラクタコード=数値と見なして、instrで探すとか(但し若干の制約がある)
アバター
ジドオブ 2022/8/16 7:48 ◆C5SvT64/Rtme
あっあっあっ…皆さん、ありがとうございます!!!!!
アバター
こういち 2022/8/16 22:09 ◆ou0jbJnEJ0Kb
今更ながら、カルノー図について解説しておきますね。
カルノー図は画像のような図になります。
SCHRが2,3,6,7,10のいずれかの場合を例に解説します。
まず、2,3,6,7,10を2進数に直すと
00 10
00 11
01 10
01 11
10 10
になるので、カルノー図の対応するマスを1にします。
次に、カルノー図上で1になってる全てのマスをなるべく大きな長方形で囲みます。
ただし、長方形の辺は1,2,4のいずれかの長さである必要があって、左端と右端、上端と下端は繋がってるものとして考えます。(ドラクエのマップと同じです)

そしたら、各長方形の確定している桁を1とした数とSCHRのANDを取ります。
この場合、正方形の方はSCHR AND 10(1010),長方形の方はSCHR AND 7(0111)になります。
あとは、AND取った値が確定した値と等しいか調べます。確定してない桁は0とします。
…正方形の方は2==(SCHR AND 10),長方形の方は2==(SCHR AND 7)ですね。
あとは、それらのORを取れば完成です。
最終的に
IF 2==(SCHR AND 10) || 2==(SCHR AND 7) THEN
になります。

SCHRは0〜15想定です。SCHRが18とかでも条件に引っ掛かります。
AND取ってるのが2進数で000…1010 なので、これを111…1010にすれば16以上が入っても上手く行ったり。
アバター
Na 2022/8/16 23:24 ◆QoELVrBXBQCI
2,3,6,7,10,...
4,5,6,7,12,...
ってことは、2進数の2桁目が1、2進数の3桁目が1、... を判定したいのでしょうか?
それだったら
IF SCHR AND 1 THEN ... (1桁目: SCHR MOD 2 と同じ)
IF SCHR AND 2 THEN ... (2桁目)
IF SCHR AND 4 THEN ... (3桁目)
IF SCHR AND 8 THEN ... (4桁目)
という感じでできると思います。

IF SCHR AND 1<<N THEN ... (N+1桁目) とも書けます。
アバター
ジドオブ 2022/8/17 8:51 ◆C5SvT64/Rtme
>>Naさん
初めてANDのその使い方知りました…ありがとうございます!
アバター
ツララ 2022/8/17 22:23 ◆ArUdBYOYME1V
あきとさんが指摘されてますけど
ジドオブさんが具体的にどんな方法で隠しキャラの設定してるのか
単体のIF文からだけじゃあなんとも言えない感じですね。
実装に適した方法もケースバイケースだったりしますし。
別の投稿でジドオブさんが作ってるプログラムの中身見たりしてるお二人に
「自分ならこうする」って方法を聞いたりして、参考にするのが一番なんじゃないでしょうか。

AND演算子でビット抽出する方法を知らなかったと言うことは
まだ論理演算子でのビット操作に慣れてないみたいですね。
こういうのはBUTTON()関数の扱いの過程で自然に身についてるものだと思うのですが。
…というか「初めて知りました」ってので一気に嘘くさくなりましたね
絶対目にしてる筈なのに
どこが分からないか分からない状態だったりします?
頭の体操がてら論理演算だけで加減乗除の計算する処理とか書いてみたらいいかもですよ
アバター
こういち 2022/8/17 23:27 ◆ou0jbJnEJ0Kb
3号だとBUTTON()で嫌でも慣れるんですけどね。プチコン4のBUTTON()って大分仕様が変わってて、BUTTON(コントローラーID,ボタンID)みたいになってて、ANDが必要ないんですよね。
ボタンIDに-1を入れると今まで通りの仕様になって、複数ボタンの判定で何度もBUTTON()を呼ばなくても良くなっておすすめ。
一応、ANDについては最初の方のツララさんのコメントでも触れられてはいますが、簡単な概念では無いですからね。
アバター
ジドオブ 2022/8/18 15:57 ◆C5SvT64/Rtme
すみません、実は3号もやってはいましたが、その時にはまだBUTTON()の命令には触れていなかったんです。4になってからまともにBUTTON()命令に触れ始めたので…
ANDって奥が深いんですね…

コメントを書く

  • こちらは「プチコン3号」「プチコンBIG」など、プチコンシリーズに関する話題を扱ったコミュニティです
  • プチコンシリーズにまったく関係ない書き込みはご遠慮下さい。削除の対象となります
  • こちらにはその他のゲームや雑談のコミュニティはなく、作る予定もありません (ひとりで管理できないため)。ごめんなさい
  • ユーザー登録なしで書き込みができます
  • 秘密の合い言葉は成りすましの防止 (トリップ機能)、書き込みの編集時の本人認証に使用します
  • 秘密の合い言葉に他人に推測されやすい言葉、他サービスと同じパスワードは入力しないでください。
  • 書き込むと、投稿時に入力したお名前と秘密の暗号が記憶され、ログイン状態になります

- WEB PATIO -