2015年6月29日 星期一

[2015][Quiz]FinalExam_40173027H

程式分為十個部分
Form1 為視窗主程式
Ball 為球的類別
    紀錄球速.飛行距離.飛行角度.委託球的飛行狀況給裁判
BaseBallField 為球場資料類別
    紀錄球場大.小角度.委託廠地資訊給裁判
Batter 為打者類別
    紀錄打者打擊球速上限.打擊球的委託
Fielder 為防守者的父類別
    紀錄防守範圍.角度的最大.小值和接球
CenterFielder.Pitcher.SecondBaseMan 為防守者的子類別
    Pitcher較不同有多投球的委託
Umpire 為裁判的類別
    Pitcher判定好球.界外球.接殺...等等

Form1
using System;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Final
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btnCleanMessage_Click(object sender, EventArgs e)
        {
            txtBoxMessage.Text = "";
        }

        private void btnThrowBall_Click(object sender, EventArgs e)
        {
            Ball ball = new Ball();
            Umpire umpire = new Umpire();
            BaseBallField baseBallField = new BaseBallField(Double.Parse(txtBoxBaseBallFieldSize.Text), Double.Parse(txtBoxBaseBallFieldAngle.Text));
            Batter batter = new Batter(Double.Parse(txtBoxBatterSpeedLimit.Text));
            Pitcher pitcher = new Pitcher(int.Parse(txtBoxPitcherMinSpeed.Text), int.Parse(txtBoxPitcherMaxSpeed.Text), Double.Parse(txtBoxPitcherMinDistance.Text), Double.Parse(txtBoxPitcherMaxDistance.Text), Double.Parse(txtBoxPitcherMinAngle.Text), Double.Parse(txtBoxPitcherMaxAngle.Text));
            SecondBaseMan secondBaseMan = new SecondBaseMan(Double.Parse(txtBoxSecondBaseManMinDistance.Text), Double.Parse(txtBoxSecondBaseManMaxDistance.Text), Double.Parse(txtBoxSecondBaseManMinAngle.Text), Double.Parse(txtBoxSecondBaseManMaxAngle.Text));
            CenterFielder centerFielder = new CenterFielder(Double.Parse(txtBoxCenterFielderMinDistance.Text), Double.Parse(txtBoxCenterFielderMaxDistance.Text), Double.Parse(txtBoxCenterFielderMinAngle.Text), Double.Parse(txtBoxCenterFielderMaxAngle.Text));

            ball.message = ShowMessage;
            umpire.message = ShowMessage;
            pitcher.message = ShowMessage;
            secondBaseMan.message = ShowMessage;
            centerFielder.message = ShowMessage;

            ball.onBallInThrow += new Ball.OnBallInThrowEventHandler(batter.HitBallOrStrike);
            batter.ifHitBall += new Batter.IfHitBallEventHandler(umpire.CheckHit);
            umpire.hitBall = batter.GenerateDistanceAndAngle;
            batter.letBallFly += new Batter.LetBallFlyEventHandler(ball.BallFly);
            ball.onBallInHit += new Ball.OnBallInHitEventHandler(baseBallField.InOrOutside);
            baseBallField.checkBaseBallField += new BaseBallField.CheckBaseBallFieldEventHandler(umpire.CheckInside);
            umpire.insideBall = ball.OnBallInCatch;
            ball.onBallInCatch += new Ball.OnBallInCatchEventHandler(pitcher.CatchBall);
            ball.onBallInCatch += new Ball.OnBallInCatchEventHandler(secondBaseMan.CatchBall);
            ball.onBallInCatch += new Ball.OnBallInCatchEventHandler(centerFielder.CatchBall);
            ball.callUmpire = umpire.CallHit;

            pitcher.ThrowBall(ref ball);
        }

        public void ShowMessage(string message)
        {
            txtBoxMessage.AppendText(message);
        }
    }
}

