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");
}
}
}
沒有留言:
張貼留言