选择显示字体大小

用c#+xml技术开发游戏sokoban pro


  该游戏的一个现代版本如今在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的新位置,并且我们使用这些对象来重绘这个级别的这三个项,而不是重绘整个级别。对于恢复最后推动作的情况,也是相同的实现方式。


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons