设为首页收藏本站喵玉殿官方微博

 找回密码
 少女注册中
搜索
查看: 4826|回复: 4

[提问其他] 有代码一百行,求简化

[复制链接]
发表于 2015-7-10 15:40:03 | 显示全部楼层 |阅读模式
Main.rar (722 Bytes, 下载次数: 495)

代码在上面,这个程序的目的是识别储存于文件中的命令并作出反应。
如你所见,这上面的代码实在有些臃肿,所用的方法简直可以用小儿科来形容。
我希望能用一种更简洁且执行效率更高的写法取代原来的代码,最好还能够放宽原有的限制条件(如“实际数值不管有多少位,始终只能占特定字符数,其他位没有就拿空格堆”这一问题)。

(我找到的这都什么破资料…)
发表于 2015-7-10 18:34:25 | 显示全部楼层
本帖最后由 drzzm32 于 2015-7-10 18:36 编辑

额其实。。。字符串处理用.NET更方便呢。。。虽然我也不清楚你的定义是怎样的。。。
看看我的吧,从VB.NET翻译到C#的
  1. public static Scene[] LoadScript(string Path)
  2. {
  3.         Scene[] Scenes;
  4.         int SceneIndexTmp;
  5.         int CGIndexTmp;
  6.         int ChoiceAutoIndexTmp;
  7.         string FullPath = Environment.CurrentDirectory + "\" + Path;
  8.         IO.StreamReader Reader;
  9.         try {
  10.                 Reader = new IO.StreamReader(FullPath);
  11.         } catch (Exception ex) {
  12.                 Message MsgBox = new Message();
  13.                 MsgBox.MsgShow("Error", "Config file contains error.");
  14.                 MsgBox.Close();
  15.                 return null;
  16.         }

  17.         string[] TmpString;
  18.         int TmpHead;
  19.          // ERROR: Not supported in C#: ReDimStatement


  20.         while (!Reader.EndOfStream) {
  21.                 TmpString = Reader.ReadLine.Split({
  22.                         Convert.ToChar(Space(1)),
  23.                         Convert.ToChar(vbCr),
  24.                         Convert.ToChar(vbTab)
  25.                 });
  26.                 TmpHead = 0;
  27.                 try {
  28.                         while (TmpString(TmpHead) == "") {
  29.                                 TmpHead += 1;
  30.                         }
  31.                 } catch (Exception ex) {
  32.                         goto Bottom;
  33.                 }

  34.                 switch (TmpString(TmpHead)) {
  35.                         case "开始定义场景":
  36.                         case "defsc":
  37.                         case "def.scene":
  38.                                 SceneIndexTmp = Convert.ToInt32(TmpString(TmpHead + 1));
  39.                                 Scenes(SceneIndexTmp) = new Scene();
  40.                                 Scenes(SceneIndexTmp).SceneIndex = SceneIndexTmp;
  41.                                 break;
  42.                         case "结束定义场景":
  43.                         case "endsc":
  44.                         case "end.scene":
  45.                                 SceneIndexTmp = -1;
  46.                                 break;
  47.                         case "背景":
  48.                         case "backg":
  49.                         case "set.back":
  50.                                 Scenes(SceneIndexTmp).BG.Path = TmpString(TmpHead + 1);
  51.                                 Scenes(SceneIndexTmp).BG.Index = SceneIndexTmp;
  52.                                 break;
  53.                         case "音乐":
  54.                         case "music":
  55.                         case "set.bgm":
  56.                                 Scenes(SceneIndexTmp).BGM.Path = TmpString(TmpHead + 1);
  57.                                 break;
  58.                         case "开始定义立绘":
  59.                         case "defcg":
  60.                         case "def.cg":
  61.                                 CGIndexTmp = Convert.ToInt32(TmpString(TmpHead + 1));
  62.                                 Scenes(SceneIndexTmp).CG(CGIndexTmp).IMG.Index = CGIndexTmp;
  63.                                 break;
  64.                         case "结束定义立绘":
  65.                         case "endcg":
  66.                         case "end.cg":
  67.                                 CGIndexTmp = -1;
  68.                                 break;
  69.                         case "立绘地址":
  70.                         case "cgloc":
  71.                         case "set.path":
  72.                                 Scenes(SceneIndexTmp).CG(CGIndexTmp).IMG.Path = TmpString(TmpHead + 1);
  73.                                 break;
  74.                         case "立绘位置":
  75.                         case "cgpos":
  76.                         case "set.pos":
  77.                                 Scenes(SceneIndexTmp).CG(CGIndexTmp).Location = Convert.ToSingle(TmpString(TmpHead + 1));
  78.                                 break;
  79.                         case "开始定义文字":
  80.                         case "defwd":
  81.                         case "def.word":
  82.                                 ChoiceAutoIndexTmp = 0;
  83.                                 switch (TmpString(TmpHead + 1)) {
  84.                                         case "对话":
  85.                                         case "comm":
  86.                                         case "type.comm":
  87.                                                 Scenes(SceneIndexTmp).WordType = WordType.Comment;
  88.                                                 break;
  89.                                         case "读档":
  90.                                         case "read":
  91.                                         case "type.read":
  92.                                                 Scenes(SceneIndexTmp).WordType = WordType.Loading;
  93.                                                 break;
  94.                                         case "存档":
  95.                                         case "save":
  96.                                         case "type.save":
  97.                                                 Scenes(SceneIndexTmp).WordType = WordType.Saving;
  98.                                                 break;
  99.                                         case "旁白":
  100.                                         case "scpt":
  101.                                         case "type.script":
  102.                                                 Scenes(SceneIndexTmp).WordType = WordType.Script;
  103.                                                 break;
  104.                                         case "标题":
  105.                                         case "titl":
  106.                                         case "type.title":
  107.                                                 Scenes(SceneIndexTmp).WordType = WordType.Title;
  108.                                                 break;
  109.                                         case "启动":
  110.                                         case "stup":
  111.                                         case "type.start":
  112.                                                 Scenes(SceneIndexTmp).WordType = WordType.GameRun;
  113.                                                 break;
  114.                                 }
  115.                                 break;
  116.                         case "选择":
  117.                         case "cword":
  118.                         case "set.word":
  119.                                 for (i = TmpHead + 1; i <= TmpString.Length - 1; i++) {
  120.                                         if (i < TmpString.Length - 1) {
  121.                                                 Scenes(SceneIndexTmp).Choices(ChoiceAutoIndexTmp).Context += TmpString(i) + " ";
  122.                                         } else {
  123.                                                 Scenes(SceneIndexTmp).Choices(ChoiceAutoIndexTmp).Context += TmpString(i);
  124.                                         }
  125.                                 }

  126.                                 break;
  127.                         case "跳转":
  128.                         case "jmpto":
  129.                         case "set.jump":
  130.                                 Scenes(SceneIndexTmp).Choices(ChoiceAutoIndexTmp).JumpSceneIndex = Convert.ToInt32(TmpString(TmpHead + 1));
  131.                                 ChoiceAutoIndexTmp = ChoiceAutoIndexTmp + 1;
  132.                                 break;
  133.                         case "结束定义文字":
  134.                         case "endwd":
  135.                         case "end.word":
  136.                                 ChoiceAutoIndexTmp = -1;
  137.                                 break;
  138.                 }
  139.                 Bottom:

  140.         }

  141.         Reader.Dispose();
  142.         return Scenes;
  143. }
复制代码

核心是String.Split,按指定分隔符切分字符串。如果真做还要去学习编译原理(
回复

使用道具 举报

发表于 2015-7-10 19:35:03 | 显示全部楼层
本帖最后由 漆黑之翼 于 2015-7-10 20:04 编辑

我记得ifstream跟cin一样可以直接读成对应类型的啊,何必搞这么麻烦呢
回复

使用道具 举报

发表于 2015-7-13 11:48:59 | 显示全部楼层
我觉得还好...特别是在文件内容格式没有明显规律的情况下
如果要优化,那就是建立诸如读到空格即跳过,非空格则处理的策略了
另外不识别的指令直接用getline跳过去就好了,没必要一个个去偏移...
回复

使用道具 举报

发表于 2015-7-19 11:40:10 来自手机 | 显示全部楼层
提示: 该帖被管理员或版主屏蔽
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 少女注册中

本版积分规则

合作与事务联系|无图版|手机版|小黑屋|喵玉殿

GMT+8, 2025-10-31 03:34

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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