たまに躓いたりしますよね

アバター
annojyou
記事: 0
登録日時: 11年前
住所: 大阪

たまに躓いたりしますよね

投稿記事 by annojyou » 11年前

最近プログラミングとご無沙汰していましたが、久々に(本当久々に…)ゲームに手を出しております。
とりあえずスクロールとか後回しでスタート画面→戦闘(横スクロール)→クリアorゲームオーバーという感じにできるようにswitchを使ってテスト。
STARTをcase 0: 戦闘をcase 1: ゲームオーバーをcase 2: クリアをcase 3:にして、それで管理することにしました。
STARTからクリアまでは一応できました…まあ、できなければだめなんですが。

しかし問題が発生しまして…今回switchを使ったのは、ゲームオーバーになった際にEnterを押せばSTART画面に戻れるようにしたいと思ったからでした。
switchを使えば、switchに与えた変数をいじり好きな場面に飛ぶことが容易にできるのではないかと思ったのです。

私はcase 2:に入れる計算のなかに変数swに入っている値を0にする式を書きました。 sw = sw -2(これでswにsw-2を代入する式になった…はず)
swはcase 2の時点で 2 は必ず入っているので、それを引いてやればうまくいくと思ってやりました…しかし、なぜか前のcaseに飛ぶだけでSTARTに飛ばなかったんです。
sw = 0;にしてみてもだめでした…。

私は単純にswitchに入れた変数の値によってcaseが移り変わるものだと思ったのですが…何か認識の違いがあるのでしょうか…。
もし間違った風に覚えているなら直したいですが、どう間違っているのかわからないです。
悩むのは好きですが、詰まるのはあまり好きじゃなかったりするので、打開策とか、なんでそうなるのかとか、むしろこっちの方法にした方がいいんじゃね?とかあったら教えてほしいです。

……………………って、これ日記じゃなくね?

アバター
annojyou
記事: 0
登録日時: 11年前
住所: 大阪

Re: たまに躓いたりしますよね

投稿記事 by annojyou » 11年前

一晩寝てすぐに解決法というか…なんで戻るのか分かったので書き込んどきます。
ぶっちゃけシーンを進めるためにKeyを割り当ててたんですが、case 0:,case 2:のどちらにもEnter割り当ててたんですよ…。
CauntとかでKeyを制御してればよかったんだけど、特に何もせずそんな命令を与えたので超高速でcase 2からcase 0に戻って、またもや超高速でcase 1:に進んじゃったと。

一日寝てテレビ見てたらふと「コンピュータの処理速度って目視できないスピードだよな…」と思ったんです。

「Key押した瞬間にめっちゃ進むからCauntで…とかプログラミングの舘に書いてあったなぁ」

「デバック用に割り当てたKeyだから制御とかつけてないよ…」

「あれ?Enterをcase 0:とcase 2:に当てはめてなかったか?」と思い、早速試してみたらうまくいったのでコンピュータの処理速度ってすげええええ!と地味に感動した午前6時でした。
朝から一喜一憂しちゃいましたよ。でも、プログラムを打つ人間側が単純に見逃したりすることもあるのだと勉強になったのでこれはこれでよしかな?と思った午前7時でした。

アバター
usao
記事: 1889
登録日時: 12年前

Re: たまに躓いたりしますよね

投稿記事 by usao » 11年前

こういうことでしょうか?
とりあえずこれで swの値は 0→1→2→0→… となります.

CODE:

int sw = 0;
for( int i=0; i<10; i++ )
{
    printf( "sw=%d\n", sw );

    switch( sw )
    {
    case 0:
        sw=1;   break;
    case 1:
        sw=2;   break;
    case 2:
        sw=0;   break;
    default:
        break;
    }
}

アバター
usao
記事: 1889
登録日時: 12年前

Re: たまに躓いたりしますよね

投稿記事 by usao » 11年前

あら,書いてたら解決しちゃってますね.失礼しました.

