敵の飛行機1体から敵の弾が2連射されるのにbreak;を使う旧型プログラムとbreak;を使わない新型プログラムを見比べてみましょう その1

ソーラー「ふうぅ


やった😊


敵の飛行機10体から敵の弾が2連射される


             📀新しいタイプのプログラム💿


の開発に成功したね」



マックス「やったな


ただ


敵の飛行機10体から敵の弾が2連射される


新型のプログラム


を開発しなくても


敵の飛行機10体から敵の弾が2連射される


旧型のプログラム



よかったんじゃないか?


新型では何かいいことがあるのか?」



solarplexuss「うーん 🧐 確かに ・・・


旧型と新型の違い・・・か・・・


でも


まあ break;


を使わなくなったので


プログラムが読みやすくわかりやすく解説なったのはすごくいいところじゃない?


うちはそこが お・気・に・入・り💖」


ソーラー「


それでは


break;


を使った


敵の飛行機1体から敵の弾が2連射される


旧型プログラムと


break;


を使わない


敵の飛行機1体から敵の弾が2連射される


新型プログラム



見比べて違いを見てみましょう



まずは


break;


を使った


敵の飛行機1体から敵の弾が2連射される


旧型プログラムはこちらです

👇



//👇🌞🌞🌞 敵の飛行機1体から敵の弾が2連射される旧型プログラムです


if (tekinotama_count == 0)) {


for (int i = 0; i < 2; i = i + 1) {


if (tekinotama[i].life == 0) {


tekinotama[i].x = tekinohikouki[0].x-10;

//👆🌞🌞🌞敵の弾は敵の飛行機の左側に表示されることになります


tekinotama_tsix = tekinotama[i].x;


tekinotama[i].y = tekinohikouki[0].y + 10;


tekinotama[i].life = 1;


break;


}


}


tekinotama_count = 10;


}


if (tekinotama_count > 0) { tekinotama_count = tekinotama_count - 1; }



for (int i = 0; i < 2; i = i + 1) {


if (tekinotama[i].life == 1) {

//🌞🌞🌞 tekinotama[i].lifeに1が代入されていると敵の弾がゲーム画面に表示されることになります tekinotama[i].lifeに0が代入されていると敵の弾がゲーム画面に表示されることはありません

DrawGraph(tekinotama[i].x, tekinotama[i].y, tekinotama[i].graphichandle[0], TRUE);


tekinotama[i].x = tekinotama[i].x - 10;


if (tekinotama_tsix - tekinotama[i].x > 640)

//🌞🌞🌞発射された敵の弾の位置のx座標が発射されたときの最初の敵の弾の位置のx座標から🍑左へ🍑640を超えて離れると条件tekinotama_tsix - tekinotama[i].xは真の値1をとることになります

//🌞🌞🌞🌞🌞👆 tekinotama_tsixには敵の弾が発射されたときの敵の弾のいる位置のx座標を記憶していたのでtekinotama[i].xが敵の弾が発射されたときの敵の弾のいる位置から640ドット離れた時tekinotama_tsix - tekinotama[i].x > 640は真の値1を持つことになります

tekinotama[i].life = 0;


}


}




ソーラー「そして


break;


を使わない


敵の飛行機1体から敵の弾が2連射される


新型プログラムはこちらです


👇


//👇🌞🌞🌞 敵の飛行機1体から敵の弾が2連射される新型プログラムです



if (tekinotama[0].life == 0 && hassyasareru_tekinotama == 0👇変更点はここだよん💖💖💖💖💖💖💖💖💖💖💖💖💖) {


tekinotama[0].x = tekinohikouki[0].x - 10;


tekinotama[0].y = tekinohikouki[0].y + 10;


tekinotama_tsix[0] = tekinotama[0].x;


tekinotama[0].life = 1;


hassyasareru_tekinotama = 1;//💖💖💖👈ここだよ〜ん


tekinotama_count[0] = 30;//👈2連射される敵の弾の最初の弾と次弾の間隔を調整することができます


}





