先定义一个Tank开火的委托,接收两个参数:攻击目标,火力
public delegate string Firing(int aim, int power);
定义一个Tank类
public class Tank
{
private int _id;
private int _armor;
private int _power;
public Firing FiringInstance;
public Tank(int id, int armor, int power)
{
this._id = id; this._armor = armor; this._power = power;
}
public int ID
{
get
{
return this._id;
}
}
public void Fire(int aim)
{
if (FiringInstance != null)
{
FiringInstance.BeginInvoke(aim,this._power, new System.AsyncCallback(CallBackMethod), DateTime.Now);
}
}
public string Hit(int power)
{
if (this._armor == 0)
{
return this._id.ToString() + "以在之前击毁了";
}
this._armor -= power;
if (this._armor <= 0)
{
this._armor = 0;
return this._id.ToString() + "被击毁了";
}
else
{
return this._id.ToString() + "被击中了,还剩余能量:" + this._armor.ToString();
}
}
private void CallBackMethod(IAsyncResult asyncResult)
{
string result = FiringInstance.EndInvoke(asyncResult);
DateTime dateTime = (DateTime)asyncResult.AsyncState;
Console.Out.WriteLine(this._id.ToString() + "在" + dateTime.ToLongTimeString() + "发射的导弹:" + result);
}
}
再定义个Tank的控制类,包含Tank集合
public class TankList
{
private List<Tank> _tankList;
public TankList()
{
this._tankList = new List<Tank>();
}
public void AddTank(Tank tank)
{
tank.FiringInstance = new Firing(this.FiringCommand);
this._tankList.Add(tank);
}
public Tank GetTank(int index)
{
return this._tankList[index];
}
private string FiringCommand(int aim, int power)
{
for (int i = 0; i < this._tankList.Count; i++)
{
Thread.Sleep(1000);
if (this._tankList[i].ID == aim)
{
return this._tankList[i].Hit(power);
}
}
return "未找到目标";
}
}
简单的调用实现,初始化8辆Tank之后,为其注册事件,发生异步调用
public class Program
{
static void Main(string[] args)
{
Random random = new Random(DateTime.Now.Millisecond);
TankList tankList = new TankList();
for (int i = 0; i < 8; i++)
{
Tank t = new Tank(i, 100, random.Next(10, 30));
tankList.AddTank(t);
}
for (int i = 0; i < 20; i++)
{
int aimi, aimo;
aimi = random.Next(0, 8);
aimo = random.Next(0, 8);
System.Console.WriteLine("第" + i.ToString() + "次开火,从" + aimi.ToString() + "打向" + aimo.ToString());
tankList.GetTank(aimi).Fire(aimo);
Thread.Sleep(500);
}
System.Console.ReadLine();
}
}
public delegate string Firing(int aim, int power);
public class Tank
{
private int _id;
private int _armor;
private int _power;
public Firing FiringInstance;
public Tank(int id, int armor, int power)
{
this._id = id; this._armor = armor; this._power = power;
}
public int ID
{
get
{
return this._id;
}
}
public void Fire(int aim)
{
if (FiringInstance != null)
{
FiringInstance.BeginInvoke(aim,this._power, new System.AsyncCallback(CallBackMethod), DateTime.Now);
}
}
public string Hit(int power)
{
if (this._armor == 0)
{
return this._id.ToString() + "以在之前击毁了";
}
this._armor -= power;
if (this._armor <= 0)
{
this._armor = 0;
return this._id.ToString() + "被击毁了";
}
else
{
return this._id.ToString() + "被击中了,还剩余能量:" + this._armor.ToString();
}
}
private void CallBackMethod(IAsyncResult asyncResult)
{
string result = FiringInstance.EndInvoke(asyncResult);
DateTime dateTime = (DateTime)asyncResult.AsyncState;
Console.Out.WriteLine(this._id.ToString() + "在" + dateTime.ToLongTimeString() + "发射的导弹:" + result);
}
}
public class TankList
{
private List<Tank> _tankList;
public TankList()
{
this._tankList = new List<Tank>();
}
public void AddTank(Tank tank)
{
tank.FiringInstance = new Firing(this.FiringCommand);
this._tankList.Add(tank);
}
public Tank GetTank(int index)
{
return this._tankList[index];
}
private string FiringCommand(int aim, int power)
{
for (int i = 0; i < this._tankList.Count; i++)
{
Thread.Sleep(1000);
if (this._tankList[i].ID == aim)
{
return this._tankList[i].Hit(power);
}
}
return "未找到目标";
}
}
public class Program
{
static void Main(string[] args)
{
Random random = new Random(DateTime.Now.Millisecond);
TankList tankList = new TankList();
for (int i = 0; i < 8; i++)
{
Tank t = new Tank(i, 100, random.Next(10, 30));
tankList.AddTank(t);
}
for (int i = 0; i < 20; i++)
{
int aimi, aimo;
aimi = random.Next(0, 8);
aimo = random.Next(0, 8);
System.Console.WriteLine("第" + i.ToString() + "次开火,从" + aimi.ToString() + "打向" + aimo.ToString());
tankList.GetTank(aimi).Fire(aimo);
Thread.Sleep(500);
}
System.Console.ReadLine();
}
}


浙公网安备 33010602011771号