package main

import "fmt"

type Fighter interface {
Attack() (bloodloss int)
Defend()
} /*骑兵*/
type Rider struct{}
func (r *Rider)Attack() (bloodloss int) {
fmt.Println("铁蹄滚滚,尸横遍野\n")
return 100
} func (r *Rider)Defend() {
fmt.Println("骑兵防守")
} /*弓箭手*/
type Archer struct {}
func (a *Archer)Attack() (bloodloss int) {
fmt.Println("万箭齐发!\n")
return 50
}
func (a *Archer)Defend() {
fmt.Println("弓箭手防守")
} /*法师*/
type Master struct {}
func (a *Master)Attack() (bloodloss int) {
fmt.Println("天灵灵地灵灵云中飞来百万兵!\n")
return 50
}
func (a *Master)Defend() {
fmt.Println("法师防守")
} func main() {
//创建一支军队
fighters := make([]Fighter, 0) //添加战士的多种实现形态
fighters = append(fighters, &Rider{})
fighters = append(fighters, &Archer{})
fighters = append(fighters, &Master{})
/*
让用户发将令
第一位代表骑兵,第二位代表弓箭手,第三位代表法师,9=进攻,0=防守,例如:
999=全体进攻
000=全体防守
090=弓箭手进攻,其他兵种防守
*/
var cmd string
for {
fmt.Println("大将军,请传令:")
fmt.Scan(&cmd)
switch cmd {
case "exit":
goto GAMEOVER
case "全体进攻":
//全体进攻
for _,fighter := range fighters{
fighter.Attack()
}
case "全体防守":
//全体防守
for _,fighter := range fighters{
fighter.Defend()
}
default:
/*不同兵种执行不同命令*/ //断言方法一:
/*for _,f := range fighters{
//调度骑兵
if _,ok := f.(*Rider);ok{
if cmd[0] == '9'{
f.Attack()
}else {
f.Defend()
}
}
//调度弓箭手
if _,ok := f.(*Archer);ok{
if cmd[1] == '9'{
f.Attack()
}else {
f.Defend()
}
}
//调度法师
if _,ok := f.(*Master);ok{
if cmd[2] == '9'{
f.Attack()
}else {
f.Defend()
}
}
}*/ //断言方法二:
for _,fighter := range fighters{
switch fighter.(type) {
case *Rider:
if cmd[0] == '9'{
fighter.Attack()
}else {
fighter.Defend()
}
case *Archer:
if cmd[1] == '9'{
fighter.Attack()
}else {
fighter.Defend()
}
case *Master:
if cmd[2] == '9'{
fighter.Attack()
}else {
fighter.Defend()
}
}
}
}
} GAMEOVER:
fmt.Println("GAMEOVER!") }

输出:

大将军,请传令:
000
骑兵防守
弓箭手防守
法师防守
大将军,请传令:
999
铁蹄滚滚,尸横遍野 万箭齐发! 天灵灵地灵灵云中飞来百万兵! 大将军,请传令:
090
骑兵防守
万箭齐发! 法师防守
大将军,请传令:
全体进攻
铁蹄滚滚,尸横遍野 万箭齐发! 天灵灵地灵灵云中飞来百万兵! 大将军,请传令:
全体防守
骑兵防守
弓箭手防守
法师防守
大将军,请传令:
909
铁蹄滚滚,尸横遍野 弓箭手防守
天灵灵地灵灵云中飞来百万兵! 大将军,请传令:
900
铁蹄滚滚,尸横遍野 弓箭手防守
法师防守

  

最新文章

  1. jQuery 追加元素的方法如append、prepend、before,after(转)
  2. Web高级征程:《大型网站技术架构》读书笔记系列
  3. PHP-SplDoublyLinkedList
  4. css3图片翻转
  5. 用户管理-------userManage
  6. java的基本认识
  7. Okhttp https
  8. 扩展duilib edit控件的提示功能和多种文字颜色(解决edit为password显示不正常的bug)
  9. JavaWeb基础:HTTP协议和基于Restful的架构
  10. 请添加 MIME 映射
  11. nginx自启动脚本
  12. ASP.net获取当前页面的文件名,参数,域名等方法
  13. Linux指令--文件和目录属性
  14. 我的Scala之路(1):列表List操作
  15. 浏览器 User-Agent 大全
  16. linux上ssh免密登录原理及实现
  17. Django之WSGI 和MVC/MTV
  18. thinkphp 实现rabbitMq常驻进程消费队列
  19. 常用的css3新特性总结
  20. 简单了解Linux的inode与block

热门文章

  1. Windows之磁盘管理
  2. Android的so库注入
  3. Win64 驱动内核编程-30.枚举与删除线程回调
  4. 痞子衡嵌入式:恩智浦i.MX RTxxx系列MCU启动那些事(6.B)- FlexSPI NOR连接方式大全(RT500)
  5. 数据结构之Set | 让我们一块来学习数据结构
  6. Nmap浅析(2)——端口发现
  7. JavaScrip条件表达式优化
  8. 03.28,周六,12:00-17:00,ICPC训练联盟周赛,选用试题:UCF Local Programming Contest 2016正式赛。
  9. 【Web前端HTML5&CSS3】06-盒模型
  10. 透过“锁”事看InnoDB对并发的处理?