teacup. [ 掲示板 ] [ 掲示板作成 ] [ 有料掲示板 ] [ ブログ ]

 投稿者
  題名
  内容 入力補助
    
 URL
[ ケータイで使う ] [ BBSティッカー ] [ 書込み通知 ]


ごめんなさい。『例)連続入力に絞って最適化』のところに致命的な間違いがありますので、御手数ですがこちらに置き換えてください。

 投稿者:Myu  投稿日:2015年 5月18日(月)08時49分11秒
  例)連打入力に絞って最適化

『No.001 キーの交互押し判定について』の要領でフラグを使用します。
フラグCのデフォルト値は0又は1にします。
それ以外の値にすると、処理Bの無効化が可能です。

・変化が無い時→処理Aを実行
・押した瞬間 or離した瞬間→処理Bを実行

C=1
*LOOP
IF C-LEN INKEY$ THEN 処理A ELSE C=1-C:処理B
GOTO *LOOP


例) [A]キーに限定する

フラグCのデフォルト値は0又はSにします。
それ以外の値にすると、処理Bの無効化が可能です。

S=ASC "A"
C=S
*LOOP
IF C-ASC INKEY$ THEN 処理A ELSE C=S-C:処理B
GOTO *LOOP

 
 

??ワンポイントテクニック投稿(テクニック名 『1Key入力判定』 )

 投稿者:Myu  投稿日:2015年 5月17日(日)21時37分34秒
  2015.5.17

こんばんは、Myuと申します。
現在、日本国内での投稿者は限られてくると思いますが、誰だか分かっても言わないでくださいね!


《第1章 素材選びはすべての源
固定画面で障害物をジャンプで避けつつ端から端まで移動するという感じにするなど簡略化によって負担を軽くすると良いでしょう。》

あっさりと書かれていらっしゃるので、軽い気持ちで作ってみようと思ったものの…

障害物をジャンプして避ける…
ではなくて、パンチで破壊するゲームを作ろうと思考中でのこと…
『あ~んパンチ!』のつもりが…
『あ~たたたたたたたたたた!』って百烈拳になっちゃったり。。。
そして、、、
これを直してたら1Lじゃ収まらなくなってこっそり2L GAMEにしちゃったり…
黙ってれば誰にもバレない?!

そんなこんなできっと他にも同じ様な経験をした人がいるのではないかと思い、今回このテーマを選びました。


※条件式に関して
不等号を使用すると掲示板の設定によってはHTMLタグとして誤認識されてしまうため使用していません。また、処理を軽くするために等式にしていません。
そのため、それに続く各処理の順に統制が取れなくなってしまいました。
パズルを解読するつもりで眺めていただければと思います… m(。_。)m

あと、フラグ、フラグとその言葉がいっぱいでてきますが、超多階調で多機能なフラグという提で見てください!


あと、、、投稿日とフラグ名には何かしらの関係が。。。


《前置き ここまで》




【ワンポイントテクニック】

『1Key入力判定』


【基本形】

INKEY$を使用してキーの状態を取得してそれに対応する処理をします。
その際、次の様なプログラムで済むことが多いかと思います。

(イ) キーが押下されていない時→処理Ⅰを実行
(ロ) キーが押下されている時→処理Ⅱを実行

IF INKEY$ THEN 処理Ⅱ ELSE 処理Ⅰ


【フラグを利用する】

フラグを使用するとその後の応用が利かせやすくなります。

(イ)の時→フラグBは0
(ロ)の時→フラグBは1

IF INKEY$ THEN B=1 ELSE B=0
IF B THEN 処理Ⅱ ELSE 処理Ⅰ

LENを使用するとスッキリとします。

B=LEN INKEY$
IF B THEN 処理Ⅱ ELSE 処理Ⅰ

フラグの値が変わってしまいますが、ASCを知ることも出来る為こちらもお薦めです。

(イ)の時→フラグBは0
(ロ)の時→フラグBは0以外

B=ASC INKEY$
IF B THEN 処理Ⅱ ELSE 処理Ⅰ


【取得したいキーの4状態】

キーを押した瞬間や離した瞬間を知りたいこともあります。
それを踏まえるとキーの状態を次の4つに分類する事が出来ます。

①キーが離されている状態
②キーが押された瞬間
③キーが押されている状態
④キーが離された瞬間

しかし、これら全てをプログラム内に取り入れようとするとなんだか複雑なプログラムになりそうな気配です。

安心してください!
比較的短い幾つかの式でこれらの状態を得ることが出来ます。

これです。

*LOOP

A=LEN INKEY$ :REM ANY KEY
K=A-B:REM CHANGE
B=A :REM KEY ON/OFF

IF K IF B THEN 処理② ELSE 処理④ ELSE IF B THEN 処理③ ELSE 処理①

