• 网络学院
  • IT资讯
  • 操作系统
  • 网络技术
  • 软件应用
  • 办公软件
  • 编程技术
  • 网站架设
  • 数据库类
  • 平面设计
  • 多媒体类
  • 游戏资讯
  • 教学论文
  • 认证考试
用C#+XML技术开发游戏Sokoban
  站点:
  • 首 页
  • 最新软件
  • 文章教程
  • 国内软件
  • 国外软件
  • 绿色软件
  • 源码下载
  • 字体下载
用C#+XML技术开发游戏Sokoban Pro
软件发布 用C#+XML技术开发游戏Sokoban Pro
网络软件 系统工具 应用软件 联络聊天 图形图像 多媒体类 行业软件 游戏娱乐 编程开发 安全相关 教育教学 数码软件 绿软下载
热门软件: QQ 瑞星 pplive e话通 木马克星 千千静听 office2000 五笔字根 Photoshop 视频分割
返回文章教程首页 >> 文章首页 >> 编程技术 >> C#教程 >> 用C#+XML技术开发游戏Sokoban Pro

用C#+XML技术开发游戏Sokoban Pro

添加时间: 2007-7-16 3:08:26  作者: C#教程  阅读次数:52   来源: http://www.d9soft.com

        Sokoban Pro是经典Sokoban难题游戏的一个现代版本。本文讨论从XML技术角度来实现该游戏。下图是游戏运行中的一个快照。


  Sokoban Pro是经典Sokoban难题游戏的一个现代版本。该游戏极其简单,然而该游戏却是极具挑战性和富有吸引力。游戏规则是把所有的盒子移动到正确的地方。你可以仅仅推动一个盒子,而不是拉。你可以随时通过按动U键来撤消你的上次移动。

  该游戏的一个现代版本如今在Sokoban Pro网站上可以玩了。因为所有的最重要的部分(如读取/写XML,移动和绘画)在本文的源代码中提供,所以我决定在此讨论第一个原始的版本。

  最近的版本(v1.0b)相对于现在这个版本包括了下列几个方面的改进:

  ·"官方"beta发行版

  ·增加菜单支持

  ·我发现使窗口的大小在每一级中改变是十分令人恼火的事情,所以在当前版本中它变为固定的

  ·你可以在不同级间来回跳动,但是仅限于你以前已经完成的级上

  ·针对级别的撤消功能

  ·Splash屏幕和图标

  ·修改了许多错误

  ·也许还有其它一些

  在游戏开始时,你可以创建一个新的玩家或选择一个现有的玩家。既然Sokoban Pro能够保存你的进度,那么你还可以选择是否你想要继续你的上一次游戏。在创建一个玩家后,你可以选择一个级别集合。一个级别集合包含你喜欢的尽可能多的级别。Sokoban Pro带有原来的BoxWorld游戏中的前40个级别。级别集合被存储在XML文件中,这意味着你可以从互联网上不同的Sokoban站点下载级别集合。你还可以创建你自己的级别。当你把它们放到级别目录中时,Sokoban Pro将自动地识别级别集合。

  你用一个XML文件来实现保存游戏。它保存最后玩完的级别集合和最后的玩的级别,这样你可以从你上次玩游戏时离开的地方继续玩下去。另外,它还保存你已经完成的级别及相应的得分(移动和推的数目)。如果你重玩一级并且你的执行更好一些的话,那么你的分数将被更新。
基本上,该游戏由下列几个类组成:

  ·LevelSet-包含所有的有关一个级别集合(作者信息,级别数目,等等……)的信息。它也把级别集合XML中的级别装载到内存中。

  ·Level-代表在一个级别集合中的一个级别。这里发生的最重要的事情是它追踪所有的你的移动。在玩家移动或推一个盒子时,它更新在一个级别中的项。它更新相应的图形并实现撤消功能,并且最后在屏幕上绘制出级别。

  ·PlayerData-追踪所有的玩家信息。基本上,它反映出你的SaveGame。

  ·Board(Form)-主表单处理所有的玩家输入并且初始化所有的对象。

  ·Players(Form)-让你创建一新的玩家或选择一个现有的玩家。

  ·Levels(Form)-让你选择一个你想要玩的级别集合。

  该应用程序使用读取和写XML文件。例如,下列方法-SaveLevel()-在玩家完成一级后它存储玩家数据。