if (tekinotama_count[0] > 0) { tekinotama_count[0] = tekinotama_count[0] - 1; }



if (tekinotama_count[0] == 0 && hassyasareru_tekinotama == 1👇変更点はここだよん💖💖💖💖💖💖💖💖💖💖💖💖💖) {


if (tekinotama[1].life == 0) {


tekinotama[1].x = tekinohikouki[0].x - 10;


tekinotama[1].y = tekinohikouki[0].y + 10;


tekinotama_tsix[1] = tekinotama[1].x;


tekinotama[1].life = 1;


hassyasareru_tekinotama = 2; //💖💖💖👈ここだよ〜ん


tekinotama_count[1] = 30;//👈2連射される敵の弾の次弾と最初の弾の間隔を調整することができます


}


}


if (tekinotama_count[1] > 0) { tekinotama_count[1] = tekinotama_count[1] - 1; }




if (tekinotama_count[1] == 0 && hassyasareru_tekinotama == 2👇変更点はここだよん💖💖💖💖💖💖💖💖💖💖💖💖💖) {


hassyasareru_tekinotama = 0; //💖💖💖👈ここだよ〜ん


}





for (int i = 0; i < 2; i = i + 1) {


if (tekinotama[i].life == 1) {

//🌞🌞🌞 tekinotama[i].lifeに1が代入されていると敵の弾tekinotama[i]がゲーム画面に表示されることになります tekinotama[i].lifeに0が代入されていると敵の弾tekinotama[i]がゲーム画面に表示されることはありません

DrawGraph(tekinotama[i].x, tekinotama[i].y, tekinotama[i].graphichandle[0], TRUE);


tekinotama[i].x = tekinotama[i].x - 10;


if (tekinotama_tsix - tekinotama[i].x > 640)

//🌞🌞🌞発射された敵の弾tekinotama[i]の位置のx座標が発射されたときの最初の敵の弾tekinotama[i]の位置のx座標から🍑左へ🍑640を超えて離れると条件tekinotama_tsix - tekinotama[i].xは真の値1をとることになります

//🌞🌞🌞🌞🌞👆 tekinotama_tsixには敵の弾tekinotama[i]が発射されたときの敵の弾tekinotama[i]のいる位置のx座標を記憶していたのでtekinotama[i].xが敵の弾tekinotama[i]が発射されたときの敵の弾tekinotama[i]のいる位置から640ドット離れた時tekinotama_tsix - tekinotama[i].x > 640は真の値1を持つことになります

tekinotama[i].life = 0;


}


}





マックス「ここの部分は


共通か

👇



for (int i = 0; i < 2; i = i + 1) {


if (tekinotama[i].life == 1) {

//🌞🌞🌞 tekinotama[i].lifeに1が代入されていると敵の弾tekinotama[i]がゲーム画面に表示されることになります tekinotama[i].lifeに0が代入されていると敵の弾tekinotama[i]がゲーム画面に表示されることはありません

DrawGraph(tekinotama[i].x, tekinotama[i].y, tekinotama[i].graphichandle[0], TRUE);


tekinotama[i].x = tekinotama[i].x - 10;


if (tekinotama_tsix - tekinotama[i].x > 640)

//🌞🌞🌞発射された敵の弾tekinotama[i]の位置のx座標が発射されたときの最初の敵の弾tekinotama[i]の位置のx座標から🍑左へ🍑640を超えて離れると条件tekinotama_tsix - tekinotama[i].xは真の値1をとることになります

//🌞🌞🌞🌞🌞👆 tekinotama_tsixには敵の弾tekinotama[i]が発射されたときの敵の弾tekinotama[i]のいる位置のx座標を記憶していたのでtekinotama[i].xが敵の弾tekinotama[i]が発射されたときの敵の弾tekinotama[i]のいる位置から640ドット離れた時tekinotama_tsix - tekinotama[i].x > 640は真の値1を持つことになります

tekinotama[i].life = 0;


}


}


となると


違いは


この旧型のこの部分と

👇


