
陽春版本的HW9,如果狀況不是很好請多包涵。
執行檔的連結
Form1.cs
namespace HW9
{
public partial class Form1 : Form
{
// Member variables
private Ball HelloKitty = new Ball();
private Umpire EdogawaKonan = new Umpire();
private Pitcher Lee = new Pitcher();
private SecondBaseMan AppleTree = new SecondBaseMan();
private CenterFielder SuperMan = new CenterFielder();
private Fans DeathKnights = new Fans();
private Random rand = new Random();
// Constructors & Finalizers
public Form1()
{
InitializeComponent();
PlayerBuilder();
EventBuilder();
}
// Methods (按鈕)
private void btn_ThrowBall_Click(object sender, EventArgs e)
{
txt_Display.Text = (rand.NextDouble() < 0.3) ?
HelloKitty.BeHit() : "球沒有被擊出去...";
}
// 球員參數設定
private void PlayerBuilder()
{
Lee.SetFieldingRange(20.0, -20.0, 10, 100);
AppleTree.SetFieldingRange(0.5, -0.5, 149.5, 150.5);
SuperMan.SetFieldingRange(40, -40, 200, 400);
}
// 事件編輯器
private void EventBuilder()
{
HelloKitty.BallInPlay += Lee.Catch;
HelloKitty.BallInPlay += AppleTree.Catch;
HelloKitty.BallInPlay += SuperMan.Catch;
HelloKitty.BallInCheck += EdogawaKonan.Check;
EdogawaKonan.CheckResult += DeathKnights.VentMoods;
}
}
}
namespace HW9
{
class Ball
{
// Member variables
private double _distanece = 0;
private double _angle = 0;
private Random rand = new Random();
// Nested Enums, Structs, and Classes.
public delegate string BallInPlayEventHandler
(object sender, BallInPlayEventArgs args);
public event BallInPlayEventHandler BallInPlay;
public event BallInPlayEventHandler BallInCheck;
// Properties
public double Distanece
{
get
{
return _distanece;
}
set
{
if (value > 0)
{
_distanece = value;
}
}
}
public double Angle
{
get
{
return _angle;
}
set
{
_angle = value;
}
}
// Methods
public string BeHit() // 被打擊出去了
{
StringBuilder sb = new StringBuilder();
SetBallDistaneceAndAngle();
sb.Append("球被擊出去了! ");
sb.AppendLine(this.ToString());
if (BallInPlay != null)
{
bool IsCaught = false;
BallInPlayEventArgs e = new BallInPlayEventArgs();
e.Angle = this.Angle;
e.Distanece = this.Distanece;
string s = "";
foreach (BallInPlayEventHandler element in BallInPlay.GetInvocationList())
{
s = element(this, e);
sb.AppendLine(s);
IsCaught = !s.Contains("沒有接到球");
}
e.IsCaught = IsCaught;
if (BallInCheck != null)
{
sb.AppendLine(BallInCheck(this, e));
}
}
return sb.ToString();
}
public void SetBallDistaneceAndAngle() // 隨機設定球的落點
{
Distanece = 600.0 * rand.NextDouble();
Angle = 90.0 * (2 * rand.NextDouble() - 1);
}
public override string ToString() //顯示落點資訊
{
string s = "";
s += "距離是" + Distanece.ToString("F2") + "公尺";
s += " ";
s += "角度是" + Angle.ToString("F2") + "度";
return s;
}
public void CleanAllEvent() // 清除所有事件
{
BallInPlay = null;
BallInCheck = null;
}
}
// BallInPlay事件傳遞參數的類別
class BallInPlayEventArgs : EventArgs
{
private double _distanece = 0;
private double _angle = 0;
private bool _isCaught = false;
public double Distanece
{
get
{
return _distanece;
}
set
{
if (value > 0)
{
_distanece = value;
}
}
}
public double Angle
{
get
{
return _angle;
}
set
{
_angle = value;
}
}
public bool IsCaught
{
get
{
return _isCaught;
}
set
{
_isCaught = value;
}
}
}
}
namespace HW9
{
abstract class FieldingPlayers
{
// Member variables
private double _angleLeft = 90.0;
private double _angleRight = -90.0;
private double _distanceMin = 0.0;
private double _distanceMax = 400;
private FieldPosition _position = FieldPosition.Unknown;
// Nested Enums, Structs, and Classes.
public enum FieldPosition { Unknown = 0, Pitcher, Catcher,
FirstBaseman, SecondBaseman, ThirdBaseman, Shortstop,
LeftFielder, CenterFielder, RightFielder };
// Properties
public double AngleLeft
{
get
{
return _angleLeft;
}
set
{
if (value > AngleRight)
{
_angleLeft = value;
}
}
}
public double AngleRight
{
get
{
return _angleRight;
}
set
{
if (value < AngleLeft)
{
_angleRight = value;
}
}
}
public double DistanceMin
{
get
{
return _distanceMin;
}
set
{
if ((value < DistanceMax) && (value > 0))
{
_distanceMin = value;
}
}
}
public double DistanceMax
{
get
{
return _distanceMax;
}
set
{
if ((value > DistanceMin) && (value > 0))
{
_distanceMax = value;
}
}
}
public FieldPosition Position
{
get
{
return _position;
}
protected set
{
_position = value;
}
}
// Methods
public void SetFieldingRange(double angleLeft, double angleRight,
double distanceMin, double distanceMax)
{
AngleLeft = angleLeft;
AngleRight = angleRight;
DistanceMin = distanceMin;
DistanceMax = distanceMax;
}
public string Catch(object sender, BallInPlayEventArgs args)
{
string s = "";
bool CanCatch = false;
CanCatch |= ((DistanceMin < args.Distanece) && (args.Distanece < DistanceMax));
CanCatch &= ((AngleLeft > args.Angle) && (args.Angle > AngleRight));
s = Position.ToString() + ": ";
s += "我" + (CanCatch ? "有" : "沒有") + "接到球";
return s;
}
}
}
namespace HW9
{
class Pitcher : FieldingPlayers
{
// Constructors & Finalizers
public Pitcher()
{
Position = FieldPosition.Pitcher;
}
}
}
namespace HW9
{
class SecondBaseMan : FieldingPlayers
{
// Constructors & Finalizers
public SecondBaseMan()
{
Position = FieldPosition.SecondBaseman;
}
}
}
namespace HW9
{
class CenterFielder : FieldingPlayers
{
// Constructors & Finalizers
public CenterFielder()
{
Position = FieldPosition.CenterFielder;
}
}
}
namespace HW9
{
class Umpire
{
// Nested Enums, Structs, and Classes.
public delegate string CheckResultEventHandler
(object sender, CheckResultEventArgs args);
public event CheckResultEventHandler CheckResult;
// Methods
public string Check(object sender, BallInPlayEventArgs args) // 判斷球型
{
CheckResultEventArgs e = new CheckResultEventArgs();
StringBuilder sb = new StringBuilder();
sb.Append("Umpire: 這球是");
if (args.IsCaught)
{
string s = "接殺出局";
e.Result = s;
sb.AppendLine(s);
}
else if ((args.Angle > FieldSize.LeftAngle) || (args.Angle < FieldSize.RightAngle))
{
string s = "界外球";
e.Result = s;
sb.AppendLine(s);
}
else if (args.Distanece > FieldSize.DistanceMax)
{
string s = "全壘打";
e.Result = s;
sb.AppendLine(s);
}
else
{
string s = "安打";
e.Result = s;
sb.AppendLine(s);
}
if (CheckResult != null)
{
sb.AppendLine(CheckResult(this, e));
}
return sb.ToString();
}
public void CleanAllEvent()
{
CheckResult = null;
}
}
// CheckResult事件傳遞參數的類別
class CheckResultEventArgs
{
private string _result = "";
public string Result
{
get
{
return _result;
}
set
{
_result = value;
}
}
}
// 場地參數
static class FieldSize
{
public static double LeftAngle = 45.0;
public static double RightAngle = -45.0;
public static double DistanceMax = 400.0;
}
}
namespace HW9
{
class Fans
{
// Methods
// 粉絲針對各種結果表現出情緒
public string VentMoods(object sender, CheckResultEventArgs args)
{
string s = "";
s += "Fans: 我們感到";
if (args.Result == "接殺出局")
{
s += "失望";
}
else if (args.Result == "安打")
{
s += "開心";
}
else if (args.Result == "界外球")
{
s += "好可惜";
}
else if (args.Result == "全壘打")
{
s += "相當興奮";
}
return s;
}
}
}
沒有留言:
張貼留言