package main import "fmt" type Fighter interface { Attack() (bloodloss int) Defend() } /*cavalry*/ type Rider struct{} func (r *Rider)Attack() (bloodloss int) { fmt.Println ( "iron heel rolling, littered with corpses \ n") return 100 } func (r *Rider)Defend() { fmt.Println ( "Cavalry defense") } /*Archer*/ type Archer struct {} func (a *Archer)Attack() (bloodloss int) { fmt.Println ( "thousand arrows shot! \ n") return 50 } func (a *Archer)Defend() { fmt.Println ( "Archer defense") } / * * Master / type Master struct {} func (a *Master)Attack() (bloodloss int) { fmt.Println ( "Abracadabra cloud flying million soldiers! \ n") return 50 } func (a *Master)Defend() { fmt.Println ( "Mage defense") } func main() { // Create an army fighters := make([]Fighter, 0) // add a variety of forms to achieve the soldiers fighters = append(fighters, &Rider{}) fighters = append(fighters, &Archer{}) fighters = append(fighters, &Master{}) /* Allowing users to make hair The first representative of cavalry, archers second representative, on behalf of the third Master, 9 = offense, defense = 0, for example: 999 = all offensive 000 = the entire defense 090 = archer attack, other branches of the military defense */ was cmd string for { fmt.Println ( "General, please Herald:") fmt.Scan(&cmd) switch cmd { case "exit": goto GAMEOVER case "all offensive": // all offensive for _,fighter := range fighters{ fighter.Attack() } case "all defense": // all defense for _,fighter := range fighters{ fighter.Defend() } default: / * Different branches of the military to perform different commands * / // assert one: /*for _,f := range fighters{ // dispatch cavalry if _,ok := f.(*Rider);ok{ if cmd[0] == '9'{ f.Attack() }else { f.Defend() } } // scheduling archer if _,ok := f.(*Archer);ok{ if cmd[1] == '9'{ f.Attack() }else { f.Defend() } } // Master Scheduling if _,ok := f.(*Master);ok{ if cmd[2] == '9'{ f.Attack() }else { f.Defend() } } }*/ // assert Method Two: 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!") }
Output:
General, please messenger: 000 Cavalry defense Archer defense Mage defense General, please messenger: 999 Iron heel rolling, littered with corpses Thousand arrows shot! Abracadabra cloud flying million soldiers! General, please messenger: 090 Cavalry defense Thousand arrows shot! Mage defense General, please messenger: All offensive Iron heel rolling, littered with corpses Thousand arrows shot! Abracadabra cloud flying million soldiers! General, please messenger: All defensive Cavalry defense Archer defense Mage defense General, please messenger: 909 Iron heel rolling, littered with corpses Archer defense Abracadabra cloud flying million soldiers! General, please messenger: 900 Iron heel rolling, littered with corpses Archer defense Mage defense