押下キーによるフラグ立てのいい方法

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
史上最悪のデスペナ
記事: 521
登録日時: 13年前

押下キーによるフラグ立てのいい方法

#1

投稿記事 by 史上最悪のデスペナ » 11年前

Shiftを押さないでQかWを押すとFlagは1
Shiftを押しながらQかWを押すとFlagは2
WもSも押されてないならFlagは0

としたいです。

現在、押下キーは

コード:

char Key[256]; //キーが押されているかいないかを格納する
Flag = 0;
if( Key[KEY_INPUT_Q] == 1 )
{
    Flag = 1;
    if( Key[KEY_INPUT_LSHIFT] == 1 )
    {
        Flag = 2;
    }
}
if( Key[KEY_INPUT_W] == 1 )
{
    Flag = 1;
    if( Key[KEY_INPUT_LSHIFT] == 1 )
    {
        Flag = 2;
    }
}
としていますが、同じような形が2個もあるため、もっと簡単に出来ないかと思いましたが方法が思いつきません
このあと、E,R,T・・・・と増えていった場合、見にくくなってしょうがないと思うので
いい方法があったら教えてください

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 押下キーによるフラグ立てのいい方法

#2

投稿記事 by softya(ソフト屋) » 11年前

先にKEY_INPUT_LSHIFTをチェックしてFlagに状態を代入せずにFlagに代入する値を作るのがひとつの方法です。
int FlagType = Key[KEY_INPUT_LSHIFT]==1 ? 2 : 1;
って感じですね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
Tatu
記事: 445
登録日時: 13年前
住所: 北海道

Re: 押下キーによるフラグ立てのいい方法

#3

投稿記事 by Tatu » 11年前

こういうことですか?

コード:


char Key[256]; //キーが押されているかいないかを格納する
Flag = 0;
if( Key[KEY_INPUT_Q] == 1 || Key[KEY_INPUT_W] == 1 )
{
    Flag = 1;
    if( Key[KEY_INPUT_LSHIFT] == 1 )
    {
        Flag = 2;
    }
}


beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

Re: 押下キーによるフラグ立てのいい方法

#4

投稿記事 by beatle » 11年前

史上最悪のデスペナ さんが書きました:WもSも押されてないならFlagは0
これは、QもWも、の間違いでしょうか。

一つ疑問なのは、どうしてQとWで違う値ではなく同じ値をFlagに設定するのでしょう。
QとWは区別しなくていいのでしょうか。
それとも、何か本当の目的は違うところにあるのでしょうか。

史上最悪のデスペナ
記事: 521
登録日時: 13年前

Re: 押下キーによるフラグ立てのいい方法

#5

投稿記事 by 史上最悪のデスペナ » 11年前

beatle さんが書きました:これは、QもWも、の間違いでしょうか。
その通りです
beatle さんが書きました:一つ疑問なのは、どうしてQとWで違う値ではなく同じ値をFlagに設定するのでしょう。
QとWは区別しなくていいのでしょうか。
それとも、何か本当の目的は違うところにあるのでしょうか。
簡単に言うと
Wで前進、Sで後退しますが(Qはまた別の動きですが説明しにくいのでWとSでやり直し)
Shiftを押しながらだと歩き、Shiftを押さないと走ります。
Flagはモーション用であり、1で走るモーション、2で歩くモーション、0で立っているモーションとさせたいのです
softya(ソフト屋) さんが書きました:先にKEY_INPUT_LSHIFTをチェックしてFlagに状態を代入せずにFlagに代入する値を作るのがひとつの方法です。
int FlagType = Key[KEY_INPUT_LSHIFT]==1 ? 2 : 1;
って感じですね。
何をしているのかが分からないのでちょっと調べてきます

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 押下キーによるフラグ立てのいい方法

#6

投稿記事 by softya(ソフト屋) » 11年前

これは条件演算子(三項演算子)ですよ。
条件式 ? 条件式が真の場合の値 : 条件式が疑の場合の値
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

史上最悪のデスペナ
記事: 521
登録日時: 13年前

Re: 押下キーによるフラグ立てのいい方法

#7

投稿記事 by 史上最悪のデスペナ » 11年前

こんなものがあるんですね。勉強になります
条件演算子って便利ですね。見た目も綺麗になりますし。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 押下キーによるフラグ立てのいい方法

#8

投稿記事 by softya(ソフト屋) » 11年前

史上最悪のデスペナ さんが書きました:こんなものがあるんですね。勉強になります
条件演算子って便利ですね。見た目も綺麗になりますし。
これの多用は凄く見づらくなるのでBADです。いっぱい並ぶと最悪です。
なので、あまり見かけないですよね?
ここぞと言うワンポイントで使うのが吉です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: 押下キーによるフラグ立てのいい方法

#9

投稿記事 by ISLe » 11年前

