前回 デジタルインベーダー(MG-880)もどきを作るの続きです。UFOを出現させる処理とゲームクリアとゲームオーバーの処理を実装します。
ゲーム電卓 – Wikipediaによると、UFOが出現する条件は、0以外の数字インベーダーを撃破した際に撃破した数字の合計が10の倍数になっている場合でした。そこでここではUFOを出現させる処理を行ないます。
フィールド変数 HitNumbersにこれまで撃墜した数字インベーダーの合計を保存して、新たに数字インベーダーを撃墜したときに10の倍数になっているかを調べます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
public partial class Form1 : Form { int HitNumbers = 0; bool isShowUFO = false; void Shot() { string targetString = ""; if(Target < 10) targetString = Target.ToString(); else targetString = "n"; int ret = Enemies.IndexOf(targetString); if(ret != -1) { if(Target != 10) { HitNumbers += Target; if(Target != 0 && HitNumbers % 10 == 0) isShowUFO = true; else isShowUFO = false; int index = label2.Text.IndexOf(targetString); int plus = (index + 1) * 10; Score += plus; labelDebug1.Text = plus.ToString(); labelDebug3.Text = HitNumbers.ToString(); } else { Score += 300; labelDebug1.Text = 300.ToString(); } labelDebug2.Text = Score.ToString(); Enemies = Enemies.Remove(ret, 1); ShowEmemies(); EnemiesCount--; if(EnemiesCount == 0) { StageClear(); } } } } |
UFOを出現させるべきときにタイマーイベントが発生したらUFOを出現させます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
public partial class Form1 : Form { private void Timer_Tick(object sender, EventArgs e) { if(Enemies.Length == EnemiesMax) { Miss(); return; } if(EnemiesCount - Enemies.Length > 0) { // 次にUFOを出現させるかどうか? if(!isShowUFO) { int i = Random.Next(0, 10); Enemies += i.ToString(); } else { Enemies += "n"; isShowUFO = false; } } else { Enemies += "-"; } ShowEmemies(); } } |
ステージクリア時にはUFOの出現に関する情報はクリアします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
public partial class Form1 : Form { void StageClear() { labelDebug1.Text = "Clear!"; Timer.Stop(); Stage++; ShowScore(); Enemies = ""; EnemiesCount = EnemiesMaxCount; // UFOの出現に関する情報はクリアする HitNumbers = 0; isShowUFO = false; if(Timer.Interval > 260) Timer.Interval -= 250; Timer timer2 = new Timer(); timer2.Interval = 3000; timer2.Tick += Timer2_Tick; timer2.Start(); } } |
最後にゲームオーバー判定をおこないます。
まずはライフに関するプロパティを作ります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public partial class Form1 : Form { int LifeMax = 3; int _life = 0; int Life { set { _life = value; labelLife.Text = "残 " + _life.ToString(); } get { return _life; } } } |
最初のライフは3です。ミスするごとに1減り、ゼロになったらゲームオーバーです。ところがステージクリアをすると3に戻ります。それからゲームオーバーになったあとやミス時やクリア時の得点表示がされているときは操作できないようにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
public partial class Form1 : Form { // ミス時やクリア時の得点表示がされているときは操作できないようにする bool isStop = false; private void Form1_KeyDown(object sender, KeyEventArgs e) { if(isStop) return; if(e.KeyData == Keys.Z) { Target++; if(Target != 10) label1.Text = Target.ToString() + ":"; else label1.Text = "n" + ":"; } if(e.KeyData == Keys.X) { Shot(); } } void GameStart() { Timer.Interval = InitTimerInterval; Timer.Start(); // 最初は EnemiesMaxCount(=3)とする EnemiesCount = EnemiesMaxCount; Score = 0; Stage = 1; Life = LifeMax; isStop = false; } void StageClear() { isStop = true; labelDebug1.Text = "Clear!"; Timer.Stop(); Stage++; ShowScore(); Enemies = ""; EnemiesCount = EnemiesMaxCount; HitNumbers = 0; isShowUFO = false; // ステージクリアをするとライフが回復する Life = LifeMax; if(Timer.Interval > 260) Timer.Interval -= 250; Timer timer2 = new Timer(); timer2.Interval = 3000; timer2.Tick += Timer2_Tick; timer2.Start(); } void Miss() { isStop = true; labelDebug1.Text = "miss!"; Timer.Stop(); ShowScore(); Enemies = ""; Life--; // ミスをしたら音を鳴らす Console.Beep(500, 1000); if(Life > 0) { Timer timer2 = new Timer(); timer2.Interval = 3000; timer2.Tick += Timer2_Tick; timer2.Start(); } else { GameOver(); } } void GameOver() { isStop = true; Timer.Stop(); labelLife.Text = "Game Over"; ShowScore(); Timer.Interval = InitTimerInterval; } private void Timer2_Tick(object sender, EventArgs e) { Timer t = (Timer)sender; t.Stop(); t.Dispose(); labelDebug1.Text = "play"; label1.Text = Target.ToString() + ":"; ShowEmemies(); Timer.Start(); isStop = false; } } |
それからミスを3回しなくてもゲームオーバーになることがあります。発射できる弾は1ステージあたり30発までであり、打ち尽くすとゲームオーバーとなります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
public partial class Form1 : Form { int ShotCount = 0; int ShotCountMax = 30; void Shot() { ShotCount++; if(ShotCount == ShotCountMax) { // ゲームオーバーを知らせる音を鳴らす Console.Beep(500, 1000); GameOver(); } // これ以降は上と同じなので省略 // } void GameStart() { ShotCount = 0; // これ以降は上と同じなので省略 // } void StageClear() { ShotCount = 0; // これ以降は上と同じなので省略 // } } |