学了一段golang,觉得应该实践一下,写了这个猜拳小游戏,顺带着学习下go testing。
testing 源码package mainimport ( "bufio" // 输入输出 "fmt" "math" "math/rand" "os" "strconv" "time")//rock,paper,scissorsconst ( rock int = 1 scissors int = 2 paper int = 3 rockname string = "石头" scissorsname string = "剪刀" papername string = "布" win int = 1 lose int = -1 draw int = 0)// 拳的结构type Finger struct { value int name string}func createFinger(n int) (finger Finger) { switch n { case rock: finger.value = rock finger.name = rockname case scissors: finger.value = scissors finger.name = scissorsname case paper: finger.value = paper finger.name = papername } return}func isAiWin(ai Finger,user Finger) int { result := ai.value - user.value // 如果是石头和布的比较,比较值正负取反 if int(math.Abs(float64(result))) == paper-rock { result = -(result) } if result < 0 { return win } else if result > 0 { return lose } return draw}func randFinger() (finger Finger) { rand := rand.New(rand.NewSource(time.Now().UnixNano())) switch rand.Intn(3) { case 0: finger.value = rock finger.name = rockname case 1: finger.value = scissors finger.name = scissorsname case 2: finger.value = paper finger.name = papername } return}func main() { var aifinger,userFinger Finger reader := bufio.NewReader(os.Stdin) fmt.Printf("请输入你要出的拳:%d->石头,%d->剪刀,%d->布,9->退出\n",rock,scissors,paper) for { data,_,err := reader.Readline() if err != nil { fmt.Println("程序出错") break } input,err := strconv.Atoi(string(data)) if err != nil { fmt.Println("格式不对,请输入数字:",input) continue } if input == 9 { break } switch input { case rock,paper: aifinger = randFinger() fmt.Println("电脑出拳为: ",aifinger.name) userFinger = createFinger(input) fmt.Println("你出拳为: ",userFinger.name) aiWin := isAiWin(aifinger,userFinger) if aiWin == win { fmt.Println("你输了,继续输入:") } else if aiWin == lose { fmt.Println("你赢了,继续输入:") } else { fmt.Println("平局,继续输入:") } default: fmt.Println("输入不合要求,继续输入:") } }}
package mainimport ( "testing" // 加载test包)func TestCreateFinger(t *testing.T) { // 顺带掌握以下struct作为map value的初始化 cases := map[int]Finger{ rock: Finger{rock,rockname},scissors: Finger{scissors,scissorsname},paper: Finger{paper,papername},6: Finger{},// other } for cs,except := range cases { result := createFinger(cs) if result != except { t.Errorf("case %v,except %v,result %v",cs,except,result) } }}func TestIsAiWin(t *testing.T) { // 顺带掌握以下struct作为array element的初始化 cases := [...]struct { cs [2]int except int }{ {[2]int{paper,rock},win},{[2]int{rock,paper},lose},scissors},{[2]int{scissors,{[2]int{paper,draw},} for i := 0; i < len(cases); i++ { cs := cases[i].cs except := cases[i].except result := isAiWin(createFinger(cs[0]),createFinger(cs[1])) if result != except { t.Errorf("case %v,result) } }}
执行预览
请输入你要出的拳:1->石头,2->剪刀,3->布,9->退出3电脑出拳为: 石头你出拳为: 布你赢了,继续输入:2电脑出拳为: 布你出拳为: 剪刀你赢了,继续输入:1电脑出拳为: 石头你出拳为: 石头平局,继续输入:1电脑出拳为: 剪刀你出拳为: 石头你赢了,继续输入:1电脑出拳为: 布你出拳为: 石头你输了,继续输入:9exit code 0,process exited normally.
实践过程中,还是发现诸多问题,例如丢失类型是长出现的问题,例如
cases := [...]struct { cs [2]int except int }{ {[2]int{paper,{{scissors,//原来设想[2]int是可以省略,但是在这里会造语义分析失败,从而丢失cs的数据 }
一些疑问 import分开的话(即中间有空行的话),fmt是不会将之顺序对调,不知道会不会对import产生影响
import ( "bufio" // 输入输出 "os" "fmt" "strconv" "math" "math/rand" "time")
不分开的话,会是这样
import ( "bufio" // 输入输出 "fmt" "math" "math/rand" "os" "strconv" "time")总结
以上是内存溢出为你收集整理的golang学习实例-猜拳小游戏全部内容,希望文章能够帮你解决golang学习实例-猜拳小游戏所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)