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