北大侠客行MUD论坛

 找回密码
 注册
搜索
热搜: 新手 wiki 升级
查看: 6819|回复: 4

ZMud调用COM的尝试(二)-房间数据采集

[复制链接]
发表于 2013-9-24 14:42:43 | 显示全部楼层 |阅读模式
本帖最后由 jsleo 于 2013-9-24 11:19 AM 编辑

开始尝试采集房间数据,遇到一个问题,就是zmud一直被诟病的乱码问题。
当采集到的数据存储到变量里面的时候,是肯定会出现乱码的。但是经过尝试,发现如果不通过变量中转,而是直接发送给com组件,则没有乱码。

采集的zmud侧代码很简单,也没有反捣乱,就是个尝试。用look后的房间名称触发,因为后面带“ -”,提示符">"作为结束触发,之间的所有内容直接发送给com组件。

zmud代码
  1. #CLASS {caiji}
  2. #ALIAS com {#var ccc %comcreate( "zmud.Class1")}
  3. #VAR desc {}
  4. #TRIGGER {^(%x)%s~-} {#T+ cjdata;desc = ""}
  5. #CLASS 0
  6. #CLASS {caiji|cjdata}
  7. #TRIGGER {^~>} {desc=@ccc.send("over");#T- cjdata}
  8. #TRIGGER {^(*)$} {desc=@ccc.send("%1")}
  9. #CLASS 0
