2015年6月25日 星期四

[2015][Quiz]FinalExam_40173037H


Form1
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;
using Q1;

namespace _40173037H_FinalExam
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        public void ShowMessage(string str)
        {
            textMessage.AppendText(str);
        }

        private void btnThrow_Click(object sender, EventArgs e)
        {
            //實體化
            Ball ball = new Ball();
            BaseBallField ballfield = new BaseBallField(int.Parse(textSize.Text), int.Parse(textAngle.Text));
            Pitcher pitcher = new Pitcher(int.Parse(text_PDL.Text), int.Parse(text_PDH.Text), int.Parse(text_PAL.Text), int.Parse(text_PAR.Text), int.Parse(textSpeedHigh.Text), int.Parse(textSpeedLow.Text),ballfield);
            SecondBaseMan secondBaseMan = new SecondBaseMan(int.Parse(text_SDL.Text), int.Parse(text_SDH.Text), int.Parse(text_SAL.Text), int.Parse(text_SAR.Text),ballfield);
            CenterFielder centerFielder = new CenterFielder(int.Parse(text_CDL.Text), int.Parse(text_CDH.Text), int.Parse(text_CAL.Text), int.Parse(text_CAR.Text),ballfield);
            Batter batter = new Batter(int.Parse(textUpper.Text));
            Umpire umpire = new Umpire();
            
            //委託事件連結
            ball.Bat += batter.Bat;
            batter.swingStrike = umpire.SwingStrike;
            batter.ballInFly = ball.BallInFly;
            ball.outField += umpire.OutFieldJudge;
            umpire.inFo = ballfield.OutFieldInfo;
            ball.isCatched += pitcher.isCatched;
            ball.isCatched += secondBaseMan.isCatched;
            ball.isCatched += centerFielder.isCatched;
            ball.judge += umpire.Judge;
            //message連結
            ball.message = ShowMessage;
            umpire.message = ShowMessage;
            pitcher.message = ShowMessage;
            secondBaseMan.message = ShowMessage;
            centerFielder.message = ShowMessage;
            ballfield.message = ShowMessage;
            //開始
            pitcher.ThrowBall(ref ball);
            textMessage.AppendText("=======================================\r\n");

        }

        private void btnClean_Click(object sender, EventArgs e)
        {
            textMessage.Clear();
        }
    }
}
Umpire
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 Q1
{
    class Umpire
    {
        public delegate void ShowMessage(string str);
        public ShowMessage message;
        public delegate string OutFieldInfo(object sender, BallFlyingEventArgs e);
        public OutFieldInfo inFo;
        public void SwingStrike()
        {
            message("主審:揮棒落空!\r\n");
        }
        public bool OutFieldJudge(object sender, BallFlyingEventArgs e)
        {
            if (inFo != null)
            {
                switch (inFo(this, e))
                {
                    case "全壘打":
                        message("主審:全壘打!\r\n");
                        return true;
                    case "界外球":
                        message("主審:界外球!\r\n");
                        return true;
                    default:
                        message("主審:界內!\r\n");
                        return false;
                }
            }
            else
            {
                message("委託沒連結\r\n");
                return true;
            }
        }
        public void Judge(object sender, bool catchFlag)
        {
            if (catchFlag)
                message("主審:接殺出局!\r\n");
            else
                message("主審:安打\r\n");
        }
    }
}
Ball
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 Q1
{
    class Ball
    {
        public int speed;
        public int distanceOfFly;
        public int angleOfFly;
        public delegate void BatEvent(object sender, BallSpeed e);
        public event BatEvent Bat;
        public delegate bool OutFieldEvent(object sender, BallFlyingEventArgs e);
        public event OutFieldEvent outField;
        public delegate bool InFieldEvent(object sender, BallFlyingEventArgs e);
        public event InFieldEvent isCatched;
        public delegate void Judge(object sender, bool catchFlag);
        public event Judge judge;
        public delegate void ShowMessage(string str);
        public ShowMessage message;
        public void BallInThrow()
        {
            message("投出\r\n");
            message(string.Format("球速{0}\r\n", speed));
            BallSpeed e = new BallSpeed(speed);
            if (Bat != null)
            {
                Bat(this, e);
            }
        }
        public void BallInFly()
        {
            message("打擊出去!\r\n");
            Random rand = new Random();
            distanceOfFly = rand.Next(0, 450);
            angleOfFly = rand.Next(-90, 90);
            message(string.Format("飛行距離:{0}\t", distanceOfFly));
            message(string.Format("角度:{0}\r\n", angleOfFly));
            BallFlyingEventArgs e = new BallFlyingEventArgs(distanceOfFly, angleOfFly);
            if (outField != null)
            {
                if (outField(this,e))
                    return;
            }
            if (isCatched != null)
            {
                bool catchFlag=false;
                foreach (InFieldEvent single in isCatched.GetInvocationList())
                {
                    catchFlag = single(this, e);
                    if (catchFlag)
                        break;
                
                }
                judge(this, catchFlag);
            }
        }
    }
    class BallFlyingEventArgs
    {
        public int distanceOfFly;
        public int angleOfFly;
        public BallFlyingEventArgs(int distance, int angle)
        {
            distanceOfFly = distance;
            angleOfFly = angle;
        }
    }
    class BallSpeed
    {
        public int speed;
        public BallSpeed(int speed)
        {
            this.speed = speed;
        }
    }
}

