既然了解了中介者的原理和结构,很自然就能想到游戏里的一些东西,比如说拍卖行,玩家不需要知道对方信息,就能进行买卖
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
namespace MediatorExample2
{
public class MediatorExample2 : MonoBehaviour
{
void Start ( )
{
//拍卖行
CardMediator cardPool = new CardMediator();
AfricaFriend player1 = new AfricaFriend(cardPool);
whiteFace player2 = new whiteFace(cardPool);
cardPool.AddColleague(player1);
cardPool.AddColleague(player2);
player1.sale(Card.R, 100);
player1.sale(Card.SR, 50);
player2.buy(Card.R, 100);
player2.sale(Card.R, 10);
player1.buy(Card.R, 10);
player1.buy(Card.R, 50);
cardPool.PrintCardOfferings();
}
}
//三种卡片
public enum Card
{
R,
SR,
SSR
};
/// <summary>
/// 卡片信息
/// </summary>
public class CardOffer
{
public int CardShares { get; private set; }
public Card Card { get; private set; }
public int colleagueID { get; private set; }
public CardOffer(int numOfShares, Card Card, int collID)
{
this.CardShares = numOfShares;
this.Card = Card;
this.colleagueID = collID;
}
}
public abstract class Colleague
{
private Mediator mediator;
private int colleagueID;//玩家ID
public int ColleagueID
{
get
{
return colleagueID;
}
set
{
colleagueID = value;
}
}
public Colleague(Mediator mediator)
{
this.mediator = mediator;
}
//玩家的两种行为卖和买
public void sale(Card Card, int shares)
{
mediator.sale(Card, shares, this.ColleagueID);
}
public void buy(Card Card, int shares)
{
mediator.buy(Card, shares, this.ColleagueID);
}
}
/// <summary>
/// 非洲人
/// </summary>
public class AfricaFriend : Colleague
{
//使用传递的参数调用基类
public AfricaFriend(Mediator mediator) : base(mediator)
{
}
}
/// <summary>
/// 欧皇
/// </summary>
public class whiteFace : Colleague
{
public whiteFace(Mediator mediator) : base(mediator)
{
}
}
/// <summary>
/// 中介者基类
/// </summary>
public interface Mediator
{
void AddColleague(Colleague colleague);
void sale(Card Card, int shares, int ID);
void buy(Card Card, int shares, int ID);
}
public class CardMediator : Mediator
{
private List<Colleague> colleagues;//玩家列表
private List<CardOffer> buys;//收购处
private List<CardOffer> sellOffers;//寄售处
private int colleagueIDs = 0;//玩家ID
public CardMediator()
{
colleagues = new List<Colleague>();
buys = new List<CardOffer>();
sellOffers = new List<CardOffer>();
}
/// <summary>
///玩家加入
/// </summary>
/// <param name="colleague"></param>
public void AddColleague(Colleague colleague)
{
this.colleagues.Add(colleague);
colleagueIDs += 1;
colleague.ColleagueID= colleagueIDs;
Debug.Log("玩家" + colleagueIDs + "进入拍卖行");
}
//出售
public void sale(Card Card, int shares, int ID)
{
bool CardSold = false;
// see if someone is willing to buy:
for (int i = 0; i < buys.Count; i++)
{
CardOffer offer = buys[i];
//如果有人在收购
if (offer.Card == Card && offer.CardShares == shares)
{
Debug.Log(shares + " 张" + Card + " 卡卖给了玩家 " + ID);
buys.Remove(offer);
CardSold = true;
}
if (CardSold) break;
}
//如果没人收购就加入寄售列表
if (!CardSold)
{
Debug.Log(shares + " 张" + Card + " 卡片加入寄售处");
CardOffer offer = new CardOffer(shares, Card, ID);
sellOffers.Add(offer);//挂在寄售处
}
}
public void buy(Card Card, int shares, int ID)
{
bool CardBought = false;
//看是否有人在售卖
for (int i = 0; i < sellOffers.Count; i++)
{
CardOffer offer = sellOffers[i];
// 卡片和数量是否一致
if (offer.Card == Card && offer.CardShares == shares)
{
Debug.Log(shares + " 张" + Card + " 卡收购于玩家 " + ID);
sellOffers.Remove(offer);
CardBought = true;
}
if (CardBought) break;
}
//如果没有
if (!CardBought)
{
Debug.Log(shares + " 张" + Card + " 卡加入收购处");
CardOffer offer = new CardOffer(shares, Card, ID);
buys.Add(offer);//挂在收购处
}
}
//打出当前挂单
public void PrintCardOfferings()
{
Debug.Log("寄售单数: " + sellOffers.Count);
foreach (CardOffer offer in sellOffers)
{
Debug.Log(offer.Card + " - " + offer.CardShares + " -玩家- " + offer.colleagueID);
}
Debug.Log("收购单数: " + buys.Count);
foreach (CardOffer offer in buys)
{
Debug.Log(offer.Card + " - " + offer.CardShares + " - 玩家-" + offer.colleagueID);
}
}
}
}