public void SaveLevel(Level level)
{
 XmlDocument doc = new XmlDocument();
 doc.Load(filename);
 XmlNode lastFinishedLvl = doc.SelectSingleNode("//lastFinishedLevel");
 lastFinishedLvl.InnerText = level.LevelNr.ToString();
 XmlNode setName = doc.SelectSingleNode("/savegame/levelSets/" +"levelSet[@title = \"" + level.LevelSetName + "\"]");
 XmlNode nodeLevel = setName.SelectSingleNode("level[@levelNr = " + level.LevelNr + "]");
 if (nodeLevel == null){
  XmlElement nodeNewLevel = doc.CreateElement("level");
  XmlAttribute xa = doc.CreateAttribute("levelNr");
  xa.Value = level.LevelNr.ToString();
  nodeNewLevel.Attributes.Append(xa);
  XmlElement moves = doc.CreateElement("moves");
  moves.InnerText = level.Moves.ToString();
  XmlElement pushes = doc.CreateElement("pushes");
  pushes.InnerText = level.Pushes.ToString();
  nodeNewLevel.AppendChild(moves);
  nodeNewLevel.AppendChild(pushes);
  setName.AppendChild(nodeNewLevel);
 }
 else{
  XmlElement moves = nodeLevel["moves"];
  XmlElement pushes = nodeLevel["pushes"];
  int nrOfMoves = int.Parse(moves.InnerText);
  int nrOfPushes = int.Parse(pushes.InnerText);
  if (level.Pushes < nrOfPushes){
   pushes.InnerText = level.Pushes.ToString();
   moves.InnerText = level.Moves.ToString();
  }
  else if (level.Pushes == nrOfPushes && level.Moves < nrOfMoves)
  moves.InnerText = level.Moves.ToString();
 }
 doc.Save(filename);
}

  下面是所发生的事情:

  我们使用XPath来选择在一个XML文件中的结点。这样,我们不必逐行读取XML,直到我们在我们想要添加一新的元素或更新现有的一个元素的地方找到正确的元素。见下面一行:

XmlNode setName = doc.SelectSingleNode("/savegame/levelSets/"+"levelSet[@title = \"" + level.LevelSetName + "\"]");


  选择我们当前玩的级别的级别集合结点。(记住,Sokoban Pro支持多个级别集合,因此在XML中可能有多于1个的级别集合)。然后,请看下面一行:

XmlNode nodeLevel = setName.SelectSingleNode("level[@levelNr = "+ level.LevelNr + "]");

  从当前级别集合中选择我们正在玩的级别数。

  如果我们没有找到当前级别结点,这意味着我们在前面没有完成这个级别而我们添加一新的级别结点。如果我们的确找到了级别结点,这意味着我们在前面已经玩完了这个级别并且我们检查是否我们的当前得分更高些。而如果是这样,让我们更新得分。

  该游戏大量使用读取和写XML文件,并且如你看到的,使用了Xpath作为一个强有力的工具。

  我想说明的另外一件事情是我是怎样加载级别的。我已经说过,我们把级别存储在XML中。一个级别包含不同的项:一个墙,一个地板,一个箱子,等等。当我们加载一个级别时,我们读取XML中的行-该XML中包含级别数据。一个级别中的每一项是以一个ASCII字符来描述的。当我们读取级别数据时,我们把项存储到一个二维数组中。

  在我们想绘制该级别时,我们读取这个数组,然后我们就可以如下方式进行级别绘制:

