第11講 シューティングゲーム開発(銃社員の自作まで)
第9話 謎のコードの解説その3
  if (jyu(KEY_INPUT_A) != 0) {
によって、
jyu.cppのコード

#include"main.h"
//jyu(じゅう) taisyoutonarukey(たいしょうとなるきー)
//対象となるキーが直前に押されておらず、今押されている場合にそのキーを押したと判定する関数
char jyu(int taisyoutonarukey) { //taisyoutonarukey(たいしょうとなるキー)は、今対象としているキーの出席番号
  if (CheckHitKey(taisyoutonarukey) != 0) {
    if (taisyoutonarukey_mae[taisyoutonarukey] == 0) {
      taisyoutonarukey_mae[taisyoutonarukey] = 1;
      return 1;
    }
  }
  else {
    taisyoutonarukey_mae[taisyoutonarukey] = 0;
    return 0;
  }
  return 0;
}
が呼び出されます。
jyu(int taisyoutonarukey)のtaisyoutonarukeyが社員saisyonogamen()から渡された値を、
受け取るために銃社員jyu(); が用意した整数を入れる箱です。
用意した箱の名前がtaisyoutonarukeyであり、整数の箱であるを示すのがintです。
KEY_INPUT_Aは30でしたから、
箱taisyoutonarukeyに30が入ります。
ですから、
  if (CheckHitKey(taisyoutonarukey) != 0) {

  if (CheckHitKey(30) != 0) {
すなわち、
  if (CheckHitKey(KEY_INPUT_A) != 0) {
と同じです。
CheckHitKey(キーの出席番号)はキーが押されいるときに0以外の値を返してきます。
今はKEY_INPUT_Aですから、Aキーが押されている場合には0以外の値が返ってきます。
そして、if文の肯定側が実行されて、
    if (taisyoutonarukey_mae[taisyoutonarukey] == 0) {
      taisyoutonarukey_mae[taisyoutonarukey] = 1;
      return 1;
    }
の命令が遂行されます。
taisyoutonarukey_mae[taisyoutonarukey] は直前に対象となるキーが押されていれば1を、
押されていなければ0の値をとる配列です。
配列にするのは、キーボードのキーが何十もあるからです。
今は箱taisyoutonarukeyに入っている数字は30ですから、
    if (taisyoutonarukey_mae[30] == 0) {
      taisyoutonarukey_mae[30] = 1;
      return 1;
    }
すなわち
    if (taisyoutonarukey_mae[KEY_INPUT_A] == 0) {
      taisyoutonarukey_mae[KEY_INPUT_A] = 1;
      return 1;
    }
です。
    if (taisyoutonarukey_mae[KEY_INPUT_A] == 0) {
の条件式ではAキーは前に押されていなかったらということになります。
      taisyoutonarukey_mae[KEY_INPUT_A] = 1;
によって、対象となるキーが押された状態にします。
それはちょっとたった未来からすれば、過去になります。
そして、
      return 1;
によって、1がsaisyonogamen()に返されます。
これはAキーが押されたと判定したことをsaisyonogamen()に報告したのです。
return文が実行されると、以降の
  else {
    taisyoutonarukey_mae[taisyoutonarukey] = 0;
    return 0;
  }
  return 0;
は実行されません。
値を返すことが目的ですから、
値を返せた段階でこの関数の役割は果たされて強制的に関数は終了されるのです。
returnすると強制的に関数が閉じられることを覚えてください。
さて、現在Aキーが押されていない場合には、
if文の否定側
  else {
    taisyoutonarukey_mae[taisyoutonarukey] = 0;
    return 0;
  }
が実行されて、
taisyoutonarukey_mae[taisyoutonarukey] = 0; によって、
「次の瞬間から見たときに、直前にはAキーは押されていなかった」の設定をしてから、
0の値がsaisyonogamen()に返されます。
すなわち、判定はAキーは押されていなかったです。
ここでも関数は強制的に終了されます。

char jyu(int taisyoutonarukey) { //taisyoutonarukey(たいしょうとなるキー)は、今対象としているキーの出席番号
  if (CheckHitKey(taisyoutonarukey) != 0) {
    if (taisyoutonarukey_mae[taisyoutonarukey] == 0) {
      taisyoutonarukey_mae[taisyoutonarukey] = 1;
      return 1;
    }
  }
  else {
    taisyoutonarukey_mae[taisyoutonarukey] = 0;
    return 0;
  }
  return 0;
}
の最後の文は不要なのでは・・・と思った方は、
なかなか賢い方です。
でも必要です。
それは、
    if (taisyoutonarukey_mae[taisyoutonarukey] == 0) {
      taisyoutonarukey_mae[taisyoutonarukey] = 1;
      return 1;
    }
の条件式が否定される場合に、
入れておかないと何の値も返さなくなるからです。

現在  押されている  押されていない 
直前  押されていた  押されていなかった 

最後の1文は現在も直前も押されていた場合に行われる命令文です。
if文が入れ子式になっている場合に、
すべての場合が網羅されているか、よく考えなければなりません。
表を見ればおわかりのように今回は4通りの場合があるのです。

ここで皆さんに問題です。
jyu.cppのコード
#include"main.h"
//jyu(じゅう) taisyoutonarukey(たいしょうとなるきー)
//対象となるキーが直前に押されておらず、今押されている場合にそのキーを押したと判定する関数
//キーが押されたと判定:1 キーが押されていないと判定:0
char jyu(int
k) { //kは、今対象としているキーの出席番号
saisyonogamen.cppのコード
#include"main.h"
void saisyonogamen() {
  DrawBox(0, 0, 800, 1000, siro, true);
  int gazou;
  gazou = LoadGraph("画像/02.png");
  DrawGraph(0, 0, gazou, false);
  
int a=KEY_INPUT_A;
  if (jyu(
a) == 1) {
のようにコードを変更したらどうなるでしょうか。
jyu(a) と char jyu(int k) を比べると、
引き数名が違っていますからエラーするのでしょうか。


第8話へ   第10話へ

第2部トップへ  第1部トップへ


初心者のための excel 2016 マクロ VBA 入門講義 基
礎から応用まで
vc++ c言語 c++ 入門 初心者 基礎から応用まで
eclipse c++ 入門
魔方陣 数独で学ぶ VBA 入門

数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための]世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
本サイトトップ