Ball
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Final
{
    class BallInThrowEventArgs : EventArgs
    {
        private int speed;
        public int Speed
        {
            get { return speed; }
            set
            {
                if (value > 0)
                {
                    speed = value;
                }
                else
                {
                    speed = 0;
                }
            }
        }

        public BallInThrowEventArgs()
        {
            Speed = 0;
        }
        public BallInThrowEventArgs(int speed)
        {
            Speed = speed;
        }
    }
    class BallInHitEventArgs : EventArgs
    {
        private int distanceOffly;
        private int angleOffly;

        public int DistanceOffly
        {
            get { return distanceOffly; }
            set
            {
                if (value > 0)
                {
                    distanceOffly = value;
                }
                else
                {
                    distanceOffly = 0;
                }
            }
        }
        public int AngleOffly
        {
            get { return angleOffly; }
            set
            {
                if (Math.Abs(value) <= 180)
                {
                    angleOffly = value;
                }
                else
                {
                    if (value % 360 < -180)
                    {
                        angleOffly = value + 180;
                    }
                    else if (value % 360 > 180)
                    {
                        angleOffly = value - 180;
                    }
                    else
                    {
                        angleOffly = value % 360;
                    }
                }
            }
        }

        public BallInHitEventArgs()
        {
            DistanceOffly = 0;
            AngleOffly =0 ;
        }
        public BallInHitEventArgs(int distance, int angle)
        {
            DistanceOffly = distance;
            AngleOffly = angle;
        }
    }

    class Ball
    {

        public delegate void OnBallInThrowEventHandler(object sender, BallInThrowEventArgs e);
        public event OnBallInThrowEventHandler onBallInThrow;
        public delegate void OnBallInHitEventHandler(object sender, BallInHitEventArgs e);
        public event OnBallInHitEventHandler onBallInHit;
        public delegate bool OnBallInCatchEventHandler(object sender, BallInHitEventArgs e);
        public event OnBallInCatchEventHandler onBallInCatch;


        private int distanceOffly;
        private int angleOffly;
        private int speed;

        public int DistanceOffly
        {
            get { return distanceOffly; }
            set
            {
                if(value > 0)
                {
                    distanceOffly = value;
                }
                else
                {
                    distanceOffly = 0;
                }
            }
        }
        public int AngleOffly
        {
            get { return angleOffly; }
            set
            {
                if (Math.Abs(value) <= 180)
                {
                    angleOffly = value;
                }
                else
                {
                    if (value % 360 < -180)
                    {
                        angleOffly = value + 180;
                    }
                    else if (value % 360 > 180)
                    {
                        angleOffly = value - 180;
                    }
                    else
                    {
                        angleOffly = value % 360;
                    }
                }
            }
        }
        public int Speed
        {
            get { return speed; }
            set
            {
                if (value > 0)
                {
                    speed = value;
                }
                else
                {
                    speed = 0;
                }
            }
        }

        public Ball()
        {

        }

        public delegate void CallUmpire();
        public CallUmpire callUmpire;
        public delegate void Message(string message);
        public Message message;

        public void ShowSpeed()
        {
            message("球速是:" + Speed + "\n");
        }
        public void OnBallInThrow()
        {
            message("球投出了!\n");
            ShowSpeed();
            BallInThrowEventArgs ballInThrow = new BallInThrowEventArgs(Speed);
            onBallInThrow(this, ballInThrow);
        }
        public void BallFly(object sender, BallInHitEventArgs e)
        {
            DistanceOffly = e.DistanceOffly;
            AngleOffly = e.AngleOffly;
            message("飛行距離是:" + DistanceOffly + "\t飛行角度是:" + AngleOffly + "\n");
            BallInHitEventArgs ballInHit = new BallInHitEventArgs(DistanceOffly, AngleOffly);
            onBallInHit(this, ballInHit);
        }
        public void OnBallInCatch()
        {
            BallInHitEventArgs ballInCatch = new BallInHitEventArgs(DistanceOffly, AngleOffly);
            int hitFlag = 0;
            foreach (OnBallInCatchEventHandler sample in onBallInCatch.GetInvocationList())
            {
                if (sample(this, ballInCatch))
                {
                    hitFlag++;
                }
            }
            if (hitFlag == 3)
            {
                callUmpire();
            }
        }
    }
}

BaseBallField
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Final
{
    class BaseBallFieldEventArgs : EventArgs
    {
        private int check;

        public int Check
        {
            get { return check; }
            set
            {
                check = value;
            }
        }

        public BaseBallFieldEventArgs()
        {

        }
        public BaseBallFieldEventArgs(int check)
        {
            Check = check;
        }
    }

    class BaseBallField
    {
        public delegate void CheckBaseBallFieldEventHandler(object sender, BaseBallFieldEventArgs e);
        public CheckBaseBallFieldEventHandler checkBaseBallField;

        private double size;
        private double angle;

        public double Size
        {
            get { return size; }
            set
            {
                if (value > 0)
                {
                    size = value;
                }
                else
                {
                    size = 0;
                }
            }
        }
        public double Angle
        {
            get { return angle; }
            set
            {
                if (Math.Abs(value) <= 180)
                {
                    angle = value;
                }
                else
                {
                    if (value % 360 < -180)
                    {
                        angle = value + 180;
                    }
                    else if (value % 360 > 180)
                    {
                        angle = value - 180;
                    }
                    else
                    {
                        angle = value % 360;
                    }
                }
            }
        }

        public BaseBallField (double size, double angle)
        {
            Size = size;
            Angle = angle;
        }
        public void InOrOutside (object sender, BallInHitEventArgs e)
        {
            BaseBallFieldEventArgs baseBallFieldcheck = new BaseBallFieldEventArgs();
            if(Math.Abs(e.AngleOffly) > Angle)
            {
                baseBallFieldcheck.Check = 0;
            }
            else if (e.DistanceOffly > Size)
            {
                baseBallFieldcheck.Check = 1;
            }
            else
            {
                baseBallFieldcheck.Check = 2;
            }
            checkBaseBallField(this, baseBallFieldcheck);
        }
    }
}