アバター
annojyou
記事: 0
登録日時: 11年前
住所: 大阪

Re: たまに躓いたりしますよね

投稿記事 by annojyou » 11年前

usaoさん

わざわざ書いてもらったのに自己完結した直後で…申し訳ないです。
大まかな形は載せていただいたコードそのものだったんですが、caseを進めるために割り当てていたKeyが同一のものだったせいだったのでうまく動かなかったので、コード自体に悪いところがあるわけではなかったようでした。(プログラム自体はうまく動いてくれてたんですけどね…こちらから見るとうまく動いてないように見えたみたいです)

コードを載せていただいて本当にありがとうございます。私の凡ミスで起こった事態でしたが、コードを載せてもらえたのはすごくうれしかったです。
ありがとうございました。

ISLe
記事: 2650
登録日時: 14年前

Re: たまに躓いたりしますよね

投稿記事 by ISLe » 11年前

機械的にやれば1フレームおきに連続押しを発生させることができるので、人間業じゃないものを除外する対策をするのも大切なことだったりします。
そういうのってチートなどの悪意への対抗と思われがちですが、チャタリングでユーザーが嫌な思いをしないようにするという良い面もあります。

アバター
annojyou
記事: 0
登録日時: 11年前
住所: 大阪

Re: たまに躓いたりしますよね

投稿記事 by annojyou » 11年前

ISLeさん

チャタリンングという言葉の意味がわからず検索したのですが、今回私が直面した状況そのものだったのでチャタリングを防ぐ処理の大切さを痛感しました…。もし似た状況に遭遇したならあまりよくない気分になったと思います。
チート対策をやることももちろんですが利用者に優しいプログラムを組むことの大切さを知れたので、いい勉強になったと思います。

(新しい言葉の知識が増えてウハウハです…その点でもありがとうございました。)

ISLe
記事: 2650
登録日時: 14年前

Re: たまに躓いたりしますよね

投稿記事 by ISLe » 11年前

チャタリングというのは、スイッチを信号に変換する回路のコンデンサがヘタって、一回押しただけなのに何回も信号が発生してしまう現象のことです。

キーボードでは滅多に起きませんが、マウスを長年使っていると、アイコンをドラッグするつもりがダブルクリックになって実行してしまう、といったことが起きます。
ロジクールのマウスがよくそうなることで有名だったりします。
マイクロソフトのインテリマウスは専用ドライバにチャタリングを除去する機構が組み込まれているらしいです。

冬の寒さで指がかじかんでうっかりなんてこともありますし。

むしろ押しっぱなしとは区別する必要があります。

アバター
annojyou
記事: 0
登録日時: 11年前
住所: 大阪

Re: たまに躓いたりしますよね

投稿記事 by annojyou » 11年前

ISLeさん

今回の件って厳密に言えばチャタリング…というには少々違ったりします。
マウスやキーボードに問題があるわけではなく、ただプログラム上でチャタリングが起きてしまう状況を作ってしまっていたという方が正しいです。
ただ、一度だけ入力の操作をしたつもりが処理速度が速いことで…という状況がチャタリングに近いものがあると感じてチャタリングという言葉を使いました。(私のマウスとキーボードはまだ一年経ってないので、チャタリング自体は起きにくい環境ですからね)
さすがにチャタリングと押しっぱなしを一緒にしちゃいけませんか…反省(´・ω・`)

常に指がかじかんでいるのでちょっと危なそうです…指をあっためるように心がけないと。

ISLe
記事: 2650
登録日時: 14年前

Re: たまに躓いたりしますよね

投稿記事 by ISLe » 11年前

日記に最初に書かれたEnter押しっぱなしで進んでしまう問題は、Enterが『離されている→押されている』という状態の変化を判定する、という方法で回避できます。
チャタリング問題は、その対策を行った後に発生します。
最後に編集したユーザー ISLe on 2014年3月22日(土) 17:18 [ 編集 1 回目 ]