//👇🌞🌞🌞 敵の飛行機1体から敵の弾が2連射される旧型プログラムです


if (tekinotama_count == 0)) {


for (int i = 0; i < 2; i = i + 1) {


if (tekinotama[i].life == 0) {


tekinotama[i].x = tekinohikouki[0].x-10;

//👆🌞🌞🌞敵の弾は敵の飛行機の左側に表示されることになります


tekinotama_tsix = tekinotama[i].x;


tekinotama[i].y = tekinohikouki[0].y + 10;


tekinotama[i].life = 1;


break;


}


}


tekinotama_count = 10;


}


if (tekinotama_count > 0) { tekinotama_count = tekinotama_count - 1; }




新型のここの部分ってわけだ

👇


//👇🌞🌞🌞 敵の飛行機1体から敵の弾が2連射される新型プログラムです



if (tekinotama[0].life == 0 && hassyasareru_tekinotama == 0👇変更点はここだよん💖💖💖💖💖💖💖💖💖💖💖💖💖) {


tekinotama[0].x = tekinohikouki[0].x - 10;


tekinotama[0].y = tekinohikouki[0].y + 10;


tekinotama_tsix[0] = tekinotama[0].x;


tekinotama[0].life = 1;


hassyasareru_tekinotama = 1;//💖💖💖👈ここだよ〜ん


tekinotama_count[0] = 30;//👈2連射される敵の弾の最初の弾と次弾の間隔を調整することができます


}





if (tekinotama_count[0] > 0) { tekinotama_count[0] = tekinotama_count[0] - 1; }



if (tekinotama_count[0] == 0 && hassyasareru_tekinotama == 1👇変更点はここだよん💖💖💖💖💖💖💖💖💖💖💖💖💖) {


if (tekinotama[1].life == 0) {


tekinotama[1].x = tekinohikouki[0].x - 10;


tekinotama[1].y = tekinohikouki[0].y + 10;


tekinotama_tsix[1] = tekinotama[1].x;


tekinotama[1].life = 1;


hassyasareru_tekinotama = 2; //💖💖💖👈ここだよ〜ん


tekinotama_count[1] = 30;//👈2連射される敵の弾の次弾と最初の弾の間隔を調整することができます


}


}


if (tekinotama_count[1] > 0) { tekinotama_count[1] = tekinotama_count[1] - 1; }




if (tekinotama_count[1] == 0 && hassyasareru_tekinotama == 2👇変更点はここだよん💖💖💖💖💖💖💖💖💖💖💖💖💖) {


hassyasareru_tekinotama = 0; //💖💖💖👈ここだよ〜ん


}




ソーラー「新型プログラムでは


if (tekinotama[0].life == 0 && hassyasareru_tekinotama == 0👇変更点はここだよん💖💖💖💖💖💖💖💖💖💖💖💖💖)



if (tekinotama_count[0] == 0 && hassyasareru_tekinotama == 1👇変更点はここだよん💖💖💖💖💖💖💖💖💖💖💖💖💖)


のように



発射される弾が最初の弾か次弾かを指定するhassyasareru_tekinotama


が用いられているので


hassyasareru_tekinotamaに0が格納されているときは


2連射される敵の弾の最初の弾が


hassyasareru_tekinotamaに1が格納されているときは


2連射される敵の弾の次弾が


発射されることになります


この新型プログラムでは


必ず


2連射される敵の弾の最初の弾が発射されたら


次弾が発射され


次弾が発射されたら


最初の弾が発射されることになりますが


旧型プログラムでは


発射される弾が最初の弾か次弾かを指定するhassyasareru_tekinotama


が用いられていないので


2連射される敵の弾の最初の弾が発射されたあと


次弾が発射される前に


tekinotama_tsix - tekinotama[0].x > 640


が満たされ


tekinotama[0].life = 0;


が成立し


tekinotama_count に格納される値が0になったときに



再び


i=0の場合の

👇