Batter
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Final
{
    class BatterHitBallEventArgs : EventArgs
    {
        private bool isHit;

        public bool IsHit
        {
            get { return isHit; }
            set
            {
                isHit = value;
            }
        }

        public BatterHitBallEventArgs()
        {

        }
        public BatterHitBallEventArgs(bool isHit)
        {
            IsHit = isHit;
        }
    }

    class Batter
    {
        private double speedLimit;

        public double SpeedLimit
        {
            get { return speedLimit; }
            set
            {
                if (value > 0)
                {
                    speedLimit = value;
                }
                else
                {
                    speedLimit = 0;
                }
            }
        }

        public Batter (double speedLimit)
        {
            SpeedLimit = speedLimit;
        }

        public delegate void LetBallFlyEventHandler(object sender, BallInHitEventArgs e);
        public event LetBallFlyEventHandler letBallFly;
        public delegate void IfHitBallEventHandler(object sender, BatterHitBallEventArgs e);
        public event IfHitBallEventHandler ifHitBall;

        public void GenerateDistanceAndAngle()
        {
            BallInHitEventArgs distanceAndAngle = new BallInHitEventArgs();
            Random random = new Random();
            distanceAndAngle.DistanceOffly = random.Next(0, 450);
            distanceAndAngle.AngleOffly = random.Next(-90, 90);
            letBallFly(this, distanceAndAngle);
        }

        public void HitBallOrStrike(object sender, BallInThrowEventArgs e)
        {
            BatterHitBallEventArgs hitBallFlag = new BatterHitBallEventArgs();
            if(e.Speed <= SpeedLimit)
            {
                hitBallFlag.IsHit = true;
            }
            else
            {
                hitBallFlag.IsHit = false;
            }
            ifHitBall(this, hitBallFlag);
        }

    }
}

Fielder
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Final
{
    abstract class Fielder
    {
        private double fieldingDistanceMin;
        private double fieldingDistanceMax;
        private double fieldingAngleMin;
        private double fieldingAngleMax;

        public double FieldingDistanceMin
        {
            get { return fieldingDistanceMin; }
            set
            {
                if (value > 0)
                {
                    fieldingDistanceMin = value;
                }
                else
                {
                    fieldingDistanceMin = 0;
                }
            }
        }
        public double FieldingDistanceMax
        {
            get { return fieldingDistanceMax; }
            set
            {
                if (value > 0)
                {
                    fieldingDistanceMax = value;
                }
                else
                {
                    fieldingDistanceMax = 0;
                }
            }
        }
        public double FieldingAngleMin
        {
            get { return fieldingAngleMin; }
            set
            {
                if (Math.Abs(value) <= 180)
                {
                    fieldingAngleMin = value;
                }
                else
                {
                    if (value % 360 < -180)
                    {
                        fieldingAngleMin = value + 180;
                    }
                    else if (value % 360 > 180)
                    {
                        fieldingAngleMin = value - 180;
                    }
                    else
                    {
                        fieldingAngleMin = value % 360;
                    }
                }
            }
        }
        public double FieldingAngleMax
        {
            get { return fieldingAngleMax; }
            set
            {
                if (Math.Abs(value) <= 180)
                {
                    fieldingAngleMax = value;
                }
                else
                {
                    if (value % 360 < -180)
                    {
                        fieldingAngleMax = value + 180;
                    }
                    else if (value % 360 > 180)
                    {
                        fieldingAngleMax = value - 180;
                    }
                    else
                    {
                        fieldingAngleMax = value % 360;
                    }
                }
            }
        }

        public Fielder()
        {

        }
        public Fielder(double fieldingDistanceMin, double fieldingDistanceMax, double fieldingAngleMin, double fieldingAngleMax)
        {
            FieldingDistanceMin = fieldingDistanceMin;
            FieldingDistanceMax = fieldingDistanceMax;
            FieldingAngleMin = fieldingAngleMin;
            FieldingAngleMax = fieldingAngleMax;
        }

        public delegate void Message(string message);
        public Message message;

        public bool CatchBall(object sender, BallInHitEventArgs e)
        {
            if(FieldingAngleMin <= e.AngleOffly && e.AngleOffly <= FieldingAngleMax)
            {
                if (FieldingDistanceMin <= e.DistanceOffly && e.DistanceOffly <= FieldingDistanceMax)
                {
                    message("我是" + CatchBallCallName() + "我接到球了!\n");
                    message("==============================\n");
                    return false;
                }
                else
                {
                    return true;
                }
            }
            else
            {
                return true;
            }
        }
        protected abstract string CatchBallCallName();
    }
}

