C#单例设计模式的运用《一个小游戏的例子》

shower168 2010-12-09 05:27:21
由于我在游戏中创建了N个类,有可能完本插入代码,Bety不够,下面就插入《单例设计模式》的代码,及个别类的代码,如果哪里有错误,希望高手指教!
下面插入一个Games类的代吗,也是游戏的主要部分《单例设计模式》
namespace WindowsFormsApplication1
{
public class Games
{
private Games()
{

}
private static volatile Games instance;//,Volatile禁止系统微调代码间的调用。这个也很关健。
private static object lockHelper =new object();//这个是一个辅助对象为,单例设计模式加一个双保险、
public static Games GetInstance()
{
if (instance == null)
{
lock (lockHelper)//双保险的实现,经过两层的过虑,还要注意上面《volatile Games instance;>>关健字,Volatile禁止系统微调代码间的调用。
{
if (instance == null)
{
instance = new Games();
}
}
}
return instance;
}
private static Enelmy en = null;
public static Enelmy En
{
get { return en; }
set { en = value; }
}
private Player1 p1 = null;

public Player1 P1
{
get { return p1; }
set { p1 = value; }
}
#endregion
public static List<Player1> player1 = new List<Player1>();
private List<BloodBar> Bar = new List<BloodBar>();
private List<MessageBoxs> messageboxs = new List<MessageBoxs>();
public void AddElement(Element e)
{
if (e is Player1)
{
player1.Add(e as Player1);
return;
}
if (e is MessageBoxs)
{
messageboxs.Add(e as MessageBoxs);
return;
}
}
public void DrawBar(Graphics e)
{

for (int i = 0; i < Bar.Count; i++)
{
Bar[i].Draw(e);
}
for (int i = 0; i < enelmyBar.Count; i++)
{
enelmyBar[i].Draw(e);
}
}
public void Draw(Graphics e)
{
for (int i = 0; i < efficts.Count; i++)
{
efficts[i].Draw(e);
}
for (int i = 0; i < erroreffict.Count; i++)
{
erroreffict[i].Draw(e);
}

for (int i = 0; i < missile.Count; i++)
{
missile[i].Draw(e);
}
for (int i = 0; i < skstr.Count; i++)
{
skstr[i].Draw(e);
}

}
public void KeyUp(KeyEventArgs e) //按键松开方法
{
//MessageBox.Show(e.KeyValue.ToString());
for (int i = 0; i < skstr.Count; i++)
{
if (e.KeyValue > 64 && e.KeyValue < 91)
{
if (e.KeyValue == (skstr[i].Skstr))
{
for (int k = 0; k < player1.Count; k++)
{
if (player1[k].Isattack)
{
skstr[i].IsAlive1 = false;
Games.GetInstance().AddElement(new Missile(skstr[i], 20, 2, 20, 20, player1 [k].Id,player1[k].Attack));//输入正确发《《出一个子弹。。
isgoodStringNum++;
}
else if (k == player1.Count - 1)
{//这里主要是确定一下子弹是由哪个英雄发出来。
skstr[i].IsAlive1 = false;
Games.GetInstance().AddElement(new Missile(skstr[i], 20, 2, 20, 20, player1[k].Id, player1[k].Attack));
}
}
return;//如果输入正确哪么就返回。不加的话,一次会把屏上所有对的全打出来。
}
else if (e.KeyValue != (skstr[i].Skstr) && i == skstr.Count - 1)//如果输入错误,并且是所有集合都没有此字符,哪么提示出错信息。
{ Games.GetInstance().AddElement(new ErrorEffict(skstr[i].X, skstr[i].Y, 2, skstr[i], 1, 1)); this.errornums++; return; }
}
}
#region//打开选择人物的背包。。
for (int i = 0; i < player1.Count; i++)
{
if (player1[i].Ischose1)
{
if (e.KeyValue == 119 && !openBag)
{
openBag = true;//打开背包的标志
MainFrm.Getinstance().GamePause1 = true;
BagFrm bagf = new BagFrm();
bagf.ShowDialog();
if (bagf.DialogResult == DialogResult.Cancel)
{
openBag = !openBag;
MainFrm.Getinstance().GamePause1 = false;
}

return;
}
}
//else if (i == player1.Count - 1) { player1[i].Ischose1 = true; return; }//可如果没有选择人物哪么,最后一个默认为选择
}
#endregion

}

public void MouseMove(MouseEventArgs e, Graphics g)
{
for (int i = 0; i < wpred.Count; i++)
{
wpred[i].MouseMove(e,g);
}
}
public void Mouse_Click(MouseEventArgs e)
{
for (int i = 0; i < player1.Count; i++)
{
player1[i].MouseClick(e);
}

for (int i = 0; i < wpred.Count; i++)
{
for (int j = 0; j < player1.Count; j++)
{
player1[j].Get_wuping(e, wpred[i]);
}
}
for (int i = 0; i < messageboxs.Count; i++)
{
messageboxs[i].MouseClick(e);
}
for (int i = 0; i < Bar.Count; i++)
{
Bar[i].Isselect = player1[i].Ischose1;
}
int Tempx = 0;
int Tempy = 0;
double temsum = 0;
for (int j = 0; j < player1.Count; j++)
{
Tempx = Math.Abs(player1[j].X + 40 - e.X);//还是我自己的碰撞检测好用的多,用GetRectangle检测鼠标不太好用。
Tempy = Math.Abs(player1[j].Y + 40 - e.Y);
temsum = Math.Sqrt(Tempx * Tempx + Tempy * Tempy);
if (temsum < 46)
{
Bar[player1 .Count -1].Isselect = false;
Bar[j].Isselect = true;
}
}
}
public void IsWinOrLost()//游戏是否胜利
{
if (Games.enelmy.Count <= 0)
{
Games.overgames.Add(new OverGames(350, 180, 2, false, -1));
Games.GetInstance().win = Win.YouWin;
}
if (Games.player1.Count < 1)
{
Games.GetInstance().win = Win.YouLost;
Games.overgames.Add(new OverGames(350, 180, 2, false, -1));
Games.LevelGames = 1;
}

}
}
...全文
303 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
噢,解释一下,“不懂static”应该改为“不懂static class”。
  • 打赏
  • 举报
回复
其实java现在也支持static了。可是gof写设计模式那本书的时候高java的人不懂static,所以没有这方面的基础知识。
  • 打赏
  • 举报
回复
嗯,既然你使用.net,我建议你先听说 static变量,或者static属性/方法。
C#设计模式(1) 一、 C# 面向对象程序设计复习 二、 设计模式举例 三、 先有鸡还是先有蛋? 四、 大瓶子套小瓶子还是小瓶子套大瓶子? 五、 .net本质 C#设计模式(2) 一、 "开放-封闭"原则(OCP) 二、 里氏代换原则(LSP) C#设计模式(3) 三、 依赖倒置原则(DIP) 四、 接口隔离原则(ISP) 五、 合成/聚合复用原则(CARP) 六、 迪米特法则(LoD) C#设计模式(4)-Simple Factory Pattern 一、 简单工厂(Simple Factory)模式 二、 Simple Factory模式角色与结构: 三、 程序举例: 四、 Simple Factory模式演化 五、 优点与缺点: C#设计模式(5)-Factory Method Pattern 一、 工厂方法(Factory Method)模式 二、 Factory Method模式角色与结构: 三、 程序举例: 四、 工厂方法模式与简单工厂模式 五、 Factory Method模式演化 六、 Factory Method模式与其它模式的关系 七、 另外一个例子 C#设计模式(6)-Abstract Factory Pattern 一、 抽象工厂(Abstract Factory)模式 二、 Abstract Factory模式的结构: 三、 程序举例: 四、 在什么情形下使用抽象工厂模式: 五、 抽象工厂的起源 六、 Abstract Factory模式在实际系统中的实现 七、 "开放-封闭"原则 C#设计模式(7)-Singleton Pattern 一、 单例(Singleton)模式 二、 Singleton模式的结构: 三、 程序举例: 四、 在什么情形下使用单例模式: 五、 Singleton模式在实际系统中的实现 六、 C#中的Singleton模式 C#设计模式(8)-Builder Pattern 一、 建造者(Builder)模式 二、 Builder模式的结构: 三、 程序举例: 四、 建造者模式的活动序列: 五、 建造者模式的实现: 六、 建造者模式的演化 七、 在什么情况下使用建造者模式 C#设计模式(9)-Prototype Pattern 一、 原型(Prototype)模式 二、 Prototype模式的结构: 三、 程序举例: 四、 带Prototype Manager的原型模式 五、 浅拷贝与深拷贝 六、 Prototype模式的优点与缺点 C#设计模式(10)-Adapter Pattern 一、 适配器(Adapter)模式 二、 类的Adapter模式的结构: 三、 类的Adapter模式示意性实现: 四、 对象的Adapter模式的结构: 五、 对象的Adapter模式示意性实现: 六、 在什么情况下使用适配器模式 七、 一个实际应用Adapter模式的例子 八、 关于Adapter模式的讨论 C#设计模式(11)-Composite Pattern 一、 合成(Composite)模式 二、 合成模式概述 三、 安全式的合成模式的结构 四、 安全式的合成模式实现 五、 透明式的合成模式结构 六、 透明式的合成模式实现 七、 使用合成模式时考虑的几个问题 八、 和尚的故事 九、 一个实际应用Composite模式的例子 C#设计模式(12)-Decorator Pattern 一、 装饰(Decorator)模式 二、 装饰模式的结构 三、 装饰模式示例性代码 四、 装饰模式应当在什么情况下使用 五、 装饰模式实际应用的例子 六、 使用装饰模式的优点和缺点 七、 模式实现的讨论 八、 透明性的要求 九、 装饰模式在.NET中的应用 C#设计模式(13)-Proxy Pattern 一、 代理(Proxy)模式 二、 代理的种类 三、 远程代理的例子 四、 代理模式的结构 五、 代理模式示例性代码 六、 高老庄悟空降八戒 七、 不同类型的代理模式 八、 代理模式实际应用的例子 设计模式(14)-Flyweight Pattern 一、 享元(Flyweight)模式 二、 单纯享元模式的结构 三、 单纯享元模式的示意性源代码 四、 复合享元模式的结构 五、 一个咖啡摊的例子 六、 咖啡屋的例子 七、 享元模式应当在什么情况下使用 八、 享元模式的优点和缺点 设计模式(15)-Facade Pattern 一、 门面(Facade)模式 二、 门面模式的结构 三、 门面模式的实现 四、 在什么情况下使用门面模式 五、 一个例子 六、 使用门面模式的设计 设计模式(16)-Bridge Pattern 一、 桥梁(Bridge)模式 二、 桥梁模式的结构 三、 桥梁模式的示意性源代码 四、 调制解调器问题 五、 另外一个实际应用Bridge模式的例子 六、 在什么情况下应当使用桥梁模式 设计模式(17)-Chain of Responsibility Pattern 一、 职责链(Chain of Responsibility)模式 二、 责任链模式的结构 三、 责任链模式的示意性源代码 四、 纯的与不纯的责任链模式 五、 责任链模式的实际应用案例 六、 责任链模式的实现 设计模式(18)-Command Pattern 一、 命令(Command)模式 二、 命令模式的结构 三、 命令模式的示意性源代码 四、 玉帝传美猴王上天 五、 命令模式的实现 六、 命令模式的实际应用案例 七、 在什么情况下应当使用命令模式 八、 使用命令模式的优点和缺点 设计模式(19)-Observer Pattern 一、 观察者(Observer)模式 二、 观察者模式的结构 三、 观察者模式的示意性源代码 四、 C#中的Delegate与Event 五、 一个实际应用观察者模式的例子 六、 观察者模式的优缺点 设计模式(20)-Visitor Pattern 一、 访问者(Visitor)模式 二、 访问者模式的结构 三、 示意性源代码 四、 一个实际应用Visitor模式的例子 五、 在什么情况下应当使用访问者模式 六、 使用访问者模式的优点和缺点 设计模式(21)-Template Method Pattern 一、 模板方法(Template Method)模式 二、 模版方法模式的结构 三、 模板方法模式的示意性代码 四、 继承作为复用的工具 五、 一个实际应用模板方法的例子 六、 模版方法模式中的方法 七、 重构的原则 设计模式(22)-Strategy Pattern 一、 策略(Strategy)模式 二、 策略模式的结构 三、 示意性源代码 四、 何时使用何种具体策略角色 五、 一个实际应用策略模式的例子 六、 在什么情况下应当使用策略模式 七、 策略模式的优点和缺点 八、 其它

111,120

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