Pitcher
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 Q1
{
    class Pitcher:Fielder
    {
        private int speedHigh;
        private int speedLow;
        public Pitcher(int distanceLow, int distanceHigh,int angleLeft,int angleRight,int speedHigh,int speedLow,BaseBallField field):base(distanceLow, distanceHigh,angleLeft,angleRight,field)
        {
            this.speedLow = speedLow;
            this.SpeedHigh = speedHigh;
            
        }
        public int SpeedHigh
        {
            get { return speedHigh; }
            set 
            {
                if (value < speedLow)
                {
                    speedHigh = speedLow+10;
                }
                else
                    speedHigh = value;
            }
        }
        public void ThrowBall(ref Ball ball)
        { 
            Random rand=new Random();
            ball.speed = rand.Next(speedLow, speedHigh);
            ball.BallInThrow();
        }
        public override string isCatchedString()
        {
            return "投手:我接住球了\r\n";
        }
    }
}

Batter
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 Q1
{
    class Batter
    {
        private int upper;
        public Batter(int upper)
        {
            this.Upper = upper;
        }
        public int Upper
        {
            get { return upper; }
            set 
            {
                if (Upper < 0)
                    upper = 0;
                else
                    upper = value;
            }
        }
        public delegate void SwingStrike();
        public SwingStrike swingStrike;
        public delegate void BatBall();
        public BatBall ballInFly;
        public void Bat(object sender,BallSpeed e)
        {
            if (e.speed > upper)
            {
                if (swingStrike != null)//揮棒落空
                    swingStrike();
            }
            else//打擊出去
            if (ballInFly != null)
            {
                ballInFly();
            }
        }
    }
}
BaseBallField
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 Q1
{
    class BaseBallField
    {
        private int size;
        private int angle;
        public delegate void ShowMessage(string str);
        public ShowMessage message;
        public int Size
        {
            get { return size; }
            set 
            {
                if (value < 0)
                {
                    size = 100;
                }

                else
                    size = value;
            }
        }
        public int Angle
        {
            get { return angle; }
            set 
            {
                if (value > 90)
                    angle = 90;
                else if (value < 10)
                    angle = 10;
                else
                    angle = value;
            }
        }
        public BaseBallField(int size, int angle)
        {
            this.Size = size;
            this.Angle = angle;
        }
        public string OutFieldInfo(object sender, BallFlyingEventArgs e)
        {
            if (e.distanceOfFly > size && Math.Abs(e.angleOfFly) <= angle)
            {
                return "全壘打";
            }
            else if (Math.Abs(e.angleOfFly) > angle)
            {
                return "界外球";
            }
            else
                return "界內";
        }
    }
}
Fielder
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 Q1
{
    abstract class Fielder
    {
        private int fieldDistanceLow;
        private int fieldDistanceHigh;
        private int fieldAngleLeft;
        private int fieldAngleRight;
        public BaseBallField field;
        public delegate void ShowMessage(string str);
        public ShowMessage message;
        public int FieldDistanceLow
        {
            get { return fieldDistanceLow; }
            set 
            {
                if (value < 0)
                    fieldDistanceLow = 0;
                else if (value > field.Size)
                    fieldDistanceLow = field.Size;
                else
                    fieldDistanceLow = value;
            }
        }
        public int FieldDistanceHigh
        {
            get { return fieldDistanceHigh; }
            set
            {
                if (value < FieldDistanceLow)
                    fieldDistanceHigh = FieldDistanceLow;
                else if (value > field.Size)
                    fieldDistanceHigh = field.Size;
                else
                    fieldDistanceHigh = value;
            }
        }
        public int FieldAngleLeft
        {
            get { return fieldAngleLeft; }
            set
            {
                if (value < 0 || value > field.Angle )
                    fieldAngleLeft = field.Angle;
                else
                    fieldAngleLeft = value;
            }
        }
        public int FieldAngleRight
        {
            get { return fieldAngleRight; }
            set
            {
                if (value > 0 || Math.Abs(value) > field.Angle )
                    fieldAngleRight = -1*field.Angle;
                else
                    fieldAngleRight = value;
            }
        }
        public Fielder(int distanceLow, int distanceHigh,int angleLeft,int angleRight,BaseBallField field)
        {
            this.field = field;
            FieldDistanceLow = distanceLow;
            FieldDistanceHigh = distanceHigh;
            FieldAngleLeft = angleLeft;
            FieldAngleRight = angleRight;
        }
        public bool isCatched(object sender, BallFlyingEventArgs e)
        {
            if (e.distanceOfFly >= fieldDistanceLow && e.distanceOfFly <= fieldDistanceHigh && e.angleOfFly >= fieldAngleRight && e.angleOfFly <= fieldAngleLeft)
            {
                    message(isCatchedString());
                    return true;
            }
            else
                return false;
        }
        public abstract string isCatchedString();
    }
}
SecondBaseMan
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 Q1
{
    class SecondBaseMan : Fielder
    {
        
        public SecondBaseMan(int distanceLow, int distanceHigh, int angleLeft, int angleRight,BaseBallField field)
            : base(distanceLow, distanceHigh, angleLeft, angleRight,field)
        {
        }
        public override string isCatchedString()
        {
            return "二壘手:我接住球了\r\n";
        }
    }
}
CenterFielder
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 Q1
{
    class CenterFielder : Fielder
    {

        public CenterFielder(int distanceLow, int distanceHigh, int angleLeft, int angleRight,BaseBallField field)
            : base(distanceLow, distanceHigh, angleLeft, angleRight,field)
        {
        }
        public override string isCatchedString()
        {
            return "中間手:我接住球了\r\n";
        }
    }
}

沒有留言:

張貼留言