Quiz 06_exe
Quiz 06
Form1.cs
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 Quiz6
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public void ShowMessage(string str)
{
txt_Message.AppendText(str);
}
private void btn_Hit_Click(object sender, EventArgs e)
{
Ball ball = new Ball(int.Parse(txt_DistanceOfFly.Text), int.Parse(txt_AngleOfFly.Text));
BaseBallField field = new BaseBallField(int.Parse(txt_SizeOfBaseballField.Text), int.Parse(txt_AngleOfBaseballField.Text));
Umpire umpire = new Umpire(field);
Pitcher pitcher = new Pitcher(int.Parse(txt_PitcherDistanceLow.Text),int.Parse(txt_PitcherDistanceHigh.Text),
int.Parse(txt_PitcherAngleLeft.Text), int.Parse(txt_PitcherAngleRight.Text));
SecondBaseMan secondBaseMan = new SecondBaseMan(int.Parse(txt_SecondBaseManDistanceLow.Text), int.Parse(txt_SecondBaseManDistanceHigh.Text),
int.Parse(txt_SecondBaseManAngleLeft.Text), int.Parse(txt_SecondBaseManAngleRight.Text));
CenterFielder centerFielder = new CenterFielder(int.Parse(txt_CenterFielderDistanceLow.Text), int.Parse(txt_CenterFielderDistanceHigh.Text),
int.Parse(txt_CenterFielderAngleLeft.Text), int.Parse(txt_CenterFielderAngleRight.Text));
Fans fans = new Fans();
ball.message = ShowMessage;
umpire.message = ShowMessage;
pitcher.message = ShowMessage;
secondBaseMan.message = ShowMessage;
centerFielder.message = ShowMessage;
fans.message = ShowMessage;
ball.hitOrOut += new Ball.HitOrOutEventHandler(umpire.HitOrOut);
ball.inField += new Ball.CatchEventHandler(pitcher.OnCatch);
ball.inField += new Ball.CatchEventHandler(secondBaseMan.OnCatch);
ball.inField += new Ball.CatchEventHandler(centerFielder.OnCatch);
umpire.CheckResult += fans.React;
ball.OnBallInPlay();
txt_Message.AppendText("=============================\r\n");
}
private void btn_ClearMessage_Click(object sender, EventArgs e)
{
txt_Message.Clear();
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Quiz6
{
class BaseBallField
{
private int size;
private int angle;
public BaseBallField(int size,int angle)
{
Size = size;
Angle = angle;
}
public int Size
{
get { return size; }
set
{
if (value < 0)
size = 0;
else
size = value;
}
}
public int Angle
{
get { return angle; }
set
{
if (value < 0)
angle = 0;
else
angle = value;
}
}
public bool IsHomeRun(int distanceOfFly,int angleOfFly)
{
//撰寫程式碼
if(distanceOfFly > size && angleOfFly < angle){
return true;
}
else{
return false;
}
}
public bool IsFoul(int distanceOfFly, int angleOfFly)
{
//撰寫程式碼
if (angleOfFly > angle)
{
return true;
}
else{
return false;
} }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Quiz6
{
class Ball
{
private int distanceOfFly;
private int angleOfFly;
//事件
public delegate bool CatchEventHandler(object sender, BallInPlayEventArgs e);
public event CatchEventHandler inField;
public delegate void HitOrOutEventHandler(object sender, BallInPlayEventArgs e);
public event HitOrOutEventHandler hitOrOut;
public delegate void Message(string str);
public Message message;
public Ball(int distance, int angle)
{
DistanceOfFly = distance;
AngleOfFly = angle;
}
public int DistanceOfFly
{
get {return distanceOfFly;}
set
{
if (value < 0)
distanceOfFly = 0;
else
distanceOfFly = value;
}
}
public int AngleOfFly
{
get { return angleOfFly; }
set
{
if ((value <= 180) && (value >= -180))
angleOfFly = value;
else
angleOfFly = 0;
}
}
public void OnBallInPlay()
{
message("打擊出去!\r\n");
message(ToString());
BallInPlayEventArgs e = new BallInPlayEventArgs(DistanceOfFly,AngleOfFly);
if (inField != null)
{
e.IsCaught = false;
foreach (CatchEventHandler single in inField.GetInvocationList())
{
e.IsCaught = single(this, e);
if (e.IsCaught)
break;
}
hitOrOut(this,e);
}
}
public override string ToString()
{
string str = ("飛行距離"+ string.Format("{0}", DistanceOfFly));
str += ("\t角度" + string.Format("{0}", AngleOfFly)+"\r\n");
return str;
}
}
class BallInPlayEventArgs : EventArgs
{
public int distanceOfFly;
public int angleOfFly;
private bool _isCaught = false;
public BallInPlayEventArgs(int distance, int angle)
{
distanceOfFly = distance;
angleOfFly = angle;
}
public bool IsCaught
{
get
{
return _isCaught;
}
set
{
_isCaught = value;
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Quiz6
{
abstract class Player
{
private int fieldingDistanceLow;
private int fieldingDistanceHigh;
private int fieldingAngleLeft;
private int fieldingAngleRight;
protected PlayerType.Type type;
public delegate void Message(string str);
public Message message;
public Player(int distanceLow, int distanceHigh, int angleLeft, int angleRight)
{
FieldingDistanceLow = distanceLow;
FieldingDistanceHigh = distanceHigh;
FieldingAngleLeft = angleLeft;
FieldingAngleRight = angleRight;
}
public int FieldingDistanceLow
{
get { return fieldingDistanceLow; }
set
{
if (value < 0)
fieldingDistanceLow = 0;
else
fieldingDistanceLow = value;
}
}
public int FieldingDistanceHigh
{
get { return fieldingDistanceHigh; }
set
{
if (value < 0)
fieldingDistanceHigh = 0;
else
fieldingDistanceHigh = value;
}
}
public int FieldingAngleLeft
{
get { return fieldingAngleLeft; }
set
{
if ((value <= 180) && (value >= -180))
fieldingAngleLeft = value;
else
fieldingAngleLeft = 0;
}
}
public int FieldingAngleRight
{
get { return fieldingAngleRight; }
set
{
if ((value <= 180) && (value >= -180))
fieldingAngleRight = value;
else
fieldingAngleRight = 0;
}
}
public abstract bool OnCatch(object sender,BallInPlayEventArgs e);
}
class PlayerType
{
public enum Type {Unknown=0,Pitcher,SecondBaseMan,CenterField};
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Quiz6
{
class Pitcher:Player
{
public Pitcher(int distanceLow, int distanceHigh, int angleLeft, int angleRight)
: base(distanceLow, distanceHigh, angleLeft, angleRight)
{
type = PlayerType.Type.Pitcher;
}
public override bool OnCatch(object sender, BallInPlayEventArgs e)
{
if (e.distanceOfFly > FieldingDistanceLow && e.distanceOfFly < FieldingDistanceHigh)
{
if (e.angleOfFly > FieldingAngleLeft && e.angleOfFly < FieldingAngleRight)
{
message("投手:我接住球了!\r\n");
return true;
}
}
return false;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Quiz6
{
class SecondBaseMan:Player
{
public SecondBaseMan(int distanceLow,int distanceHigh, int angleLeft,int angleRight)
: base(distanceLow,distanceHigh, angleLeft,angleRight)
{
type = PlayerType.Type.SecondBaseMan;
}
public override bool OnCatch(object sender, BallInPlayEventArgs e)
{
if (e.distanceOfFly > FieldingDistanceLow && e.distanceOfFly < FieldingDistanceHigh)
{
if (e.angleOfFly > FieldingAngleLeft && e.angleOfFly < FieldingAngleRight)
{
message("二壘手:我接住球了!\r\n");
return true;
}
}
return false;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Quiz6
{
class CenterFielder:Player
{
public CenterFielder(int distanceLow, int distanceHigh, int angleLeft, int angleRight)
: base(distanceLow, distanceHigh, angleLeft, angleRight)
{
type = PlayerType.Type.CenterField;
}
public override bool OnCatch(object sender, BallInPlayEventArgs e)
{
if (e.distanceOfFly > FieldingDistanceLow && e.distanceOfFly < FieldingDistanceHigh)
{
if (e.angleOfFly > FieldingAngleLeft && e.angleOfFly < FieldingAngleRight)
{
message("中間手:我接住球了!\r\n");
return true;
}
}
return false;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Quiz6
{
class Umpire
{
public delegate string CheckResultEventHandler(object sender, CheckResultEventArgs args);
public event CheckResultEventHandler CheckResult;
private BaseBallField fieldSize = null;
public delegate void Message(string str);
public Message message;
public Umpire(BaseBallField field)
{
fieldSize = field;
}
public void HitOrOut(object sender, BallInPlayEventArgs e)
{
CheckResultEventArgs judgement = new CheckResultEventArgs();
if (e.IsCaught)
{
judgement.IsOut = true;
message("主審:接殺出局!\r\n");
}
else if ((e.angleOfFly > fieldSize.Angle))
{
judgement.IsFoul = true;
message("主審:界外球!\n");
}
else if (e.distanceOfFly > fieldSize.Size)
{
judgement.IsHomeRun = true;
message("主審:全壘打!\n");
}
else
{
judgement.IsHit = true;
message("主審:安打!\n");
}
CheckResult(this, judgement);
}
}
class CheckResultEventArgs : EventArgs
{
bool isOut = false;
bool isFoul = false;
bool isHomeRun = false;
bool isHit = false;
public bool IsOut
{
get
{
return isOut;
}
set
{
isOut = value;
}
}
public bool IsFoul
{
get
{
return isFoul;
}
set
{
isFoul = value;
}
}
public bool IsHomeRun
{
get
{
return isHomeRun;
}
set
{
isHomeRun = value;
}
}
public bool IsHit
{
get
{
return isHit;
}
set
{
isHit = value;
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Quiz6
{
class Fans
{
public delegate void Message(string str);
public Message message;
public Fans() { }
public string React(object sender, CheckResultEventArgs judgement)
{
if (judgement.IsOut)
{
message("Fans: Booo~~~\n");
}
else if (judgement.IsFoul)
{
message("Fans: 打者無能!換打者!!\n");
}
else if (judgement.IsHomeRun)
{
message("Fans: Wow!!~~~\n");
}
else if (judgement.IsHit)
{
message("Fans: Yooo!!~~~\n");
}
else
{
message("Fans: 裁判無能!換裁判!!\n");
}
return "";
}
}
}
沒有留言:
張貼留言