GOTO *LOOP

1. A=LEN INKEY$
キーの状態を取り込みます。
押下されていなければ0を、押下されていれば1を、フラグAに反映させます。

2. K=A-B
直前のキーの状態と比較をします。
変化がなければ0を、変化があれば1を、フラグKに反映させます。
つまり、押された瞬間、あるいは、離された瞬間、フラグKが立ちます。

※簡略化の為に省きましたが、フラグBの初期値を0にするか他の値にするかで、意図的にフラグKの初回セットに変化を与えることができます。
効果的に利用できる反面、思わぬバグが潜むこともあります。

3. B=A
現在のキーの状態をフラグBに控えます。
フラグBを見れば、押されているか離されているかが分かります。


使用するキーを特定のものに限定することが可能です。

例) [A]キーを使用する場合。

A=INKEY$ ="A" :REM [A]KEY TRUE/FALSE
K=A-B:REM CHANGE
B=A:REM [A]KEY TRUE/FALSE


【最適化を考える】

先程は全てのパターンを盛り込みました。
用途や機能を絞ることでサイズの節約や処理の高速化に繋がります。
また、各処理の優先度に合わせて条件文を組み合わせて処理順序を調整することでも高速化が望めます。

例)フラグKを他で使用しない場合それを省く事が出来ます。

*LOOP
A=LEN INKEY$
IF A-B LET B=A :IF B THEN 処理② ELSE 処理④ ELSE IF B THEN 処理③ ELSE 処理①
GOTO *LOOP


例)連打入力に絞って最適化

・変化が無い時→処理Aを実行
・押した瞬間 or離した瞬間→処理Bを実行

B=0
*LOOP
A=LEN INKEY$ :IF A-B LET B=A:処理B ELSE 処理A
GOTO *LOOP


特定のキーに限定する時は『No.001 キーの交互押し判定について』の要領でフラグを使用します。

例) [A]キーに限定する

フラグCのデフォルト値は0又はSにします。
それ以外の値にすると、処理Aの無効化が可能です。

S=ASC "A"
C=S
*LOOP
IF C-ASC INKEY$ THEN 処理A ELSE C=S-C:処理B
GOTO *LOOP

【最後に一言】

プログラムの操作性が今一歩という時は、各々の処理に対するキーの扱いが適切であるか見てみると良いでしょう。


《ワンポイントテクニック…ここまで》


これのどこにテクニックが入ってるにょ?と問われると回答に困りますが…
No.001の前座的なものだと思っています。
『1つのキーを押す』
『2つのキーを交互に押す』
…と続くと、次は、
『複数のキーを順に押す』も要りそうな気が…
そして、、、
『同時キー入力』へと至り…

まぁ『どぉでもぃぃ』ことですが。。。



最後に…

今も思うのですが、、、
No.001のフラグ計算が、引き算ひとつで次のキーのコードに切り換えられてしまうというシンプルさとその手法の存在を知ったときの衝撃は、バチバチバチって電気が走りました。。。


                                          By Myu.
 

三角関数について

 投稿者:miho(初心者)  投稿日:2014年11月 3日(月)23時07分5秒
  小6女子です。
三角関数についてです。
ネットで調べてみたのですが、
全く理解できません。
基本だけで良いので、
わかりやすく教えてください><
 

ポケコン

 投稿者:名無し  投稿日:2014年 6月12日(木)16時36分47秒
  ポケコンて、今売っているのですか?

 

初心者です。

 投稿者:やまちゃん  投稿日:2014年 2月 1日(土)16時52分51秒
   はじめまして。
 最近、ポケコンが懐かしくなり、手に取ろうと思いました。
 年齢は上ですが、ポケコンはBASICプログラムを入力して遊ぶだけのユーザーでした。
 そんな私でもPC-E500を使いこなせるマシンでしょうか?
 学生時代は遊ぶだけでしたが、いまさらですが、細々と勉強してプログラムを作ってみたいです。
 カシオのPB-110を所有していますが、1ケタの液晶なので、広い画面を持っていてもいいかなと思っていますが、まったくの初心者なので、PC-E500を購入するか迷っています。
 お手数をおかけしますが、アドバイスを頂戴できればうれしいです。
 よろしくお願いいたします。
 

質問、二次元配列プログラム

 投稿者:Realtac  投稿日:2014年 1月30日(木)02時29分1秒
  一次元配列のプログラムは下記のように取説に掲載されておりますが、二次元配列のプログラムは
DIM(3,5)の定義しか掲載されていませんので教えて下さい。
参考、一次元配列、
10 DIM T(7)
20 FOR A=1 TO 5
30 INPUT "テンスウ=";T(A)
40 NEXT A
 

(無題)

 投稿者:みっぴゅ  投稿日:2013年 6月 8日(土)13時01分45秒
