Scala - 小项目 - 奥特曼打小怪兽

一、项目描述

奥特曼 1个
   名字
   血量
   普通  必杀 一次只能打1只
   魔法       所有
   奥特曼的攻击 10%必杀 30%魔法 60%普攻
    
   小怪兽 4只
   名字
   血量
   普通  
  
   回合制游戏
   示例输出:
======== 第1回合 ========
(aa奥特曼,血量:100)
	使用魔法,攻击了b1小怪兽,小怪兽血量:80
	使用魔法,攻击了b2小怪兽,小怪兽血量:80
	使用魔法,攻击了b3小怪兽,小怪兽血量:80
	使用魔法,攻击了b4小怪兽,小怪兽血量:80
(b1小怪兽,血量:80)
	使用普攻,攻击了aa奥特曼,奥特曼血量:95
(b2小怪兽,血量:80)
	使用普攻,攻击了aa奥特曼,奥特曼血量:90
(b3小怪兽,血量:80)
	使用普攻,攻击了aa奥特曼,奥特曼血量:85
(b4小怪兽,血量:80)
	使用普攻,攻击了aa奥特曼,奥特曼血量:80

  
   奥特曼血量为0,小怪兽胜利
   所有的小怪兽都死了,奥特曼胜利

   奥特曼 普攻、必杀、魔法只能攻击存活的小怪兽,且普攻、必杀随机攻击存活的小怪兽
   奥特曼、小怪兽 血量不能小与0

二、代码

2.1 AMan.scala

// AMan.scala

package Practice.AplayB

import scala.collection.mutable.ListBuffer
import scala.util.Random

class AMan (val name2:String = "aa", val live2: Int = 100) {
  val name = name2
  var live = live2
  var x: Int = 40 // 普攻
  var y: Int = 100 // 必杀
  var z: Int = 20 // 魔法
  def this(name2: String, live2: Int, x2: Int, y2: Int, z2: Int) {
    this(name2, live2) //必须调用this()
    x = x2
    y = y2
    z = z2
  }
  def playB(lst: List[BMan]): Boolean = {
    var idlist = ListBuffer[Int]()
    for(i <- 0 until  lst.length){
      if(lst(i).live > 0){
        idlist.append(i)
      }
    }
    if(idlist.length == 0){
      return true
    }
    val t = Random.nextInt(idlist.length) // [0, idlist.length)
    val bd = idlist(t) //要攻击的B的下标
    val d = Random.nextInt(10) //[0, 10)
    if(d < 6){ // 60%可能性普攻
      lst(bd).live -= x
      if(lst(bd).live < 0){
        lst(bd).live = 0
      }
      printf("\t使用普攻,攻击了%s小怪兽,小怪兽血量:%d\n", lst(bd).name, lst(bd).live)
    }
    else if(d < 9){ // 30%可能性魔法
      for(x <- lst){
        if(x.live > 0){
          x.live -= z
          if(x.live < 0){
            x.live = 0
          }
          printf("\t使用魔法,攻击了%s小怪兽,小怪兽血量:%d\n", x.name, x.live)
        }
      }
    }
    else { // 10%可能性必杀
      lst(bd).live -= y
      if(lst(bd).live < 0){
        lst(bd).live = 0
      }
      printf("\t使用必杀,攻击了%s小怪兽,小怪兽血量:%d\n", lst(bd).name, lst(bd).live)
    }
    false
  }
}

2.2 BMan.scala

// BMan.scala

package Practice.AplayB

class BMan (name2: String, live2: Int = 100) {
  val name = name2
  var live = live2
  var x = 10
  def this(name2: String, live2: Int, x2: Int) {
    this(name2, live2)
    x = x2
  }
  def playA(a: AMan): Boolean = {
    if(a.live <= 0){
      return true
    }
    a.live -= x
    if(a.live < 0){
      a.live = 0
    }
    printf("\t使用普攻,攻击了%s奥特曼,奥特曼血量:%d\n", a.name, a.live)
    false
  }
}

2.3 Test.scala

// Test.scala

package Practice.AplayB

import scala.util.control.Breaks._

object Test {
  def main(args: Array[String]): Unit = {
    var aa = new AMan("aa", 100)
    var b1 = new BMan("b1", 100, 5)
    var b2 = new BMan("b2", 100, 5)
    var b3 = new BMan("b3", 100, 5)
    var b4 = new BMan("b4", 100, 5)
    val lst = List(b1, b2, b3, b4)
    var k = 1
    breakable(
      while(true){
        printf("======== 第%d回合 ========\n", k)
        k += 1
        println(aa.name + "奥特曼", "血量:" + aa.live)
        if(aa.live > 0){
          aa.playB(lst)
        }
        for(x <- lst){
          println(x.name + "小怪兽", "血量:" + x.live)
          if(x.live > 0){
            x.playA(aa)
          }
        }
        if(aa.live == 0){
          println("小怪兽胜利了")
          break()
        }
        var tmp = false
        for(x <- lst){
          if(x.live > 0){
            tmp = true
          }
        }
        if(tmp == false){
          println("奥特曼胜利了")
          break()
        }
        println()
      }
    )
  }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章