Archiverse Internet Archive
投稿のみ 投稿と返信
前のページ(最近)
193 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113154
次のページ(過去)
返信[11]
親投稿
おちゃめ ochame_nako
りょうまさんへ 「(0.1のような場合であっても)小数は基本的に誤差が出るもの」と考えておけば難しいことは何もありません。 サトシзıо4さんへ 整数であろうと小数であろうと10進数を2進数に変換するには2の累乗の和の形に変換するだけで良いので簡単です。 0.1=0/2+0/4+0/8+1/16+1/32+0/64+0/128+1/256+1/512+0/1024+0/2048+1/4096+1/8192+0/16384+0/32768+1/65536+1/131072…という風になるため0.1が2進数では循環小数になることは分かります。(分母の2、4、8、…はすべて2の累乗)
3そうだね
プレイ済み
返信[8]
親投稿
おちゃめ ochame_nako
「小数を扱うから実数型を使う」「デフォルトで実数型になっているから実数型を使う」という感じで特に気にせず実数型を使っている人も多いかと思います。 しかし、このように小数を使用する場合には思わぬ誤動作をしてしまう場合があるため初心者の方で「(DIRECTモードなどで変数の表示を行い)いくら確かめてもプログラムがうまく動作しない」という場合はこういう要因もあるというのを頭に入れておくと良いかもしれません。 もっとも、浮動小数点とはどのような問題があり、DIRECTモードでは有効桁数がどの程度あるかを熟知している人ならばあえて言うまでもない当たり前の話だと思いますが。
2そうだね
プレイ済み
返信[7]
親投稿
おちゃめ ochame_nako
簡単に対策できる他の方法としては私のPR関数を使うという方法があります。 T=0 WHILE 1  T=PR(T+0.1)  PRINT T  IF T==10 THEN PRINT "10びょうたちました!":END  WAIT 6 WEND PR関数はDIRECTモードでの表示と同じ値になるように丸める関数なのでこれで10と表示されていればその値も10になっているので等号で判定が可能だし1カ所のみの変更で済みます。
0そうだね
プレイ済み
返信[6]
親投稿
おちゃめ ochame_nako
Tを0.1ではなく1ずつ加算して表示の段階で10で割れば誤差出ないので等号で判定が可能です。 T=0 WHILE 1  T=T+1  PRINT T/10  IF T==100 THEN PRINT "10びょうたちました!":END  WAIT 6 WEND このプログラムでは3カ所の変更で済みましたが、規模が大きなプログラムならば変更にが必要になるでしょう。
0そうだね
プレイ済み
返信[5]
親投稿
おちゃめ ochame_nako
誤差というのはどんどん積み重なっていくためどの程度許容するかはかなり難しいです。 それならば、誤差が出ないようにすれば良いですね。 誤差がでないようにする最も簡単な方法は整数のみによる演算を行うことです。
2そうだね
プレイ済み
返信[4]
親投稿
おちゃめ ochame_nako
では、どうするかというとこんな感じで一定範囲内の誤差を許容してやれば良いです。 T=0 WHILE 1  T=T+0.1  PRINT T  IF ABS(T-10)<0.05 THEN PRINT "10びょうたちました!":END  WAIT 6 WEND DIRECTモードで確認できないレベルの小さな誤差のみ許容するならば0.05の部分を5E-9とすれば良いです。
1そうだね
プレイ済み
返信[3]
親投稿
おちゃめ ochame_nako
無限に続く循環小数を52桁で表現したら値が変わってくるのは当然でその結果として0.1を加算する処理を行えば誤差が出てきます。 画面上で10と表示されている時には実は9.9999999999999805になっているのです。 これは普通にDIRECTモードで確認することはできませんが、FORMAT$を使うか、私の自作関数であるPSTR$を使えば確認ができます。 実数型で小数演算をした場合には誤差が発生するため等号で判定しては誤動作をしてしまう可能性があるわけです。
1そうだね
プレイ済み
返信[2]
親投稿
おちゃめ ochame_nako
その理由はプチコン3号はすべての数値が内部では2進数で表現されているためです。 10進数で10は2進数だと1010になるわけですが、10進数で0.1は2進数だと0.0001100110011…という循環小数になります。 実数型で採用されている倍精度浮動小数点は符号部1bit、指数部11bit、仮数部52bitの64bitとなるため0.1はこのようになります。 0011111110111001100110011001100110011001100110011001100110011010 (私が作ったBIN64$関数を使えば10進数を64桁の2進数に変換できます)
2そうだね
プレイ済み
返信[1]
親投稿
おちゃめ ochame_nako
実行してみたら分かりますが、実はこのプログラムは10秒経っても停止しません。 プチコン3号で正常動作しないときはDIRECTモードで変数の値を表示して想定通りに動作しているかどうかの確認を行うのがポピュラーな方法です。 試しに「10」と表示された瞬間にプログラムを停止させて PRINT T もしくは ?T としてみると変数Tの値はちゃんと10になっているためこのIFが動作しないのは原因が分かりません。
1そうだね
プレイ済み
プレイ日記
おちゃめ ochame_nako
このプログラムは0.1秒ごとに変数Tの値を表示していき10秒で終了するというプログラムです。 実はこのプログラムには致命的なバグがあるのですがどこでしょうか? (解答と解説はコメントに書いています)
9そうだね
プレイ済み
返信[17]
親投稿
おちゃめ ochame_nako
BGMVARやMICPOSを使えば1ミリ秒単位での計測も可能ですが、誤差もそれなりにあるため用途はかなり限られそうです。 あとMAINCNTとTIME$を併用すれば長時間を正確に計測、かつ、1フレーム単位での計測も可能です。
0そうだね
プレイ済み
返信[15]
親投稿
おちゃめ ochame_nako
確かにWAITやVSYNCは実時間と比較して0.3%くらいずれているので正確な時間は計測できないですね。 タイマーとして使用する場合に5分で約0.8秒ずれるのでこれが実用になるかどうかで判断すれば良いと思います。
0そうだね
プレイ済み
返信[10]
親投稿
おちゃめ ochame_nako
「1秒待つプログラム」ならば個人的にはVSYNC 60よりもWAIT 60をオススメします。 VSYNC 60は前回のVSYNCからの経過時間となるため前回VSYNCもしくはWAITを実行してから1秒以上経っていればVSYNCはスルーされるのに対してWAIT 60は確実に約1秒待ってくれるからです。 「5秒経ったら○○する」というのはWAIT 300の後に○○に相当する処理を書けば簡単に出来ますが、5秒以内であってもAボタンを押せばスキップ可能にしたいというのであればWAIT 1をループで最大300回実行(Aボタンを押したらループを抜ける)というのがベターだと思います。 とはいえ、どんな処理をするかによってTIME$、WAIT、MAINCNTのどれがベターかが変わると思います。
0そうだね
プレイ済み
返信[17]
親投稿
おちゃめ ochame_nako
先日作ったシ○ウォッチ風の「連計測QSP」を新たに加えて17作品詰め合わせとなりました。 https://miiverse.nintendo.net/posts/AYIHAAAEAAASVZKc070TUA 公開キーは 【 43XKVEJF 】 です。 ランチャー(ファイル名「.MENU」)はQSPながらフォルダやファイル内の情報を読み取って表示しているため何作品追加しても変更せずに対応が可能です。
1そうだね
プレイ済み
返信[6]
親投稿
おちゃめ ochame_nako
・QSP(WIDTH 16の1画面プログラム)17作品詰め合わせ 【 43XKVEJF 】 簡単に遊べるゲーム、実用ツール、ネタツールが揃っています。(ランチャー自体もQSP) 100m走ゲーム、鍵盤演奏、バンブラ風演奏、ドラム演奏、方位磁針、分度器、ものさし、タイマー、ストップウォッチ、お絵かきツール、筆圧対応お絵かきツール、音階演奏、ボーカロイドもどき、刹那の見斬り風ゲーム、音当てゲーム、関数電卓(+拡張オプション)、シュウォッチ風連射計測の17作品です。
12そうだね
プレイ済み
返信[14]
親投稿
おちゃめ ochame_nako
Newあっキーさんへ リストが長くなれば本物そっくりに作ることはできる(液晶も7セグメントにしたり等)のですが、QSPということでそうもいきませんからね。 リスト短縮があったからこそここまでできました。 リスト短縮に関しては私の中ではポピュラーとなっている指数による色指定とか、無関係な場所での定数リテラルの使用以外のものをいくつか書いておきます。 BEEPを鳴らすか慣らさないかは音量調整で行っています。 リストを見ればすぐに分かるレベルのものですが、ボタンを押すごとにどんどん音が高くなっていたりとか、結果が100を超えると「ワオ」と言ったりしています。それをIFで判断してBEEPを鳴らしていたらここまで短縮できません。 あと縞々は文字数を1画面にぴったりに収まるようにしているためLOCATEを不要にしているというくらいですか。 実はまだ短縮が可能だったり・・・
1そうだね
プレイ済み
返信[13]
親投稿
おちゃめ ochame_nako
nobuさんへ 連射はボタンに負担がかかるのは確かですね。 しかし、道具を使わない普通の指による連射ならばそれほど気にする必要はありません。 というのも、高速連射の場合は「押す」のではなく「振動させている」だけなのでボタンには必要以上の力が加わらないためです。 「16連射でスイカが割れる」というのも原理を考えるとありえないです。 ただし、コインとか定規を使ってこすりによる連射をする場合は必要以上の力が加わるためかなり注意が必要です。 したがって、私は、こすりをする場合もそのような道具は使用しないことにしています。
1そうだね
プレイ済み
返信[12]
親投稿
おちゃめ ochame_nako
タバひめさんへ そんな高速連射が必要なゲームって実際ほとんどないですよね。 一部のシューティングゲームとハイパーオリンピック系のゲーム程度でしょうか。 私はゲームの腕はともかくとして連射だけは得意だったので連射ゲームをたくさん作りました。 昔の8bit機は速度が遅かったので高速連射に耐えるためにはプログラムの処理高速化が必須でした。 80年代は店頭に展示されているパソコン(当時は「マイコン」と呼ばれていた)も自由にBASICが使える状態になっていたので当時はどのマシンにも自作の100m走ゲームを入れておきました(笑)
1そうだね
プレイ済み
返信[11]
親投稿
おちゃめ ochame_nako
ZEXさんへ 著作権や商標権の問題があるため見た目をそっくりにしたり、そのまんまのネーミングで公開するのは問題があるでしょうね。 特に公式にFlashアプリが作られたのでユーザーの非公式Flashアプリが公開差し止めを食らっても仕方がないと思います。
0そうだね
プレイ済み
返信[9]
親投稿
おちゃめ ochame_nako
難しいかとか面白いかというのは人によって大きく変わりますね。 自分で作ったゲームやツールが3DSで動くというだけで感動できるし、3DS本体があれば後は何も無くてもOKというがお手軽です。(PCを持ってなくても大丈夫) メイドイン俺やRPGツクールなどとは異なり非常に自由度が高い分だけ難しいかもしれません。(その代わりどんなジャンルのゲームでも作れる) 最初は難しいですが、説明書やサンプルプログラムを見て自分で確かめれば大抵は分かるようになるし、分からない部分はMiiverseで質問をすればほとんど解決が可能です。 プログラミングはあきらめなければ誰でもできるようになるのですが、もしも、プログラミングが難しくて挫折した際に1000円の元を取りたいというのでしたら公開されている多数のプログラムをダウンロードするだけで十分に元が取れると思います。
1そうだね
プレイ済み