浅水区 浅水区 关注:1205 内容:9732

xss系列(三)古怪的文字游戏

  • 查看作者
  • 打赏作者
  • 当前位置: 泰拉通讯枢纽 > 卡西米尔游泳池 > 浅水区 > 正文
    • 浅水区
    • ★★见习博士

      既然说了文字游戏很好玩,就弄一个生成器看看吧

      (总之一如既往,还是基于一个确定会修复的特性,且用且珍惜(感谢加精))


      这里是一个python的生成器:

      import json

      with open("./stroy.json",encoding="utf8") as file:
         stroy=json.load(file)

      output=""
      root="main"
      lst_node=[root]
      for node in lst_node:
         if node==root:
             disp=""
         else:
             disp="none"
         output+="""<div id="{0}" style="display:{1}">\n""".format(node,disp)
         output+=stroy[node]["main"]
         for cid,text in stroy[node]["select"].items():
             output+="""\n<div onclick="document.getElementById('{0}').style.display='none';document.getElementById('{1}').style.display='';"><blockquote>\n{2}\n</blockquote></div>""".format(node,cid,text)
             lst_node.append(cid)
         output+="""\n<div onclick="document.getElementById('{0}').style.display='none';document.getElementById('{1}').style.display='';"><blockquote>\n{2}\n</blockquote></div>""".format(node,root,"返回开头")
         output+="</div>"

      with open("output.txt",mode="w",encoding="utf8") as file:
         file.write(output)


      用法:

      在同级目录下写一个stroy.json文件,格式如下:

      {"本段故事id":{"main":"本段故事内容","select":{"分支跳转id":"分支描述文本"}}}

      (注意第一幕的id必须是main(也可以改python程序里的root变量的值))

      运行程序,就会生成一个output.txt的文本文件

      在网页端打开源代码模式(即点一下左上角的</>按钮),把文件里的内容复制到编辑栏里。

      hint:如果没有装python,可以考虑找一个python3的在线运行网站,记得把输入输出的部分做相应修改


      示例:

      stroy.json

      {
         "main":{
             "main":"开头部分内容",
             "select":{
                 "scene1":"第一部分",
                 "scene2":"第二部分",
                 "ending1":"结局1"
             }
         },
         "scene1":{
             "main":"第一部分内容",
             "select":{
                 "scene2":"第二部分",
                 "ending2":"结局2"
             }
         },
         "scene2":{
             "main":"第二部分内容",
             "select":{
                 "ending3":"结局3"
             }
         },
         "ending1":{
             "main":"结局1内容",
             "select":{}
         },
         "ending2":{
             "main":"结局2内容",
             "select":{}
         },
         "ending3":{
             "main":"结局3内容",
             "select":{}
         }
      }    

      呈现结果:

      开头部分内容

      第一部分

      第二部分

      结局1

      返回开头

      游泳教练
      ★★★实习博士

      dalao太强了,帮你申请加精了 [s-15]

      回复
      ★注册博士
      我迅速进行一个藏的收
      回复
      ★★见习博士
      随行者
      太强了,
      以前很喜欢读这类纸质的文字冒险
      回复
      ★★★★★博士

      收藏了!赶快去试一试.jpg(学废了

    • Maximr(别忘了网页版&源码模式(以及发布前可以按预览(一个眼睛的图标)看看效果))
      举报 拉黑 3年前电脑端回复
    • e3asd @Maximr 好耶!感谢dalao分享
      举报 拉黑 3年前电脑端回复
    • 回复
      ★★见习博士
      收藏收藏
      回复
      博士苏醒中...
      […] 程序小白无聊在学习 xss系列(三)古怪的文字游戏 这篇文字游戏的代码时,顺便摸了一小段冬将军的端午奇遇(X) […]
      回复
      ★注册博士
      const ROOT_NAME = "main"
      const BACKTO_ROOT = "返回开头"
      
      type Story =
          Record<string, {
              main: string
              select: Record<string, string>
          }>
      
      const generate = (node: string, cid: string, text: string) =>
          `<div onclick="document.getElementById('${node}').style.display='none';document.getElementById('${cid}').style.display='';"><blockquote>\n${text}\n</blockquote></div>`
      
      const main = (story: Story): string => {
          const output: string[] = []
          const nodes: string[] = [ROOT_NAME]
          for (const node in nodes) {
              output.push(`<div id="${node}" style="display:${node === ROOT_NAME ? "" : "none"}">\n`)
              output.push(story[node].main)
              for (const [cid, text] of Object.entries(story[node].select)) {
                  output.push(generate(node, cid, text))
                  nodes.push(cid)
              }
              output.push(generate(node, ROOT_NAME, BACKTO_ROOT))
              output.push(`</div>`)
          }
          return output.join('')
      }
      
      Deno.writeTextFileSync(
          "output.txt",
          main(JSON.parse(Deno.readTextFileSync("./stroy.json")))
      )

      直译()我再想想怎么优化

      说不定之后会成为功能()

    • 进栈检票其实可以用模板引擎的()
      举报 拉黑 3年前电脑端回复
    • Maximr好耶
      举报 拉黑 3年前电脑端回复
    • 进栈检票草手滑,应该用of而不是in(就你es6一家用of其他全是in不手滑才怪呢 以及这个循环怎么看怎么出大问题()
      举报 拉黑 3年前电脑端回复
    • 回复
      博士苏醒中...
      […] 准备好story.json,具体格式看昨天的xss系列(三)古怪的文字游戏 […]
      回复

      请登录之后再进行评论

      登录
    • 发表内容
    • 做任务
    • 到底部