質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.93%

ボール跳ね返りゲームでの

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 282

kazuma2525

score 1

ボール跳ね返りゲームで下端に落とさないようにするゲームを作成したのですが、以下の機能を追加する場合どこにプログラムを追加したらいいですか?

ボールがクライアント領域の下端に達したときは画面の下端に "GAME OVER" と表示する。
ボールを跳ね返した回数を表示するラベルを追加する。
プレイヤーがバーの長さをテキストボックス・ボタン等で変更できるようにする。
ボールの移動速度を乱数で決めるようにする。
ボールの数を増やす。

class Program : System.Windows.Forms.Form
    {
        // ボール1個を扱うためのクラス
        class Ball
        {
            private int CenterX, CenterY;   // ボールの中心座標
            private int Diameter;           // ボールの直径
            private int SpeedX, SpeedY;     // ボールの移動速度

            // コンストラクタ
            public Ball(int centerX, int centerY, int diameter, int speedX, int speedY)
            {
                CenterX = centerX;
                CenterY = centerY;
                Diameter = diameter;
                SpeedX = speedX;
                SpeedY = speedY;
            }

            // クライアント領域のサイズ(clientSize)とバー(myBar)により跳ね返りを考慮してボールを移動
            public void Move(System.Drawing.Size clientSize, Bar myBar)
            {
                // ボールを移動
                CenterX += SpeedX;
                CenterY += SpeedY;

                // 左端・右端での跳ね返り
                if (CenterX - Diameter / 2 <= 0 || CenterX + Diameter / 2 >= clientSize.Width)
                    SpeedX = -SpeedX;

                // 上端での跳ね返り
                if (CenterY - Diameter / 2 <= 0)
                    SpeedY = -SpeedY;

                // バーによる跳ね返り
                if (myBar.Hitting(CenterX, CenterY + Diameter / 2) && SpeedY > 0)
                    SpeedY = -SpeedY;
            }

            // ボールを描画
            public void Draw(System.Windows.Forms.PaintEventArgs e)
            {
                e.Graphics.FillEllipse(System.Drawing.Brushes.Red, CenterX - Diameter / 2, CenterY - Diameter / 2, Diameter, Diameter);
            }
        }

        // バー1本を扱うためのクラス
        class Bar
        {
            private System.Drawing.Rectangle BarRect;   // バーを表す長方形

            // コンストラクタ
            public Bar(System.Drawing.Rectangle barRect)
            {
                BarRect = barRect;
            }

            // バーを移動(centerX:中央のX座標)
            public void Move(int centerX)
            {
                BarRect.X = centerX - BarRect.Width / 2;
            }

            // バーを描画
            public void Draw(System.Windows.Forms.PaintEventArgs e)
            {
                e.Graphics.FillRectangle(System.Drawing.Brushes.Black, BarRect);
            }

            // 座標 (x, y) がバーの内部にあれば true を返す(ボールの跳ね返り判定に利用)
            public bool Hitting(int x, int y)
            {
                return BarRect.Contains(x, y);
            }
        }

        private Ball MyBall;    // ゲームで使用されているボール
        private Bar MyBar;      // ゲームで使用されているバー
        private System.Windows.Forms.Button ResetButton;    // リセットボタン

        // 画面を描画するときに呼び出されるメソッド
        protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
        {
            base.OnPaint(e);

            MyBall.Draw(e);
            MyBar.Draw(e);
        }

        // タイマにより定期的に呼び出されるメソッド
        private void OnTick(object sender, System.EventArgs e)
        {
            // マウスカーソルの位置を取得してバーを移動
            System.Drawing.Point mouse = PointToClient(System.Windows.Forms.Cursor.Position);
            MyBar.Move(mouse.X);

            // ボールを移動
            MyBall.Move(ClientSize, MyBar);

            // 画面を描画(OnPaint() が呼び出される)
            Invalidate();
        }

        // 新しいボールを作成してゲームで使用
        private void CreateNewBall()
        {
            MyBall = new Ball(100, 100, 20, 7, 5);
        }

        // リセットボタンがクリックされたときに呼び出されるメソッド
        private void ResetButton_Click(object sender, System.EventArgs e)
        {
            CreateNewBall();
        }

        public Program()
        {
            // ウィンドウに関する設定
            Text = "ボール跳ね返しゲーム";
            ClientSize = new System.Drawing.Size(400, 300);
            FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;

            // ゲームで使用するボールとバーを生成
            CreateNewBall();
            MyBar = new Bar(new System.Drawing.Rectangle(0, 250, 50, 10));

            // リセットボタンを配置
            ResetButton = new System.Windows.Forms.Button();
            ResetButton.Text = "リセット";
            ResetButton.Location = new System.Drawing.Point(10, 10);
            ResetButton.Size = new System.Drawing.Size(50, 20);
            ResetButton.Click += new System.EventHandler(ResetButton_Click);
            Controls.Add(ResetButton);

            // タイマを設定(OnTick() が定期的に呼び出されるようにする)
            System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
            timer.Interval = 33;    // OnTick() の呼び出し間隔(ミリ秒単位)
            timer.Tick += new System.EventHandler(OnTick);
            timer.Start();
        }

        static void Main(string[] args)
        {
            System.Windows.Forms.Application.Run(new Program());
        }
    }
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • 退会済みユーザー

    2020/07/06 08:10

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.93%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る