复制代码
com代码
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Data;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. using System.Runtime.InteropServices;
  9. using com.a2.DB;

  10. namespace zmud
  11. {
  12.   [Guid("154BD6A6-5AB8-4d7d-A343-0A68AB79470B")]
  13.   public interface MyCom_Interface
  14.   {
  15.     [DispId(1)]
  16.     string send(string s);
  17.     [DispId(2)]
  18.     string gowhere(string s);
  19.   }

  20.   [Guid("D11FEA37-AC57-4d39-9522-E49C4F9826BB"), InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
  21.   public interface MyCom_Events
  22.   {
  23.   }


  24.   [Guid("2E3C7BAD-1051-4622-9C4C-215182C6BF58"), ClassInterface(ClassInterfaceType.None), ComSourceInterfaces(typeof(MyCom_Events))]
  25.   public class Class1 : MyCom_Interface
  26.   {
  27.     string stat = "name";
  28.     string roomname = "";
  29.     string roomdesc = "";
  30.     string exits = "";
  31.     string[] exit;
  32.     IDatabase conn = DatabaseFactory.Creator("mssql", "Password=xxxx;User ID=sa;Initial Catalog=xkx;Data Source=(local)");
  33.     string from = "";
  34.     string result = "";

  35.     public string send(string s)
  36.     {
  37.       s = s.Replace("\t", "").Trim();
  38.       if (s == "over")
  39.       {
  40.         //屏蔽季节和天气
  41.         if (roomdesc.IndexOf("「") > 0)
  42.         {
  43.           roomdesc = roomdesc.Substring(0, roomdesc.IndexOf("「")) + roomdesc.Substring(roomdesc.IndexOf("。", roomdesc.IndexOf("「")) + 1);
  44.         }

  45.         //起始房间,是否存在多个
  46.         if (from == "start")
  47.         {
  48.           string sql = string.Format("select * from room where name='{0}' and describe='{1}' and exits='{2}'", roomname, roomdesc, exits);
  49.           DataTable dt = conn.GetDataTable(sql);
  50.           if (dt.Rows.Count > 1)
  51.             return "该房间存在多个,不能开始";
  52.           if (dt.Rows.Count == 1)
  53.           {
  54.             return "目前房间是" + dt.Rows[0]["name"] + ",开始行走";
  55.           }
  56.           if (dt.Rows.Count == 0)
  57.           {
  58.             sql = string.Format("insert into room (name,describe,exits) values ('{0}','{1}','{2}')", roomname, roomdesc, exits);
  59.             conn.Execute(sql);
  60.             int roomid = int.Parse(conn.GetDataTable(string.Format("select id from room where name='{0}' and describe='{1}' and exits='{2}'", roomname, roomdesc, exits)).Rows[0][0].ToString());
  61.             for (int i = 0; i < exit.Length; i++)
  62.             {
  63.               sql = string.Format("insert into exit (exitname,atroomid) values ('{0}',{1})", exit[i], roomid);
  64.               conn.Execute(sql);
  65.             }
  66.           }
  67.         }

  68.         StreamWriter sw = new StreamWriter(@"d:\xkx.txt", true);
  69.         sw.WriteLine("name:" + roomname);
  70.         sw.WriteLine("desc:" + roomdesc);
  71.         sw.WriteLine("exits:" + exits);
  72.         sw.WriteLine("exitnum:" + exit.Length);
  73.         sw.WriteLine("--------------");
  74.         sw.Close();

  75.         //变量复位
  76.         stat = "name";
  77.         roomname = "";
  78.         roomdesc = "";
  79.         exits = "";

  80.         return result;
  81.       }
  82.       if (stat == "name")
  83.       {
  84.         if (s.IndexOf(" -") > 0)
  85.         {
  86.           roomname = s.Substring(0, s.IndexOf(" -"));
  87.           stat = "desc";
  88.         }
  89.       }
  90.       else
  91.       {
  92.         if (stat == "desc")
  93.         {
  94.           if (s.IndexOf("这里唯一的出口") < 0 && s.IndexOf("这里明显的出口是") < 0)
  95.           {
  96.             roomdesc += s;
  97.           }
  98.           else
  99.           {
  100.             stat = "exit";
  101.           }
  102.         }
  103.         if (stat == "exit")
  104.         {
  105.           if (s.IndexOf("这里唯一的出口") == 0)
  106.           {
  107.             exits = s.Substring(s.IndexOf(" "), s.IndexOf("。") - s.IndexOf(" ")).Trim();
  108.             exit = new string[] { exits };
  109.           }
  110.           if (s.IndexOf("这里明显的出口是") == 0)
  111.           {
  112.             exits = s.Substring(s.IndexOf(" "), s.IndexOf("和") - s.IndexOf(" ")).Trim().Replace("、", ",") + "," + s.Substring(s.IndexOf("和") + 1, s.IndexOf("。") - s.IndexOf("和")).Trim();
  113.             exit = exits.Split(',');
  114.           }
  115.           stat = "over";
  116.         }
  117.       }
  118.       return "";
  119.     }

  120.     public string gowhere(string s)
  121.     {
  122.       from = s;
  123.       return "";
  124.     }

  125.     private void print(string s)
  126.     {
  127.       StreamWriter sw = new StreamWriter(@"d:\xkx.txt", true);
  128.       sw.WriteLine(s);
  129.       sw.Close();
  130.     }
  131.   }
  132. }
复制代码
  1. CREATE TABLE [dbo].[Room](
  2.         [id] [int] IDENTITY(1,1) NOT NULL,
  3.         [name] [nvarchar](50) NOT NULL,
  4.         [describe] [nvarchar](500) NOT NULL,
  5.         [exits] [nvarchar](100) NOT NULL,
  6.         [memo] [nvarchar](200) NULL
  7. ) ON [PRIMARY]
  8. CREATE TABLE [dbo].[Exit](
  9.         [id] [int] IDENTITY(1,1) NOT NULL,
  10.         [exitname] [nvarchar](20) NOT NULL,
  11.         [atroomid] [int] NOT NULL,
  12.         [toroomid] [int] NULL
  13. ) ON [PRIMARY]
复制代码
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2013-9-24 20:06:41 | 显示全部楼层
快来看上帝
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2013-9-24 20:27:45 | 显示全部楼层
膜拜~~~~~~~~~~
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2013-9-24 20:39:16 | 显示全部楼层
看上去好牛的样子啊~~眼馋ing...
不过感觉没有正则,对字符串的判断似乎有些吃力。。。不知道是不是这样
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
 楼主| 发表于 2013-9-24 20:52:35 | 显示全部楼层
回复 4# hijacker


是。不过字符串处理不多,我懒得去看正则了。
才刚写了个开头,越写越多了
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|北大侠客行MUD ( 京ICP备16065414号-1 )

GMT+8, 2024-11-28 02:32 PM , Processed in 0.009488 second(s), 14 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表