2014年12月3日水曜日

[swift]テキストRPGをswiftの練習がてら作ってみようと思った - 4

前回のまでを整理して、戦士と洞窟のクラスを変更しました。
洞窟は、一人だけでなく、複数の戦士の挑戦を受け入れます。
帰り道は冗長なので省略されました。

■戦士
public class Warrior{
    var name:String
    var hp:(Int,Int) // 現在のHP/HPの最大値
    var location:Int // 洞窟での位置
    
    public init(name:String,hpMax:Int){
        self.name=name
        self.hp=(hpMax,hpMax)
        self.location=0
    }
    
    public func isDead()->Bool{
        return (hp.0 <= 0)
    }
    
    public func walk(){
        
    }
    
    public func recoverFull(){
        hp.0=hp.1
    }
    
    public func recover(val:Int){
        if(hp.0 < hp.1){
            hp.0+=val
            if(hp.0 > hp.1){hp.0=hp.1}
        }
    }
    
    public func damage(val:Int)->Bool{
        if(hp.0 > 0){
            hp.0-=val
            if(hp.0 < 0){
                hp.0=0
                return false
            }
        }
        return true
    }


}


■洞窟

public class Cave{
    var name:String
    var item:String
    var size:Int
    var players:NSMutableArray;
    
    public init(name:String,size:Int,item:String){
        self.name=name
        self.size=size
        self.item=item
        self.players=[];
    }
    
    public func addPlayer(player:Warrior){
        player.location=0;
        self.players.addObject(player)
        print("\(player.name)\(name)の探索を始める\n")
    }
    
    public func step(){
        for a in players{ //ここがうまくない、下と一行で書きたい
            var player:Warrior=a as Warrior;
            var rand = arc4random()%100
            if(rand>90){
                player.damage(60)
                player.location+=2;
                println("\(player.name)は、罠にはまって大ダメージ!(HP:\(player.hp))")
            }else if(rand>60){
                player.damage(2)
                player.location+=2;
                println("\(player.name)が歩く(HP:\(player.hp))")
            }else if(rand>30){
                player.damage(6)
                player.location+=6;
                println("\(player.name)は走った(HP:\(player.hp))")
            }else{
                player.recover(6)
                println("\(player.name)は少し休んだ(HP:\(player.hp))")
            }
            
            if(player.isDead()){
                println("\(player.name)は死んでしまった(HP:\(player.hp))")
                players.removeObject(player)
            } else if(player.location>=size){
                player.recoverFull();
                println("\(player.name)\(item)を手に入れた。(HP:\(player.hp))")
                println("\(player.name)\(name)から出た")
                players.removeObject(player)

            }
        }
    }
    

}


■起動部分

    func testTextRPG() {
        var warrior:Warrior=Warrior(name: "アルテア", hpMax: 100)
        var warrior2:Warrior=Warrior(name: "カルテ", hpMax: 80)
        var cave:Cave=Cave(name: "泉の洞窟", size: 30, item: "泉の水")
        cave.addPlayer(warrior)
        cave.addPlayer(warrior2)
        
        for(var i=0;i<100000;i++){
            cave.step()
        }

    }

■Story
どちらが先に泉の水を手にいれるか、お互いの誇りをかけて戦士アルテアとカルテは洞窟に挑む。

アルテアは泉の洞窟の探索を始める
カルテは泉の洞窟の探索を始める
アルテアが歩く(HP:(98, 100))
カルテは少し休んだ(HP:(80, 80))
アルテアが歩く(HP:(96, 100))
カルテは走った(HP:(74, 80))
アルテアが歩く(HP:(94, 100))
カルテは走った(HP:(68, 80))
アルテアは少し休んだ(HP:(100, 100))
カルテは少し休んだ(HP:(74, 80))
アルテアは少し休んだ(HP:(100, 100))
カルテは少し休んだ(HP:(80, 80))
アルテアは少し休んだ(HP:(100, 100))
カルテは走った(HP:(74, 80))
アルテアは少し休んだ(HP:(100, 100))
カルテは走った(HP:(68, 80))
アルテアは走った(HP:(94, 100))
カルテは走った(HP:(62, 80))
カルテが泉の水を手に入れた。(HP:(80, 80))
カルテは泉の洞窟から出た
アルテアは少し休んだ(HP:(100, 100))
アルテアが歩く(HP:(98, 100))
アルテアは、罠にはまって大ダメージ!(HP:(38, 100))
アルテアは走った(HP:(32, 100))
アルテアは走った(HP:(26, 100))
アルテアは走った(HP:(20, 100))
アルテアが泉の水を手に入れた。(HP:(100, 100))

アルテアは泉の洞窟から出た

今のところ、 ルールは洞窟(フィールド)、戦士のキャラクタはできるだけデータにしていこうと考えてます。