for (int i = 0; i < 2; i = i + 1) {


if (tekinotama[i].life == 0) {


tekinotama[i].x = tekinohikouki[0].x-10;

//👆🌞🌞🌞敵の弾は敵の飛行機の左側に表示されることになります


tekinotama_tsix = tekinotama[i].x;


tekinotama[i].y = tekinohikouki[0].y + 10;



tekinotama[i].life = 1;


break;


}


}


tekinotama_count = 10;


}



が実行される



すなわち





if (tekinotama[0].life == 0) {


tekinotama[0].x = tekinohikouki[0].x-10;

//👆🌞🌞🌞敵の弾は敵の飛行機の左側に表示されることになります


tekinotama_tsix = tekinotama[0].x;


tekinotama[0].y = tekinohikouki[0].y + 10;


tekinotama[0].life = 1;


}


tekinotama_count = 10;


if (tekinotama_count > 0) { tekinotama_count = tekinotama_count - 1; }


が実行されて


最初の弾が発射され


次弾が発射されなくなることがあるんだ


だから



tekinotama_countに格納される値が0になる前に



tekinotama_tsix - tekinotama[0].x > 640


が成立して


tekinotama[0].life = 0;


が実行されないように


敵の弾の移動スピードに注意する必要があるんだね」


solarplexuss「??どーいうことぉん」


マックス「つまり


最初の弾が発射された後


最初の弾の移動スピードが


早すぎると


tekinotama_countに格納される値が0になる前に


tekinotama_tsix - tekinotama[0].x > 640


が成立し


tekinotama[0].life = 0;


が実行されて


次弾が発射される前に


また最初の弾が発射されてしまうわけだ


そこで


最初の弾の移動スピードを調整する必要が出てくるってわけだ


今のプログラムでは


for (int i = 0; i < 2; i = i + 1) {


if (tekinotama[i].life == 1) {

//🌞🌞🌞 tekinotama[i].lifeに1が代入されていると敵の弾tekinotama[i]がゲーム画面に表示されることになります tekinotama[i].lifeに0が代入されていると敵の弾tekinotama[i]がゲーム画面に表示されることはありません

DrawGraph(tekinotama[i].x, tekinotama[i].y, tekinotama[i].graphichandle[0], TRUE);


tekinotama[i].x = tekinotama[i].x - 10;💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖


if (tekinotama_tsix - tekinotama[i].x > 640)

//🌞🌞🌞発射された敵の弾tekinotama[i]の位置のx座標が発射されたときの最初の敵の弾tekinotama[i]の位置のx座標から🍑左へ🍑640を超えて離れると条件tekinotama_tsix - tekinotama[i].xは真の値1をとることになります

//🌞🌞🌞🌞🌞👆 tekinotama_tsixには敵の弾tekinotama[i]が発射されたときの敵の弾tekinotama[i]のいる位置のx座標を記憶していたのでtekinotama[i].xが敵の弾tekinotama[i]が発射されたときの敵の弾tekinotama[i]のいる位置から640ドット離れた時tekinotama_tsix - tekinotama[i].x > 640は真の値1を持つことになります

tekinotama[i].life = 0;


}


}



tekinotama[i].x = tekinotama[i].x - 10;💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖


の部分が


敵の弾の移動スピード(while{}文のブロック{}内の命令文が


1回繰り返し実行されるごとに移動するドット数)


を決定しているんだろう




tekinotama[i].x = tekinotama[i].x - 10💖;



のように10💖に設定されていると


次弾が発射される前に


また最初の弾が発射されてしまうようなことは起こらない





while{}文のブロック{}内の命令文が


1回繰り返し実行されるごとに


敵の弾の最初の弾(、次弾ともに)は


左へ10💖💖ドット移動するようになる


そして


もし


tekinotama_count に格納される値が


tekinotama_count = 10;


のように


10と設定されている場合は


while{}文のブロック{}内の命令文が


10回繰り返し実行されることによって


if (tekinotama_count > 0) { tekinotama_count = tekinotama_count - 1; }



10回繰り返し実行されて


tekinotama_countに格納される値が0になったとき


敵の弾の最初の弾は


- 10💖×10=-100ドット


