简介

这个游戏的目的是要玩家通过尽可能多的楼层,并且最多只能操作1000次。

算法

地图生成算法

魔塔的每一层都是q×w的矩阵(q、w为介于3至20的整数,每层的各房间的q、w相同,不同层的q、w不一定相同),随机生成墙壁、门、怪物(成长期、成熟期、完全体、究极体)、钥匙、伤药、食物、武器、护具。同时,会在矩阵四个顶点的上方或者下方随机生成去其他层的楼梯,玩家也由某个通道进入矩阵。

物体 生成几率 符号 描述
楼梯 - <> 通往下一楼层
通道 - [x] 通往同一楼层的其他房间
空地 0.34 . 可以通过的空地
墙壁 0.34 # 无法通过的障碍物
0.07 + 消耗1把钥匙即可打开并保持畅通,否则无法通过
钥匙 0.04 1 打开门的道具,消耗品
成长期怪物 0.10 n
成熟期怪物 0.04 m
完全体怪物 0.02 M
究极体怪物 0.01 G
伤药 0.01 C 恢复体力
食物 0.01 F 增强体力10点
武器 0.01 W 增加攻击2点
护具 0.01 H 增加放御1点

生成算法可以尝试Conway’s Game of Life

怪物死亡时候有几率掉落物品,掉落几率与生成几率相同。

攻防死亡算法

玩家与怪物具有体力、攻击、防御等属性值,体力为零时会休克死亡。真正攻击的公式为

真正防御力的公式为

若真正攻击小于真正防御,则不造成伤害,否则产生被攻击者体力的下降。

下表列出了玩家与各种怪物初始时的体力、攻击、防御值。

生物 体力 攻击 防御 符号
玩家 100(上限120) 15 10 @
成长期怪物 10 10 8 n
成熟期怪物 20 12 12 m
完全体怪物 40 15 18 M
究极体怪物 50 22 24 G

