Ball.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace baseball_final
{
class Ball
{
public delegate void Message(string str);
public Message message;
public delegate bool isStrikeEventHandler(object sender, OnBallInPlayEventArgs e);
public isStrikeEventHandler isStrike;
public isStrikeEventHandler isHit;
public delegate bool isHitOutEventHandler(object sender, BallHitEventArgs e);
public isHitOutEventHandler isHomeRun;
public isHitOutEventHandler isInSide;
public delegate void PlotFieldEventHandler(int angle , int distance);
public PlotFieldEventHandler plotfield;
public int SpeeIn;
public int YIn;
public int XIn;
public int DistanceOut;
public int AngleOut;
public void BallInPlay(object sender, OnBallInPlayEventArgs e)
{
message("球速: "+e.SpeedIn.ToString()+"\t"+"座標: ("+e.XIn.ToString()+","+e.YIn.ToString()+")"+"\n");
if (isStrike(this, e))
{
message("好球帶!\n");
if (isHit(this, e))
{
message("打擊出去!\n");
Random rnd = new Random();
BallHitEventArgs c = new BallHitEventArgs(rnd.Next(0, 600), rnd.Next(-45, 45));
message("角度: " + c.OutBallAngle.ToString() + "\t" + "距離: " + c.OutBallDistance.ToString()+"\n");
plotfield(c.OutBallAngle,c.OutBallDistance);
if (isInSide(this, c))
{
if (isHomeRun(this, c))
{
message("全壘打!\n");
}
else
message("界外!\n");
}
else
message("界外球!");
}
}
else
message("壞球帶!\n");
}
}
public class BallHitEventArgs : EventArgs
{
public int OutBallDistance;
public int OutBallAngle;
public BallHitEventArgs(int d, int a)
{
OutBallAngle = a;
OutBallDistance = d;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace baseball_final
{
class Batter
{
public delegate void Message(string str);
public Message message;
public int SpeedUpperLimit;
public int BattleAverage;
public Batter(int s,int b)
{
SpeedUpperLimit = s;
BattleAverage = b;
}
public bool isStrikeBall(object sender, OnBallInPlayEventArgs e)
{
if (e.XIn > 50 || e.XIn < -50 || e.YIn > 160 || e.YIn < 60)
return false;
else
return true;
}
public bool isHit(object sender, OnBallInPlayEventArgs e)
{
if (e.SpeedIn < SpeedUpperLimit)
{
Random rnd = new Random();
if (rnd.Next(0, 100) > BattleAverage)
{
message("揮棒落空\n");
return false;
}
else
{
return true;
}
}
else
{
message("球速過快!+\n");
return false;
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace baseball_final
{
class Field
{
public bool isHomeRun(object sender, BallHitEventArgs e)
{
if (e.OutBallDistance > 400)
return true;
else
return false;
}
public bool isInSide(object sender, BallHitEventArgs e)
{
if (e.OutBallAngle > 45 || e.OutBallAngle < -45)
return false;
else
return true;
}
}
}
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 baseball_final;
namespace Project
{
public partial class Form1 : Form
{
Graphics g;
Pen pen;
Rectangle rect = new Rectangle(250, 20,600, 600);
public Form1()
{
InitializeComponent();
g = this.CreateGraphics();
pen = new Pen(Color.Red, 3);
}
private void btn_Pitch_Click(object sender, EventArgs e)
{
Ball ball = new Ball();
Random rnd = new Random();
PitchMashine pitchmachine = new PitchMashine();
Batter batter = new Batter(150, 70);
Field field = new Field();
pitchmachine.BallInPlay += ball.BallInPlay;
ball.isStrike += batter.isStrikeBall;
ball.isHit += batter.isHit;
ball.isHomeRun += field.isHomeRun;
ball.isInSide += field.isInSide;
ball.message = message;
batter.message = message;
pitchmachine.message = message;
ball.plotfield = plotBallOut;
pitchmachine.OnBallInPlay(rnd.Next(130, 160), rnd.Next(-75, 75), rnd.Next(30, 180));
message("========================\n");
g.DrawPie(pen, rect, -135, 90);
//g.DrawRectangle(pen, 400, 350, 150,150);
//g.DrawRectangle(pen, 500, 360, 3, 3);
g.DrawRectangle(pen, 300, 0, 500, 400);
}
private void plotBallOut(int angle, int disance)
{
double d_angle = angle;
double d_distance = disance;
double x = 550 + d_distance * Math.Sin(angle);
double y = 310 - d_distance * Math.Cos(angle);
g.DrawRectangle(pen, Convert.ToInt32(x), Convert.ToInt32(y), 3, 3);
}
private void message(string str)
{
txt_Resault.AppendText(str);
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace baseball_final
{
class PitchMashine
{
public delegate void Message(string str);
public Message message;
public delegate void OnBallInPlayEventHandler(object sender,OnBallInPlayEventArgs e);
public OnBallInPlayEventHandler BallInPlay;//委託給Ball類別執行事件
public void OnBallInPlay(int s, int x, int y)//輸入input之球速,高度,寬度
{
message("發球!\n");
OnBallInPlayEventArgs e = new OnBallInPlayEventArgs(s,x,y);
BallInPlay(this, e);
}
}
public class OnBallInPlayEventArgs : EventArgs
{
public int SpeedIn;
public int XIn;
public int YIn;
public OnBallInPlayEventArgs(int s, int x, int y)
{
SpeedIn = s;
XIn = x;
YIn = y;
}
}
}
沒有留言:
張貼留言