つまり


tekinotama_tsix(敵の弾の最初の弾の発射されたときの位置)から左へ100ドット


しか移動していない


だから


tekinotama_tsix - tekinotama[0].x=100


となって



tekinotama_tsix - tekinotama[0].x > 640


が成立することもないので


tekinotama[0].life = 0;


が実行されるようなことはないわけだ


だから


最初の弾が発射されたあと


また


最初の弾が発射されることはないってわけだ」



solarplexuss「あああおおお??どーいうことぉん」


ソーラー「そう


旧型のプログラムでは


while{}文のブロック{}内の命令文が


1回繰り返し実行されるごとに


if (tekinotama_count > 0) { tekinotama_count = tekinotama_count - 1; }


が実行されて


tekinotama_countに格納される値が1減っていくので


tekinotama_countに格納される値が0になるには


while{}文のブロック{}内の命令文が


10回繰り返し実行される必要があります


今の旧型プログラムでは


while{}文のブロック{}内の命令文が


10回繰り返し実行された場合


tekinotama[i].x = tekinotama[i].x - 10💖;



10回繰り返し実行されるんだけど


そのとき


tekinotama[i].xに格納される値は100減るね


tekinotama[i].xに格納される値が減れば減るほど


敵の弾は左へ移動するんだよ


つまり



while{}文のブロック{}内の命令文が


10回繰り返し実行されて


tekinotama_count に格納される値が0になったときに


最初に発射された弾は


最初の位置tekinotama_tsixから100ドットしか左へ移動していないので


もちろん


while{}文のブロック{}内の命令文が


10回繰り返し実行されて


tekinotama_countに格納される値が0になったときに


tekinotama_tsix - tekinotama[0].x > 640


が成立することはないので


tekinotama[0].life = 0;



実行されることはありません


つまり


tekinotama[0].lifeに格納される値は0にならないんだ



ですので



tekinotama_count に格納される値が0になったときに



再び

以下の命令文


//👇🌞🌞🌞 敵の飛行機1体から敵の弾が2連射される旧型プログラムです


if (tekinotama_count == 0)) {


for (int i = 0; i < 2; i = i + 1) {


if (tekinotama[i].life == 0) {


tekinotama[i].x = tekinohikouki[0].x-10;

//👆🌞🌞🌞敵の弾は敵の飛行機の左側に表示されることになります


tekinotama_tsix = tekinotama[i].x;


tekinotama[i].y = tekinohikouki[0].y + 10;


tekinotama[i].life = 1;


break;


}


}


tekinotama_count = 10;


}


if (tekinotama_count > 0) { tekinotama_count = tekinotama_count - 1; }


の実行において


tekinotama[0].life に格納される値は0ではないので



i=0の場合の

👇


if (tekinotama[0].life == 0) {


tekinotama[0].x = tekinohikouki[0].x-10;

//👆🌞🌞🌞敵の弾は敵の飛行機の左側に表示されることになります


tekinotama_tsix = tekinotama[0].x;


tekinotama[0].y = tekinohikouki[0].y + 10;


tekinotama[0].life = 1;


}


tekinotama_count = 10;


if (tekinotama_count > 0) { tekinotama_count = tekinotama_count - 1; }


が実行されることはなくなる


つまり


最初の弾が発射された後


また


最初の弾が発射されるってことはなくなるんだ


ちゃんと


i=1の場合の

👇


if (tekinotama[1].life == 0) {


tekinotama[1].x = tekinohikouki[0].x-10;

//👆🌞🌞🌞敵の弾は敵の飛行機の左側に表示されることになります


tekinotama_tsix = tekinotama[1].x;


tekinotama[1].y = tekinohikouki[0].y + 10;


tekinotama[1].life = 1;


}


tekinotama_count = 10;


if (tekinotama_count > 0) { tekinotama_count = tekinotama_count - 1; }


が実行されて


最初の弾が発射された後


次弾が発射されることになるね(*´▽`*)」



solarplexuss「ははあ・・・


なるほど」



  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る