//绘制级别
for (int i = 0; i < width; i++){
 for (int j = 0; j < height; j++){
  Image image = GetLevelImage(levelMap[i, j], sokoDirection);
  g.DrawImage(image, ITEM_SIZE + i * ITEM_SIZE, ITEM_SIZE + j * ITEM_SIZE, ITEM_SIZE, ITEM_SIZE);
  //设置Sokoban的位置
  if (levelMap[i, j] == ItemType.Sokoban levelMap[i, j] == ItemType.SokobanOnGoal){
   sokoPosX = i;
   sokoPosY = j;
  }
 }
}

  我们逐行逐字符地读取数组。根据我们遇到项的不同情况,我们得到一个从GetLevelImage方法返回的图像-该方法检查我们拥有哪一项并且返回相应的图像。最后,在已知项的位置、宽度和高度的情况下,我们绘制图像。大小被存储在ITEM_SIZE变量中。如果我们想要把级别绘得更小些(也许针对低分辨率的监视器),我们可以减少ITEM_SIZE的值(默认是30)。

  另外一个有趣的地方是检查是否允许Sokoban移动。只有他前面的项是一个空的位置或者是一个后面是空的位置的盒子时,他才能移动。当他移动时,我们用三个独立的项对象存储盒子,Sokoban留下的空位置以及Sokoban的新位置,并且我们使用这些对象来重绘这个级别的这三个项,而不是重绘整个级别。对于恢复最后推动作的情况,也是相同的实现方式。

 

上下文章:

 

上一篇文章: 在Visual C#中使用XML指南之读取XML 下一篇文章: 使用VS2005打造简单分页浏览器

相关文章:

  • 教你如何用零框架技术加密网页
  • 用端口碰撞技术实现服务器远程管理
  • 城域网光缆线路设计与技术应用
  • 盗号记录器通过钩子专盗网络游戏账号
  • Oracle开发人员JAVA存储过程

相关软件:

  • 思酷曼杀人游戏俱乐部管理系统 V1.2
  • CGI技术全面接触(PDG)
  • Grove[.NET组件开发包] V1.2.1640
  • 技术人员实用工具合集 06/03/21 [机必备工具]
  • 全国专业技术人员计算机应用能力考试模拟 2.1
  • 拼图游戏2000 3.5

 

快速导航

  • 网络学院
  • 精品汇聚
  • 字体下载
  • 教程下载
  • ASP源码
  • PHP源码
  • Net源码
  • JSP 源码

编程技术分类导航

  • ASP & ASP.NET教程
  • PHP教程
  • JSP教程
  • C/C++教程
  • VB & VB.NET教程
  • VC教程
  • Delphi教程
  • BCB教程
  • VFP教程
  • PB教程
  • JAVA教程
  • XML教程
  • C#教程
  • CGI教程

本类经典文章推荐

  • ADO.NET的开发场景及传统ADO的处理
  • 利用Visual C#实现Window管道技术
  • C#取得汉字的拼音的首字母
  • 使用C#编写DES加密程序的framework
  • Visual C#编写3D游戏框架示例
  • 用C#和本地Windows API操纵系统菜...
  • 在C#程序设计中使用Win32类库
  • Visual C#中调用Windows服务初探
  • 如何在C#的WinForm中制作饼状图和...
  • C#中实现DataGrid双向排序

C#教程阅读排行

  • 如何在C#的WinForm中制作饼状图和...
  • 浅析C#中图形编程
  • 用C#和本地Windows API操纵系统菜...
  • 彻底剖析C# 2.0泛型类的创建和使用
  • 使用C#编写DES加密程序的framework
  • Visual C#编写3D游戏框架示例
  • Visual C#中调用Windows服务初探
  • C#如何在Form中嵌入并且操作Excel...
  • Visual C# 2005实现控件中捕获按键
  • C#中利用mediaplayer打造mp3播放器

编程技术阅读总排行

  • VB入门教程之一
  • Java连接数据库实例
  • 第二章 PowerBuilder 入门之创建新...
  • VC++之List Box/Check List Box控...
  • 第一章 什么是PowerBuilder
  • VC++ List Ctrl控件
  • VC++ Combo Box/Combo Box Ex控件
  • 学C++不得不看的一篇文章
  • VB入门教程之二
  • VC++之Button控件

广告位置

字母检索 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 回到顶部

关于我们 | 版权声明 | 免责条款 | 广告联系 | 软件发布 | 下载帮助 | 下载排行 | 网站地图 | 特别鸣谢 | 友情连接

copyright; 2005-2008 D9soft.com 第九软件网 版权所有