編集済
   

ワンポイントテクニック投稿 ダミー表示で高速化気分

 投稿者:みっぴゅ  投稿日:2013年 6月 8日(土)13時00分3秒
編集済
  ループ内での表示に関するお話しです。

例としてダンプ表示プログラムを挙げてみます。
開始アドレスと終了アドレスを入力したあとリターンキーで次々とダンプを表示していきます。


通常、こんな感じで表示をしていくかと思います。

WAIT :PRINT ほにゃらら♪

これはこれで良いのですが、
リターンキーを押してから、次のほにゃらら♪が表示されるまでの間、ちょっぴり待たなくてはなりません。
僅かな時間ですが結構気になるものです。
そこで、、、

WAIT :PRINT :REM ダミー
WAIT 0:PRINT ほにゃらら♪

どうでしょうか?
この違い、わかりますでしょうか?

こうすることで、リターンキーを押した直後にほにゃらら♪を見ることが出来るのです。
そして、観覧している間に次のほにゃらら♪表示の準備が整っているというわけです!


要は、『表示された文字を人間が読む。』
この読んでいる時間を利用して、次の表示の準備をするという 考え方です。
実際は、ダミー表示をする時間が増えてしまいますが、『文字を人間が読む』という動作も一つの工程と考えれば、この『なんちゃって高速化』で、タクト短縮が実現出来ている というわけです。


PRINT文の所を書き換えて 比べてみて下さい。
きっとその効果が体感できることでしょう!


決して高速化をしているわけではないのに 速くなった様な錯覚を起こす小技で、応用はしやすいかと思います。


dump表示 プログラムリスト
6バイト単位で改行していきますので、フォントデータチェックに便利です。

1 INPUT "START:";A,"END:";E
:PRINT "PUSH [RET] KEY";
:FOR A=A TO E STEP 6
:S=0,D$=HEX$ A
:FOR I=0 TO 5
:M=PEEK (A+I),S=S+M,
D$=D$+" "+RIGHT$ ("0"+HEX$ M,2)
:NEXT
:WAIT :PRINT
:WAIT 0:PRINT D$+":"+RIGHT$ ("0"+HEX$ S,2);
:NEXT
:END

 

レス

 投稿者:御茶目菜子  投稿日:2013年 4月 1日(月)20時09分54秒
編集済
  みっぴゅさんへ
>この1行だけをみる限り、変数X,変数Yを使用する理由が分かりません。
>なぜ、0を使わなかったのでしょうか?

PC-E500系は1桁の定数であっても8バイト消費してしまいます。
したがって、(文字数ではなく)メモリ消費を重視する場面では16進数表記をすることが
多いです。
0は16進数で表記した場合には&0ですが、この場合は「&0」の「0」を省略して「&」と書く
ことができます。
しかし、「E500BASICの高速化のすべて」で書いているように16進数は遅いのです。
それよりも固定変数の方が4倍くらい速いためCLEAR直後で値が0の変数を使用しています。
したがって、わざわざ変数で書くことによって「0」を使用するよりも14バイト節約でき
なおかつ16進数よりも4倍速いということです。

これは、1LINE、2LINEプログラムでは常套手段(1行に入る量は行番号や改行を含めて
256バイト未満)なので覚えておくとよいかもしれません。
私が気合いを入れて作ったプログラムは基本的にメインルーチンは速度最優先、速度を
それほど必要としないところはメモリ消費量最優先としていますが、メモリ消費量が同じ
場合には速度を優先した処理を行っています。

・・・と普通なら答えるところですが、今回の場合は最初のバージョンのVSに搭載した機能を
落とさず高速化をするというためですね。
http://ww5.tiki.ne.jp/~ochame/E500/TECH/basic3.htm
ここに書いているようにCLEARの後にX=10などを入れるとハンデを付けた勝負ができる
ようになります。
当然CLEAR直後は変数の値は0ですから、何も追加しなければハンデ無し(0からのスタート)
となるわけです。
X,Yの代わりに定数0にするということはそのハンデ機能を無くしてさらに14バイトの余分な
メモリを消費してまで見えないレベルの高速化(初期化の高速化)をしても意味はないという
判断です。
 

LINE文内…何故変数?

 投稿者:みっぴゅ  投稿日:2013年 3月23日(土)14時03分38秒
  ////////////////////////////////////////
E500BASIC高速化のすべて

《 「VS スーパーターボ」プログラムリスト 》
10 CLS :WAIT 0:CLEAR :LINE (X,12)-(239,18),BF:LINE (Y,21)-(239,27),BF
////////////////////////////////////////


この1行だけをみる限り、変数X,変数Yを使用する理由が分かりません。
なぜ、0を使わなかったのでしょうか?
 

レンタル掲示板
/13