代码(使用R-3.4.4

地图生成代码

使用R语言生成地图,定义一个生成函数SC(q,w)能够在创建地图时返回所有位置的物品的符号。并且定义一个数组ditu[“x”,”y”]存放坐标(“x”,”y”)下物体的符号。

#  R version 3.4.4
#  dim function SC()
SC<-function(q=10,w=10){
  a=runif(q*w,min=0,max=1)
  a[0.00<a & a<=0.34]="."
  a[0.34<a & a<=0.68]="# "
  a[0.68<a & a<=0.75]="+"
  a[0.75<a & a<=0.79]="-"
  a[0.79<a & a<=0.89]="n"
  a[0.89<a & a<=0.93]="m"
  a[0.93<a & a<=0.95]="M"
  a[0.95<a & a<=0.96]="G"
  a[0.96<a & a<=0.97]="C"
  a[0.97<a & a<=0.98]="F"
  a[0.98<a & a<=0.99]="W"
  a[0.99<a & a<=1.00]="H"
  a[a=="-"]="1"
  a[1]="@"
  array(a,dim=c(q,w))
}
ditu=SC(q,w)

将ditu用plot表示

创建pt(q,w,ditu),将如上生成的地图数据绘制

#  dim pt(q,w,ditu) to draw maps
pt<-function(q=10,w=10,ditu=SC(q,w)){
  plot(c(0,0,2,2,w*2-2,w*2-2,w*2,w*2,w*2-2,w*2-2,2,2,0),c(-2,q*2+2,q*2+2,q*2,q*2,q*2+2,q*2+2,-2,-2,0,0,-2,-2),type ="l",xlim=c(0,2*w),ylim=c(-2,2*q+2),xlab="The magic tower",ylab="",bty="n",xaxt="n",yaxt="n",xaxs="i",yaxs="i")
  grid(nx=w,ny=q+2)
  text(1,2*q+1,"[x]")
  text(c(1,2*w-1,2*w-1),c(-1,-1,2*q+1),"<>")
  b=rep(seq(2*q-1,1,-2),w)
  a=rep(seq(1,2*w-1,2),each=q)
  text(a,b,ditu)
}

对战代码

定义怪物地图mditu记录怪物体力值。

mditu=ditu
mditu[ditu=="n"]<-"10"
mditu[ditu=="m"]<-"20"
mditu[ditu=="M"]<-"40"
mditu[ditu=="G"]<-"50"

定义fight(),输出玩家与怪物对战后双方的体力。

#  fight()直接定义成function(){}就好了,不比传入参数,因为fight()使用的参数都是全局使用的。
fight<-function(mon=data.frame(type=ditu[rw$x,rw$y],life=as.numeric(mditu[rw$x,rw$y]))){
  if(mon$type=="n") mon=cbind(mon,lli=10,att=10,def=8) else
    if(mon$type=="m") mon=cbind(mon,lli=20,att=12,def=12) else
      if(mon$type=="M") mon=cbind(mon,lli=40,att=15,def=18) else
        if(mon$type=="G") mon=cbind(mon,lli=50,att=22,def=24)
        att=rw$life/100*rw$att
        def=mon$life/mon$lli*mon$def
        if(att>def){
          d=att-def
          mon$life=mon$life-d
          if(mon$life<=0){
            cat("Monster is defeated. \n")
            cat("Player: Life:",rw$life,"Attack:",rw$att,"Defence:",rw$def,"Key:",rw$key,"\n")
            return("y")
          } else{
            cat("Monster: Life:",mon$life,"Attack:",mon$att,"Defence:",mon$def,"\n")
          }
        }
        if(att<=def){
          cat("No use.\n")
          cat("Monster: Life:",mon$life,"Attack:",mon$att,"Defence:",mon$def,"\n")
        }
        att=mon$life/mon$lli*mon$att
        def=rw$life/100*rw$def
        if(att>def){
          d=att-def
          rw$life=rw$life-d
          if(rw$life<=0) cat("Player lose.\n") else{
            cat("Player: Life:",rw$life,"Attack:",rw$att,"Defence:",rw$def,"Key:",rw$key,"\n")
          }
        } else cat("Miss.\n")
        return(c(mon$life,rw$life))
}

人物(@)行动代码

用数据框rw(x,y,key,f,life,att,def)记录人物的位置(x,y)(非plot上的坐标)、钥匙数(key)、楼层(f)、体力(life)、攻击(att)、防御(def)。

rw=data.frame(x=1,y=1,key=0,f=1,life=100,att=15,def=10)

用readline()传入键盘动作。

for(i in 1:1000){
  readline("Please input your action:")->a
  if(a=="w" || a=="W"){
    rw$x=rw$x-1
    if(rw$x==0 && rw$y==1){
      ditu=SC(q,w)
      mditu=ditu
      mditu[ditu=="n"]<-"10"
      mditu[ditu=="m"]<-"20"
      mditu[ditu=="M"]<-"40"
      mditu[ditu=="G"]<-"50"
      pt(q=q,w=w,ditu=ditu)
      rw$x=1
      rw$y=1
    } else
      if(rw$x==0 && rw$y==w){
        q=floor(runif(1,min=3,max=21))
        w=floor(runif(1,min=3,max=21))
        ditu=SC(q,w)
        mditu=ditu
        mditu[ditu=="n"]<-"10"
        mditu[ditu=="m"]<-"20"
        mditu[ditu=="M"]<-"40"
        mditu[ditu=="G"]<-"50"
        pt(q=q,w=w,ditu=ditu)
        rw$x=1
        rw$y=1
        rw$f=rw$f+1
      } else
        if(rw$x<=0) rw$x=rw$x+1 else{
          if(ditu[rw$x,rw$y]=="."){
            ditu[rw$x,rw$y]="@"
            ditu[rw$x+1,rw$y]="."
          }
            if(ditu[rw$x,rw$y]=="# ") rw$x=rw$x+1
              if(ditu[rw$x,rw$y]=="+"){
                if(rw$key<=0){rw$x=rw$x+1
                cat("No key.\n")
                } else{
                  rw$key=rw$key-1
                  cat("Player: Life:",rw$life,"Attack:",rw$att,"Defence:",rw$def,"Key:",rw$key,"\n")
                  ditu[rw$x,rw$y]="@"
                  ditu[rw$x+1,rw$y]="."
                }
              }
                if(ditu[rw$x,rw$y]=="1"){
                  rw$key=rw$key+1
                  ditu[rw$x,rw$y]="@"
                  ditu[rw$x+1,rw$y]="."
                }
                  if(ditu[rw$x,rw$y]=="C"){
                    if(rw$life<100) rw$life=100
                    cat("Player: Life:",rw$life,"Attack:",rw$att,"Defence:",rw$def,"Key:",rw$key,"\n")
                    ditu[rw$x,rw$y]="@"
                    ditu[rw$x+1,rw$y]="."
                  }
                    if(ditu[rw$x,rw$y]=="F"){
                      rw$life=rw$life+10
                      if(rw$life>120) rw$life=120
                      cat("Player: Life:",rw$life,"Attack:",rw$att,"Defence:",rw$def,"Key:",rw$key,"\n")
                      ditu[rw$x,rw$y]="@"
                      ditu[rw$x+1,rw$y]="."
                    }
                      if(ditu[rw$x,rw$y]=="W"){
                        rw$att=rw$att+2
                        cat("Player: Life:",rw$life,"Attack:",rw$att,"Defence:",rw$def,"Key:",rw$key,"\n")
                        ditu[rw$x,rw$y]="@"
                        ditu[rw$x+1,rw$y]="."
                      }
                        if(ditu[rw$x,rw$y]=="H"){
                          rw$def=rw$def+1
                          cat("Player: Life:",rw$life,"Attack:",rw$att,"Defence:",rw$def,"Key:",rw$key,"\n")
                          ditu[rw$x,rw$y]="@"
                          ditu[rw$x+1,rw$y]="."
                        }
                          if(ditu[rw$x,rw$y]=="n" || ditu[rw$x,rw$y]=="m" || ditu[rw$x,rw$y]=="M" || ditu[rw$x,rw$y]=="G"){
                            fight()->f
                            if(f[1]=="y"){
                              ditu[rw$x,rw$y]="@"
                              ditu[rw$x+1,rw$y]="."
                            } else{
                              if(f[2]<=0) break;
                              mditu[rw$x,rw$y]=f[1]
                              rw$life=f[2]
                              rw$x=rw$x+1
                            }
                          }
            }
  }
  # ===
  if(a=="s" || a=="S"){
    rw$x=rw$x+1
    if(rw$x>q && rw$y==1){
      q=floor(runif(1,min=3,max=21))
      w=floor(runif(1,min=3,max=21))
      ditu=SC(q,w)
      mditu=ditu
      mditu[ditu=="n"]<-"10"
      mditu[ditu=="m"]<-"20"
      mditu[ditu=="M"]<-"40"
      mditu[ditu=="G"]<-"50"
      pt(q=q,w=w,ditu=ditu)
      rw$x=1
      rw$y=1
      rw$f=rw$f+1
    }
      if(rw$x>q && rw$y==w){
        q=floor(runif(1,min=3,max=21))
        w=floor(runif(1,min=3,max=21))
        ditu=SC(q,w)
        mditu=ditu
        mditu[ditu=="n"]<-"10"
        mditu[ditu=="m"]<-"20"
        mditu[ditu=="M"]<-"40"
        mditu[ditu=="G"]<-"50"
        pt(q=q,w=w,ditu=ditu)
        rw$x=1
        rw$y=1
        rw$f=rw$f+1
      }
        if(rw$x>q) rw$x=rw$x-1 else{
          if(ditu[rw$x,rw$y]=="."){
            ditu[rw$x,rw$y]="@"
            ditu[rw$x-1,rw$y]="."
          }
            if(ditu[rw$x,rw$y]=="# ") rw$x=rw$x-1
              if(ditu[rw$x,rw$y]=="+"){
                if(rw$key<=0){rw$x=rw$x-1
                cat("No key.\n")
                } else{
                  rw$key=rw$key-1
                  cat("Player: Life:",rw$life,"Attack:",rw$att,"Defence:",rw$def,"Key:",rw$key,"\n")
                  ditu[rw$x,rw$y]="@"
                  ditu[rw$x-1,rw$y]="."
                }
              }
                if(ditu[rw$x,rw$y]=="1"){
                  rw$key=rw$key+1
                  cat("Player: Life:",rw$life,"Attack:",rw$att,"Defence:",rw$def,"Key:",rw$key,"\n")
                  ditu[rw$x,rw$y]="@"
                  ditu[rw$x-1,rw$y]="."
                }
                  if(ditu[rw$x,rw$y]=="C"){
                    if(rw$life<100) rw$life=100
                    cat("Player: Life:",rw$life,"Attack:",rw$att,"Defence:",rw$def,"Key:",rw$key,"\n")
                    ditu[rw$x,rw$y]="@"
                    ditu[rw$x-1,rw$y]="."
                  }
                    if(ditu[rw$x,rw$y]=="F"){
                      rw$life=rw$life+10
                      if(rw$life>120) rw$life=120
                      cat("Player: Life:",rw$life,"Attack:",rw$att,"Defence:",rw$def,"Key:",rw$key,"\n")
                      ditu[rw$x,rw$y]="@"
                      ditu[rw$x-1,rw$y]="."
                    }
                      if(ditu[rw$x,rw$y]=="W"){
                        rw$att=rw$att+2
                        cat("Player: Life:",rw$life,"Attack:",rw$att,"Defence:",rw$def,"Key:",rw$key,"\n")
                        ditu[rw$x,rw$y]="@"
                        ditu[rw$x-1,rw$y]="."
                      }
                        if(ditu[rw$x,rw$y]=="H"){
                          rw$def=rw$def+1
                          cat("Player: Life:",rw$life,"Attack:",rw$att,"Defence:",rw$def,"Key:",rw$key,"\n")
                          ditu[rw$x,rw$y]="@"
                          ditu[rw$x-1,rw$y]="."
                        }
                          if(ditu[rw$x,rw$y]=="n" || ditu[rw$x,rw$y]=="m" || ditu[rw$x,rw$y]=="M" || ditu[rw$x,rw$y]=="G"){
                            fight()->f
                            if(f[1]=="y"){
                              ditu[rw$x,rw$y]="@"
                              ditu[rw$x-1,rw$y]="."
                            } else{
                              if(f[2]<=0) break;
                              mditu[rw$x,rw$y]=f[1]
                              rw$life=f[2]
                              rw$x=rw$x-1
                            }
                          }
            }
  }
  # ===
  if(a=="a" || a=="A"){
    rw$y=rw$y-1
    if(rw$y<=0) rw$y=rw$y+1 else{
      if(ditu[rw$x,rw$y]=="."){
        ditu[rw$x,rw$y]="@"
        ditu[rw$x,rw$y+1]="."
      }
        if(ditu[rw$x,rw$y]=="# ") rw$y=rw$y+1 else
          if(ditu[rw$x,rw$y]=="+"){
            if(rw$key<=0){rw$y=rw$y+1
            cat("No key.\n")
            } else{
              rw$key=rw$key-1
              cat("Player: Life:",rw$life,"Attack:",rw$att,"Defence:",rw$def,"Key:",rw$key,"\n")
              ditu[rw$x,rw$y]="@"
              ditu[rw$x,rw$y+1]="."
            }
          }
            if(ditu[rw$x,rw$y]=="1"){
              rw$key=rw$key+1
              cat("Player: Life:",rw$life,"Attack:",rw$att,"Defence:",rw$def,"Key:",rw$key,"\n")
              ditu[rw$x,rw$y]="@"
              ditu[rw$x,rw$y+1]="."
            }
              if(ditu[rw$x,rw$y]=="C"){
                if(rw$life<100) rw$life=100
                cat("Player: Life:",rw$life,"Attack",rw$att,"Defence",rw$def,"Key",rw$key,"\n")
                ditu[rw$x,rw$y]="@"
                ditu[rw$x,rw$y+1]="."
              }
                if(ditu[rw$x,rw$y]=="F"){
                  rw$life=rw$life+10
                  if(rw$life>120) rw$life=120
                  cat("Player: Life:",rw$life,"Attack:",rw$att,"Defence:",rw$def,"Key:",rw$key,"\n")
                  ditu[rw$x,rw$y]="@"
                  ditu[rw$x,rw$y+1]="."
                }
                  if(ditu[rw$x,rw$y]=="W"){
                    rw$att=rw$att+2
                    cat("Player: Life:",rw$life,"Attack:",rw$att,"Defence:",rw$def,"Key:",rw$key,"\n")
                    ditu[rw$x,rw$y]="@"
                    ditu[rw$x,rw$y+1]="."
                  }
                    if(ditu[rw$x,rw$y]=="H"){
                      rw$def=rw$def+1
                      cat("Player: Life:",rw$life,"Attack:",rw$att,"Defence:",rw$def,"Key:",rw$key,"\n")
                      ditu[rw$x,rw$y]="@"
                      ditu[rw$x,rw$y+1]="."
                    }
                      if(ditu[rw$x,rw$y]=="n" || ditu[rw$x,rw$y]=="m" || ditu[rw$x,rw$y]=="M" || ditu[rw$x,rw$y]=="G"){
                        fight()->f
                        if(f[1]=="y"){
                          ditu[rw$x,rw$y]="@"
                          ditu[rw$x,rw$y+1]="."
                        } else{
                          if(f[2]<=0) break;
                          mditu[rw$x,rw$y]=f[1]
                          rw$life=f[2]
                          rw$y=rw$y+1
                        }
                      }
    }
  }
  # ===
  if(a=="d" || a=="D"){
    rw$y=rw$y+1
    if(rw$y>w) rw$y=rw$y-1 else{
      if(ditu[rw$x,rw$y]=="."){
        ditu[rw$x,rw$y]="@"
        ditu[rw$x,rw$y-1]="."
      }
        if(ditu[rw$x,rw$y]=="# ") rw$y=rw$y-1
          if(ditu[rw$x,rw$y]=="+"){
            if(rw$key<=0){rw$y=rw$y-1
            cat("No key.\n")
            } else{
              rw$key=rw$key-1
              cat("Player: Life:",rw$life,"Attack:",rw$att,"Defence:",rw$def,"Key:",rw$key,"\n")
              ditu[rw$x,rw$y]="@"
              ditu[rw$x,rw$y-1]="."
            }
          }
            if(ditu[rw$x,rw$y]=="1"){
              rw$key=rw$key+1
              cat("Player: Life:",rw$life,"Attack:",rw$att,"Defence:",rw$def,"Key:",rw$key,"\n")
              ditu[rw$x,rw$y]="@"
              ditu[rw$x,rw$y-1]="."
            }
              if(ditu[rw$x,rw$y]=="C"){
                if(rw$life<100) rw$life=100
                cat("Player: Life:",rw$life,"Attack:",rw$att,"Defence:",rw$def,"Key:",rw$key,"\n")
                ditu[rw$x,rw$y]="@"
                ditu[rw$x,rw$y-1]="."
              }
                if(ditu[rw$x,rw$y]=="F"){
                  rw$life=rw$life+10
                  if(rw$life>120) rw$life=120
                  cat("Player: Life:",rw$life,"Attack:",rw$att,"Defence:",rw$def,"Key:",rw$key,"\n")
                  ditu[rw$x,rw$y]="@"
                  ditu[rw$x,rw$y-1]="."
                }
                  if(ditu[rw$x,rw$y]=="W"){
                    rw$att=rw$att+2
                    cat("Player: Life:",rw$life,"Attack:",rw$att,"Defence:",rw$def,"Key:",rw$key,"\n")
                    ditu[rw$x,rw$y]="@"
                    ditu[rw$x,rw$y-1]="."
                  }
                    if(ditu[rw$x,rw$y]=="H"){
                      rw$def=rw$def+1
                      cat("Player: Life:",rw$life,"Attack",rw$att,"Defence",rw$def,"Key",rw$key,"\n")
                      ditu[rw$x,rw$y]="@"
                      ditu[rw$x,rw$y-1]="."
                    }
                      if(ditu[rw$x,rw$y]=="n" || ditu[rw$x,rw$y]=="m" || ditu[rw$x,rw$y]=="M" || ditu[rw$x,rw$y]=="G"){
                        fight()->f
                        if(f[1]=="y"){
                          ditu[rw$x,rw$y]="@"
                          ditu[rw$x,rw$y-1]="."
                        } else{
                          if(f[2]<=0) break;
                          mditu[rw$x,rw$y]=f[1]
                          rw$life=f[2]
                          rw$y=rw$y-1
                        }
                      }
    }
  }
  pt(q,w,ditu)
}
cat("Player has explored ",rw$f," floors.\n")
cat("The END.\n")

总体运行代码

#  R version 3.4.4
q=12
w=12
SC<-function(q=10,w=10){
  a=runif(q*w,min=0,max=1)
  a[0.00<a & a<=0.34]="."
  a[0.34<a & a<=0.68]="# "
  a[0.68<a & a<=0.75]="+"
  a[0.75<a & a<=0.79]="-"
  a[0.79<a & a<=0.89]="n"
  a[0.89<a & a<=0.93]="m"
  a[0.93<a & a<=0.95]="M"
  a[0.95<a & a<=0.96]="G"
  a[0.96<a & a<=0.97]="C"
  a[0.97<a & a<=0.98]="F"
  a[0.98<a & a<=0.99]="W"
  a[0.99<a & a<=1.00]="H"
  a[a=="-"]="1"
  a[1]="@"
  array(a,dim=c(q,w))
}
ditu=SC(q,w)
mditu=ditu
mditu[ditu=="n"]<-"10"
mditu[ditu=="m"]<-"20"
mditu[ditu=="M"]<-"40"
mditu[ditu=="G"]<-"50"
pt<-function(q=10,w=10,ditu=SC(q,w)){
  plot(c(0,0,2,2,w*2-2,w*2-2,w*2,w*2,w*2-2,w*2-2,2,2,0),c(-2,q*2+2,q*2+2,q*2,q*2,q*2+2,q*2+2,-2,-2,0,0,-2,-2),type ="l",xlim=c(0,2*w),ylim=c(-2,2*q+2),xlab="The magic tower",ylab="",bty="n",xaxt="n",yaxt="n",xaxs="i",yaxs="i")
  grid(nx=w,ny=q+2)
  text(1,2*q+1,"[x]")
  text(c(1,2*w-1,2*w-1),c(-1,-1,2*q+1),"<>")
  b=rep(seq(2*q-1,1,-2),w)
  a=rep(seq(1,2*w-1,2),each=q)
  text(a,b,ditu)
}
fight<-function(mon=data.frame(type=ditu[rw$x,rw$y],life=as.numeric(mditu[rw$x,rw$y]))){
  if(mon$type=="n") mon=cbind(mon,lli=10,att=10,def=8) else
    if(mon$type=="m") mon=cbind(mon,lli=20,att=12,def=12) else
      if(mon$type=="M") mon=cbind(mon,lli=40,att=15,def=18) else
        if(mon$type=="G") mon=cbind(mon,lli=50,att=22,def=24)
        att=rw$life/100*rw$att
        def=mon$life/mon$lli*mon$def
        if(att>def){
          d=att-def
          mon$life=mon$life-d
          if(mon$life<=0){
            cat("Monster is defeated. \n")
            cat("Player: Life:",rw$life,"Attack:",rw$att,"Defence:",rw$def,"Key:",rw$key,"\n")
            return("y")
          } else{
            cat("Monster: Life:",mon$life,"Attack:",mon$att,"Defence:",mon$def,"\n")
          }
        }
        if(att<=def){
          cat("No use.\n")
          cat("Monster: Life:",mon$life,"Attack:",mon$att,"Defence:",mon$def,"\n")
        }
        att=mon$life/mon$lli*mon$att
        def=rw$life/100*rw$def
        if(att>def){
          d=att-def
          rw$life=rw$life-d
          if(rw$life<=0) cat("Player lose.\n") else{
            cat("Player: Life:",rw$life,"Attack:",rw$att,"Defence:",rw$def,"Key:",rw$key,"\n")
          }
        } else cat("Miss.\n")
        return(c(mon$life,rw$life))
}
rw=data.frame(x=1,y=1,key=0,f=1,life=100,att=15,def=10)
pt(q,w,ditu)
for(i in 1:1000){
  readline("Please input your action:")->a
  if(a=="w" || a=="W"){
    rw$x=rw$x-1
    if(rw$x==0 && rw$y==1){
      ditu=SC(q,w)
      mditu=ditu
      mditu[ditu=="n"]<-"10"
      mditu[ditu=="m"]<-"20"
      mditu[ditu=="M"]<-"40"
      mditu[ditu=="G"]<-"50"
      pt(q=q,w=w,ditu=ditu)
      rw$x=1
      rw$y=1
    } else
      if(rw$x==0 && rw$y==w){
        q=floor(runif(1,min=3,max=21))
        w=floor(runif(1,min=3,max=21))
        ditu=SC(q,w)
        mditu=ditu
        mditu[ditu=="n"]<-"10"
        mditu[ditu=="m"]<-"20"
        mditu[ditu=="M"]<-"40"
        mditu[ditu=="G"]<-"50"
        pt(q=q,w=w,ditu=ditu)
        rw$x=1
        rw$y=1
        rw$f=rw$f+1
      } else
        if(rw$x<=0) rw$x=rw$x+1 else{
          if(ditu[rw$x,rw$y]=="."){
            ditu[rw$x,rw$y]="@"
            ditu[rw$x+1,rw$y]="."
          }
            if(ditu[rw$x,rw$y]=="# ") rw$x=rw$x+1
              if(ditu[rw$x,rw$y]=="+"){
                if(rw$key<=0){rw$x=rw$x+1
                cat("No key.\n")
                } else{
                  rw$key=rw$key-1
                  cat("Player: Life:",rw$life,"Attack:",rw$att,"Defence:",rw$def,"Key:",rw$key,"\n")
                  ditu[rw$x,rw$y]="@"
                  ditu[rw$x+1,rw$y]="."
                }
              }
                if(ditu[rw$x,rw$y]=="1"){
                  rw$key=rw$key+1
                  ditu[rw$x,rw$y]="@"
                  ditu[rw$x+1,rw$y]="."
                }
                  if(ditu[rw$x,rw$y]=="C"){
                    if(rw$life<100) rw$life=100
                    cat("Player: Life:",rw$life,"Attack:",rw$att,"Defence:",rw$def,"Key:",rw$key,"\n")
                    ditu[rw$x,rw$y]="@"
                    ditu[rw$x+1,rw$y]="."
                  }
                    if(ditu[rw$x,rw$y]=="F"){
                      rw$life=rw$life+10
                      if(rw$life>120) rw$life=120
                      cat("Player: Life:",rw$life,"Attack:",rw$att,"Defence:",rw$def,"Key:",rw$key,"\n")
                      ditu[rw$x,rw$y]="@"
                      ditu[rw$x+1,rw$y]="."
                    }
                      if(ditu[rw$x,rw$y]=="W"){
                        rw$att=rw$att+2
                        cat("Player: Life:",rw$life,"Attack:",rw$att,"Defence:",rw$def,"Key:",rw$key,"\n")
                        ditu[rw$x,rw$y]="@"
                        ditu[rw$x+1,rw$y]="."
                      }
                        if(ditu[rw$x,rw$y]=="H"){
                          rw$def=rw$def+1
                          cat("Player: Life:",rw$life,"Attack:",rw$att,"Defence:",rw$def,"Key:",rw$key,"\n")
                          ditu[rw$x,rw$y]="@"
                          ditu[rw$x+1,rw$y]="."
                        }
                          if(ditu[rw$x,rw$y]=="n" || ditu[rw$x,rw$y]=="m" || ditu[rw$x,rw$y]=="M" || ditu[rw$x,rw$y]=="G"){
                            fight()->f
                            if(f[1]=="y"){
                              ditu[rw$x,rw$y]="@"
                              ditu[rw$x+1,rw$y]="."
                            } else{
                              if(f[2]<=0) break;
                              mditu[rw$x,rw$y]=f[1]
                              rw$life=f[2]
                              rw$x=rw$x+1
                            }
                          }
            }
  }
  # ===
  if(a=="s" || a=="S"){
    rw$x=rw$x+1
    if(rw$x>q && rw$y==1){
      q=floor(runif(1,min=3,max=21))
      w=floor(runif(1,min=3,max=21))
      ditu=SC(q,w)
      mditu=ditu
      mditu[ditu=="n"]<-"10"
      mditu[ditu=="m"]<-"20"
      mditu[ditu=="M"]<-"40"
      mditu[ditu=="G"]<-"50"
      pt(q=q,w=w,ditu=ditu)
      rw$x=1
      rw$y=1
      rw$f=rw$f+1
    }
      if(rw$x>q && rw$y==w){
        q=floor(runif(1,min=3,max=21))
        w=floor(runif(1,min=3,max=21))
        ditu=SC(q,w)
        mditu=ditu
        mditu[ditu=="n"]<-"10"
        mditu[ditu=="m"]<-"20"
        mditu[ditu=="M"]<-"40"
        mditu[ditu=="G"]<-"50"
        pt(q=q,w=w,ditu=ditu)
        rw$x=1
        rw$y=1
        rw$f=rw$f+1
      }
        if(rw$x>q) rw$x=rw$x-1 else{
          if(ditu[rw$x,rw$y]=="."){
            ditu[rw$x,rw$y]="@"
            ditu[rw$x-1,rw$y]="."
          }
            if(ditu[rw$x,rw$y]=="# ") rw$x=rw$x-1
              if(ditu[rw$x,rw$y]=="+"){
                if(rw$key<=0){rw$x=rw$x-1
                cat("No key.\n")
                } else{
                  rw$key=rw$key-1
                  cat("Player: Life:",rw$life,"Attack:",rw$att,"Defence:",rw$def,"Key:",rw$key,"\n")
                  ditu[rw$x,rw$y]="@"
                  ditu[rw$x-1,rw$y]="."
                }
              }
                if(ditu[rw$x,rw$y]=="1"){
                  rw$key=rw$key+1
                  cat("Player: Life:",rw$life,"Attack:",rw$att,"Defence:",rw$def,"Key:",rw$key,"\n")
                  ditu[rw$x,rw$y]="@"
                  ditu[rw$x-1,rw$y]="."
                }
                  if(ditu[rw$x,rw$y]=="C"){
                    if(rw$life<100) rw$life=100
                    cat("Player: Life:",rw$life,"Attack:",rw$att,"Defence:",rw$def,"Key:",rw$key,"\n")
                    ditu[rw$x,rw$y]="@"
                    ditu[rw$x-1,rw$y]="."
                  }
                    if(ditu[rw$x,rw$y]=="F"){
                      rw$life=rw$life+10
                      if(rw$life>120) rw$life=120
                      cat("Player: Life:",rw$life,"Attack:",rw$att,"Defence:",rw$def,"Key:",rw$key,"\n")
                      ditu[rw$x,rw$y]="@"
                      ditu[rw$x-1,rw$y]="."
                    }
                      if(ditu[rw$x,rw$y]=="W"){
                        rw$att=rw$att+2
                        cat("Player: Life:",rw$life,"Attack:",rw$att,"Defence:",rw$def,"Key:",rw$key,"\n")
                        ditu[rw$x,rw$y]="@"
                        ditu[rw$x-1,rw$y]="."
                      }
                        if(ditu[rw$x,rw$y]=="H"){
                          rw$def=rw$def+1
                          cat("Player: Life:",rw$life,"Attack:",rw$att,"Defence:",rw$def,"Key:",rw$key,"\n")
                          ditu[rw$x,rw$y]="@"
                          ditu[rw$x-1,rw$y]="."
                        }
                          if(ditu[rw$x,rw$y]=="n" || ditu[rw$x,rw$y]=="m" || ditu[rw$x,rw$y]=="M" || ditu[rw$x,rw$y]=="G"){
                            fight()->f
                            if(f[1]=="y"){
                              ditu[rw$x,rw$y]="@"
                              ditu[rw$x-1,rw$y]="."
                            } else{
                              if(f[2]<=0) break;
                              mditu[rw$x,rw$y]=f[1]
                              rw$life=f[2]
                              rw$x=rw$x-1
                            }
                          }
            }
  }
  # ===
  if(a=="a" || a=="A"){
    rw$y=rw$y-1
    if(rw$y<=0) rw$y=rw$y+1 else{
      if(ditu[rw$x,rw$y]=="."){
        ditu[rw$x,rw$y]="@"
        ditu[rw$x,rw$y+1]="."
      }
        if(ditu[rw$x,rw$y]=="# ") rw$y=rw$y+1 else
          if(ditu[rw$x,rw$y]=="+"){
            if(rw$key<=0){rw$y=rw$y+1
            cat("No key.\n")
            } else{
              rw$key=rw$key-1
              cat("Player: Life:",rw$life,"Attack:",rw$att,"Defence:",rw$def,"Key:",rw$key,"\n")
              ditu[rw$x,rw$y]="@"
              ditu[rw$x,rw$y+1]="."
            }
          }
            if(ditu[rw$x,rw$y]=="1"){
              rw$key=rw$key+1
              cat("Player: Life:",rw$life,"Attack:",rw$att,"Defence:",rw$def,"Key:",rw$key,"\n")
              ditu[rw$x,rw$y]="@"
              ditu[rw$x,rw$y+1]="."
            }
              if(ditu[rw$x,rw$y]=="C"){
                if(rw$life<100) rw$life=100
                cat("Player: Life:",rw$life,"Attack",rw$att,"Defence",rw$def,"Key",rw$key,"\n")
                ditu[rw$x,rw$y]="@"
                ditu[rw$x,rw$y+1]="."
              }
                if(ditu[rw$x,rw$y]=="F"){
                  rw$life=rw$life+10
                  if(rw$life>120) rw$life=120
                  cat("Player: Life:",rw$life,"Attack:",rw$att,"Defence:",rw$def,"Key:",rw$key,"\n")
                  ditu[rw$x,rw$y]="@"
                  ditu[rw$x,rw$y+1]="."
                }
                  if(ditu[rw$x,rw$y]=="W"){
                    rw$att=rw$att+2
                    cat("Player: Life:",rw$life,"Attack:",rw$att,"Defence:",rw$def,"Key:",rw$key,"\n")
                    ditu[rw$x,rw$y]="@"
                    ditu[rw$x,rw$y+1]="."
                  }
                    if(ditu[rw$x,rw$y]=="H"){
                      rw$def=rw$def+1
                      cat("Player: Life:",rw$life,"Attack:",rw$att,"Defence:",rw$def,"Key:",rw$key,"\n")
                      ditu[rw$x,rw$y]="@"
                      ditu[rw$x,rw$y+1]="."
                    }
                      if(ditu[rw$x,rw$y]=="n" || ditu[rw$x,rw$y]=="m" || ditu[rw$x,rw$y]=="M" || ditu[rw$x,rw$y]=="G"){
                        fight()->f
                        if(f[1]=="y"){
                          ditu[rw$x,rw$y]="@"
                          ditu[rw$x,rw$y+1]="."
                        } else{
                          if(f[2]<=0) break;
                          mditu[rw$x,rw$y]=f[1]
                          rw$life=f[2]
                          rw$y=rw$y+1
                        }
                      }
    }
  }
  # ===
  if(a=="d" || a=="D"){
    rw$y=rw$y+1
    if(rw$y>w) rw$y=rw$y-1 else{
      if(ditu[rw$x,rw$y]=="."){
        ditu[rw$x,rw$y]="@"
        ditu[rw$x,rw$y-1]="."
      }
        if(ditu[rw$x,rw$y]=="# ") rw$y=rw$y-1
          if(ditu[rw$x,rw$y]=="+"){
            if(rw$key<=0){rw$y=rw$y-1
            cat("No key.\n")
            } else{
              rw$key=rw$key-1
              cat("Player: Life:",rw$life,"Attack:",rw$att,"Defence:",rw$def,"Key:",rw$key,"\n")
              ditu[rw$x,rw$y]="@"
              ditu[rw$x,rw$y-1]="."
            }
          }
            if(ditu[rw$x,rw$y]=="1"){
              rw$key=rw$key+1
              cat("Player: Life:",rw$life,"Attack:",rw$att,"Defence:",rw$def,"Key:",rw$key,"\n")
              ditu[rw$x,rw$y]="@"
              ditu[rw$x,rw$y-1]="."
            }
              if(ditu[rw$x,rw$y]=="C"){
                if(rw$life<100) rw$life=100
                cat("Player: Life:",rw$life,"Attack:",rw$att,"Defence:",rw$def,"Key:",rw$key,"\n")
                ditu[rw$x,rw$y]="@"
                ditu[rw$x,rw$y-1]="."
              }
                if(ditu[rw$x,rw$y]=="F"){
                  rw$life=rw$life+10
                  if(rw$life>120) rw$life=120
                  cat("Player: Life:",rw$life,"Attack:",rw$att,"Defence:",rw$def,"Key:",rw$key,"\n")
                  ditu[rw$x,rw$y]="@"
                  ditu[rw$x,rw$y-1]="."
                }
                  if(ditu[rw$x,rw$y]=="W"){
                    rw$att=rw$att+2
                    cat("Player: Life:",rw$life,"Attack:",rw$att,"Defence:",rw$def,"Key:",rw$key,"\n")
                    ditu[rw$x,rw$y]="@"
                    ditu[rw$x,rw$y-1]="."
                  }
                    if(ditu[rw$x,rw$y]=="H"){
                      rw$def=rw$def+1
                      cat("Player: Life:",rw$life,"Attack",rw$att,"Defence",rw$def,"Key",rw$key,"\n")
                      ditu[rw$x,rw$y]="@"
                      ditu[rw$x,rw$y-1]="."
                    }
                      if(ditu[rw$x,rw$y]=="n" || ditu[rw$x,rw$y]=="m" || ditu[rw$x,rw$y]=="M" || ditu[rw$x,rw$y]=="G"){
                        fight()->f
                        if(f[1]=="y"){
                          ditu[rw$x,rw$y]="@"
                          ditu[rw$x,rw$y-1]="."
                        } else{
                          if(f[2]<=0) break;
                          mditu[rw$x,rw$y]=f[1]
                          rw$life=f[2]
                          rw$y=rw$y-1
                        }
                      }
    }
  }
  pt(q,w,ditu)
}
cat("Player has explored ",rw$f," floors.\n")
cat("The END.\n")


R

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!