史上最悪のデスペナ さんが書きました:条件演算子って便利ですね。見た目も綺麗になりますし。
こんな見た目ではどう思います?

コード:

char Key[256]; //キーが押されているかいないかを格納する
Flag = 0;
Key[KEY_INPUT_Q] == 1 && (Flag = 1);
Key[KEY_INPUT_W] == 1 && (Flag = 1);
Key[KEY_INPUT_LSHIFT] == 1 && Flag == 1 && (Flag = 2);

史上最悪のデスペナ
記事: 521
登録日時: 13年前

Re: 押下キーによるフラグ立てのいい方法

#10

投稿記事 by 史上最悪のデスペナ » 11年前

softya(ソフト屋) さんが書きました:これの多用は凄く見づらくなるのでBADです。いっぱい並ぶと最悪です。
なので、あまり見かけないですよね?
ここぞと言うワンポイントで使うのが吉です。
確かに一度も見かけたことないですね。
ifが沢山あるよりは見やすいかと思ったのですが・・・・・・
ISLe さんが書きました:
史上最悪のデスペナ さんが書きました:条件演算子って便利ですね。見た目も綺麗になりますし。
こんな見た目ではどう思います?

コード:

char Key[256]; //キーが押されているかいないかを格納する
Flag = 0;
Key[KEY_INPUT_Q] == 1 && (Flag = 1);
Key[KEY_INPUT_W] == 1 && (Flag = 1);
Key[KEY_INPUT_LSHIFT] == 1 && Flag == 1 && (Flag = 2);
自分はすっきりしていてすごい見やすいと思います

ちなみに、

コード:

Key[KEY_INPUT_Q] == 1 だったらFlag=1
Key[KEY_INPUT_W] == 1 だったらFlag = 1
Key[KEY_INPUT_LSHIFT] == 1 でFlag == 1だったらFlag = 2
でいいですか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 押下キーによるフラグ立てのいい方法

#11

投稿記事 by softya(ソフト屋) » 11年前

今は誤認しないかも知れませんがISLeさんのもの含めて後々誤認や書き間違いを起こしやすいです。
条件式と代入文が渾然一体だからですが、これはトリッキーなんですよね。どっかで==と=を間違えてしまった場合を考えてみましょう。
それとデバッガでトレースが困難なのも弱点ですね。

参考
「Programming Place Plus C言語編 第27章 簡略記法」
http://www.geocities.jp/ky_webid/Progra ... itional_op

【補足】
ついでにダークサイドな演算式編。
「闇プログラマーに喧嘩を売ってしまった昼下がり~条件分岐篇~ - Togetter」
http://togetter.com/li/140355
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

史上最悪のデスペナ
記事: 521
登録日時: 13年前

Re: 押下キーによるフラグ立てのいい方法

#12

投稿記事 by 史上最悪のデスペナ » 11年前

softya(ソフト屋) さんが書きました:今は誤認しないかも知れませんがISLeさんのもの含めて後々誤認や書き間違いを起こしやすいです。
条件式と代入文が渾然一体だからですが、これはトリッキーなんですよね。どっかで==と=を間違えてしまった場合を考えてみましょう。
それとデバッガでトレースが困難なのも弱点ですね。
普通のif文でも==と=を間違えてしまってどこが間違ってるのか分からずにってのが前まであったのを思い出しました。
あれは見つけにくいですよね・・・・・・・・
softya(ソフト屋) さんが書きました:【補足】
ついでにダークサイドな演算式編。
「闇プログラマーに喧嘩を売ってしまった昼下がり~条件分岐篇~ - Togetter」
http://togetter.com/li/140355
途中のprintfで何をしようとしているのかが分からない・・・・・後ろのコメントアウトを見る限り文字コードに合わせてバイトをずらしているのでしょうか?
printf("誤¥0正"+(a==b)*4);
だったら、
a==bなら(a==b)は1なので4バイトずらし、違うなら0なのでずらされないで「誤」になる
という解釈でいいのでしょうか


結論として、今回はしょうがないから条件演算子を使う。
しかし、使う必要のないところは極力使わない

ということでいいのですよね?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 押下キーによるフラグ立てのいい方法

#13

投稿記事 by softya(ソフト屋) » 11年前

しょうが無いと言うより、その方が今回は私は分かりやすいと思ったからです。
三項演算子が大キライな人も大好きな人もいますので、人によって意見は違うと思います。
私は、使い所を間違えなければ使っても良いと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

史上最悪のデスペナ
記事: 521
登録日時: 13年前

Re: 押下キーによるフラグ立てのいい方法

#14

投稿記事 by 史上最悪のデスペナ » 11年前

ありがとうございます。
今回のところ以外に対してはいろいろ試してみて自分のコーディング方法を確立しようと思います

閉鎖

“C言語何でも質問掲示板” へ戻る