CenterFielder
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Final
{
    class CenterFielder:Fielder
    {
        public CenterFielder ():base()
        {

        }
        public CenterFielder(double fieldingDistanceMin, double fieldingDistanceMax, double fieldingAngleMin, double fieldingAngleMax)
            :base(fieldingDistanceMin, fieldingDistanceMax, fieldingAngleMin, fieldingAngleMax)
        {

        }
        protected override string CatchBallCallName()
        {
            return "中堅手";
        }
    }
}

Pitcher
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Final
{
    class Pitcher:Fielder
    {
        private int speedLow;
        private int speedHigh;

        public int SpeedLow
        {
            get { return speedLow; }
            set
            {
                if (value > 0)
                {
                    speedLow = value;
                }
                else
                {
                    speedLow = 0;
                }
            }
        }
        public int SpeedHigh
        {
            get { return speedHigh; }
            set
            {
                if (value > 0)
                {
                    speedHigh = value;
                }
                else
                {
                    speedHigh = 0;
                }
            }
        }

        public Pitcher ():base()
        {

        }
        public Pitcher(int speedLow, int speedHigh, double fieldingDistanceMin, double fieldingDistanceMax, double fieldingAngleMin, double fieldingAngleMax)
            :base(fieldingDistanceMin, fieldingDistanceMax, fieldingAngleMin, fieldingAngleMax)
        {
            SpeedLow = speedLow;
            SpeedHigh = speedHigh;
        }

        public void ThrowBall(ref Ball ball)
        {
            Random random = new Random();
            ball.Speed = random.Next(SpeedLow, SpeedHigh);
            ball.OnBallInThrow();
        }
        protected override string CatchBallCallName()
        {
            return "投手";
        }
    }
}

SecondBaseMan
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Final
{
    class SecondBaseMan:Fielder
    {
        public SecondBaseMan ():base()
        {

        }
        public SecondBaseMan (double fieldingDistanceMin, double fieldingDistanceMax, double fieldingAngleMin, double fieldingAngleMax)
            :base(fieldingDistanceMin, fieldingDistanceMax, fieldingAngleMin, fieldingAngleMax)
        {

        }
        protected override string CatchBallCallName()
        {
            return "二壘手";
        }
    }
}

Umpire
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Final
{
    class Umpire
    {
        public delegate void Message(string message);
        public Message message;
        public delegate void HitBall();
        public HitBall hitBall;
        public delegate void InsideBall();
        public InsideBall insideBall;


        public void CheckHit(object sender, BatterHitBallEventArgs e)
        {
            if(e.IsHit)
            {
                CallHitBall();
            }
            else
            {
                CallStrike();
            }
        }
        public void CheckInside(object sender, BaseBallFieldEventArgs e)
        {
            switch(e.Check)
            {
                case 0:
                    CallOutside();
                    return;
                case 1:
                    CallHomeRun();
                    return;
                default:
                    CallInside();
                    return;
            }
        }

        public void CallHitBall()
        {
            message("裁判:打擊出去!\n");
            hitBall();
        }
        public void CallStrike()
        {
            message("裁判:好球!\n");
            message("==============================\n");
        }
        public void CallHomeRun()
        {
            message("裁判:全壘打!\n");
            message("==============================\n");
        }
        public void CallOutside()
        {
            message("裁判:界外球!\n");
            message("==============================\n");
        }
        public void CallInside()
        {
            message("裁判:界內球!\n");
            insideBall();
        }
        public void CallHit()
        {
            message("裁判:安打!\n");
            message("==============================\n");
        }
    }
}

沒有留言:

張貼留言